Last active
April 10, 2016 11:17
-
-
Save DomNomNom/0a541709febe0d2c52e76d7cb3d26599 to your computer and use it in GitHub Desktop.
Programming puzzle: Average direction on a circle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def enforce0to360range(angle): | |
| """Converts the given angle (degrees) into the range [0 360). | |
| >>> enforce0to360range(30) | |
| 30.0 | |
| >>> enforce0to360range(180) | |
| 180.0 | |
| >>> enforce0to360range(360) | |
| 0.0 | |
| >>> enforce0to360range(390.0) | |
| 30.0 | |
| >>> enforce0to360range(9001) | |
| 1.0 | |
| >>> enforce0to360range(-30) | |
| 330.0 | |
| >>> enforce0to360range(-390) | |
| 330.0 | |
| >>> enforce0to360range(-9000.5) | |
| 359.5 | |
| """ | |
| return angle % 360.0 # yay, sensible modulo definition in the language | |
| def enforce180to180range(angle): | |
| """Converts the given angle (degrees) into the range (-180 180]. | |
| >>> enforce180to180range(30) | |
| 30.0 | |
| >>> enforce180to180range(180.0) | |
| 180.0 | |
| >>> enforce180to180range(-180) | |
| 180.0 | |
| >>> enforce180to180range(360) | |
| 0.0 | |
| >>> enforce180to180range(390.0) | |
| 30.0 | |
| >>> enforce180to180range(9001) | |
| 1.0 | |
| >>> enforce180to180range(-30) | |
| -30.0 | |
| >>> enforce180to180range(-390) | |
| -30.0 | |
| >>> enforce180to180range(-9000.5) | |
| -0.5 | |
| """ | |
| return -enforce0to360range(180.0-angle) + 180.0 | |
| def circularAverage(angles): | |
| """ Returns the angle that is in the central position around a circle. | |
| Angles are specified in degrees. | |
| >>> enforce0to360range(circularAverage([0, 0, 90])) | |
| 30.0 | |
| >>> enforce0to360range(circularAverage([60, 60, 330])) | |
| 30.0 | |
| >>> enforce0to360range(circularAverage([90, 180, 270])) | |
| 180.0 | |
| >>> abs(enforce180to180range(circularAverage([0, 0, 180]))) # 2/3 towards 0 | |
| 60.0 | |
| >>> abs(enforce180to180range(circularAverage([90, 270]) + 90)) | |
| 90.0 | |
| """ | |
| return 30 # left as an exercise to the reader | |
| if __name__ == '__main__': | |
| import doctest | |
| doctest.testmod() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment