³ò jÈKc@sKdZddklZlZlZlZlZlZlZl Z l Z l Z l Z l Z ddd„ƒYZd„Zd„Zd„Zd„Zd d d „Zd d „Zd efd„ƒYZdefd„ƒYZedjodddkZdeiƒGHddklZddkZdefd„ƒYZeeiƒi ƒndS(s¶A library class for angles. You can specify either radians or degrees for an angle, and the constructor calculates the other and saves them both. Trig functions are methods in the angle class; the major inverse trig functions are Python functions that return angles. Both 1- and 2-argument versions are included for arctan. >>> arcsin(.866) angle(rad=1.047147, deg=59d59'49.521") >>> arctan2(1, 0) angle(rad=1.570796, deg=90d0'0.000") iÿÿÿÿ( tpitdegreestradianstldexptmodftsintcosttantasintacostatantatan2tanglecBs4eZdZd!d!d„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z!d„Z"d „Z#RS("sA class to deal with angles in their various units. The constructor expects either a radian value (rad=x), a decimal degree value (deg=x), or a degree-minute-second tuple (deg=(d, m, s), but it can have more or fewer components). If the argument name is missing it defaults to radians, unless the value is a tuple, when it defaults to degrees. >>> angle(3.14) angle(rad=3.140000, deg=179d54'31.492") >>> angle(deg=(23, 56, 4, 6)) angle(rad=0.417735, deg=23d56'4.100") >>> angle((30,)) angle(rad=0.523599, deg=30d0'0.000") You can add and subtract angles with each other; you can multiply an angle by a scalar and vice versa; you can divide to angles to get a scalar, and divide an angle by a scalar to get an angle. You can't divide a scalar by an angle. >>> angle(rad=pi) - angle(deg=90) angle(rad=1.570796, deg=90d0'0.000") >>> 1/angle(pi) Traceback (most recent call last): ... TypeError: unsupported operand type(s) for /: 'int' and 'instance' Each trigonometric function has its own method. cCsá|djo0t|tƒot|ƒ}q=t|ƒ}n|djoC|djo&t|tƒot|ƒ}d}qt|ƒ}n|djo)|djo|i||ƒ\}}n|i|ƒ|i|ƒdS(s’Initialize an angle with a value in either radians (default) or degrees. You can specify both, but the values must be compatible (to about 10 decimal places in radians) or you will raise a 'ConflictingAngle' ValueError. See SettleConflict() for details. You can also specify neither, but such an instance will raise an 'Uninitialized' ValueError on any call to getDeg() or getRad(). >>> angle(pi/6, 30) angle(rad=0.523599, deg=29d59'60.000") >>> angle(1.571, 90) Traceback (most recent call last): ... ConflictingAngle: rad = 1.571, deg = 90.0 >>> angle() + angle() Traceback (most recent call last): ... UninitializedAngle N(tNonet isinstancettupletReducetfloattSettleConflicttsetDegtsetRad(tselftradtdeg((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__init__;s     cCse||td}t|ƒtijo$|t|ƒd}t|ƒ}nt||f‚||fS(Ng€f@g@(RtabstConflictingAnglet xThreshholdRR(RRRtxDiff((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR\s cCs ||_dS(N(R(RR((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRescCsG|idjo0|idjo t‚q@t|iƒ|_n|iS(N(RR RtUninitializedAngleR(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytgetDegfs  cCs ||_dS(N(R(RR((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRlscCsG|idjo0|idjo t‚q@t|iƒ|_n|iS(N(RR RRR(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytgetRadms  cCs#d|ii|iƒ|iƒfS(Ns%s(rad=%f, deg=%s)(t __class__t__name__RtToDms(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__repr__uscCst|iƒdƒ}d|S(Nis %dd%d'%.3f"(tExpandR(Rttpn((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR"xscCstd|iƒ|iƒƒS(NR(R R(Rtother((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__add__€scCstd|iƒ|iƒƒS(NR(R R(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__sub__scCs!|i|iƒ|iƒƒdS(N(RR(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__iadd__‡scCs!|i|iƒ|iƒƒdS(N(RR(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__isub__ˆscCstd|iƒ|ƒS(NR(R R(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__mul__ŒscCstd|iƒ|ƒS(NR(R R(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__rmul__scCs|i|iƒ|ƒdS(N(RR(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__imul__scCsFt|tƒot|iƒ|iƒƒSnt|iƒ|ƒSdS(N(RR R(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__div__”scCs|i|iƒ|ƒdS(N(RR(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__idiv__˜scCs |i|ƒS(N(R.(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt __truediv__šscCs|i|ƒdS(N(t__idev__(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt __itruediv__›scCst|iƒ|ƒS(N(R R(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt __floordiv__scCs|i|iƒ|ƒdS(N(RR(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt __ifloordiv__žscCsFt|tƒot|iƒ|iƒƒSnt|iƒ|ƒSdS(N(RR R(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__mod__ scCs|i|iƒ|ƒdS(N(RR(RR&((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__imod__¤scCstd|iƒ ƒS(NR(R R(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__neg__¨scCstd|iƒ ƒS(NR(R R(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__pos__©scCs |iƒS(N(R(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt __float__«scCst|iƒƒS(N(RR(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR¯scCst|iƒƒS(N(RR(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR°scCst|iƒƒS(N(RR(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR±scCsd|iƒS(Ngð?(R(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytsec³scCsd|iƒS(Ngð?(R(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytcsc´scCsd|iƒS(Ngð?(R(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytcotµsN($R!t __module__t__doc__R RRRRRRR#R"R'R(R)R*R+R,R-R.R/R0R2R3R4R5R6R7R8R9RRRR:R;R<(((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR sB!                             cCstdt|ƒƒS(NR(R R(tx((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytarcsin·scCstdt|ƒƒS(NR(R R (R?((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytarccos¸scCstdt|ƒƒS(NR(R R (R?((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytarctan¹scCstdt||ƒƒS(NR(R R (tyR?((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytarctan2ºsigN@cCskg}xKd|jo=t|ƒ\}}|it|ƒƒ||}|d8}q W|i|ƒt|ƒS(s2Expand a number into a base-60 (default) tuple. The first component can be any integer; subsequent ones are base 60. Parameter cLevel counts the accuracy of the representation: it defaults to 2, which gives degrees, minutes and seconds, but it can be more or less. Parameter nBase chooses the base. ii(RtappendtintR(R?tcLeveltnBasetltxF((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR$¼s   cCs9d\}}x&|D]}|||7}||9}qW|S(sZReduce a base-60 (default) tuple to a single number. This is the inverse of Expand(). ggð?(ggð?((R%RHtxSumtxFactortn((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRÍs  RcBs)eZeddƒZd„Zd„ZRS(gð?iàÿÿÿcCsd||f|_dS(Nsrad = %s, deg = %s(tsMsg(RRR((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRÜscCs|iS(N(RN(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyt__str__Ýs(R!R=RRRRO(((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRØs RcBseZRS((R!R=(((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRßst__main__Ns%d tests failed out of %d(t evaluatortanglecommandercBs eZdZd„Zd„ZRS(s%prog 2008.09.04c Cs’ti|ƒ|iiddddddddd d ƒ|iid d dddd ddd dƒ|iiddddddddd dƒdS(s8populate the option parser (self.optParser) with optionss-rs--radtactiont append_consttconsttrtdesttlchPutthelpsoutput radianss-ds--degtdsoutput decimal degreess-bs--b60tbs+output degrees, minutes, seconds in base 60N(RQtoptionst optParsert add_option(R((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyR\ós cCsut|ƒ}xb|iiD]T}|djo |iGHn|djo |iGHn|djo|iƒGHqqWdS(NRVRZR[(t ParseAngletoptRXRRR"(RtsArgtangtch((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pytfunctions     (R!R=tsVersionR\Rd(((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyRRës ((!R>tmathRRRRRRRRRR R R R R@RARBRDR$Rt ValueErrorRRR!tdoctestttestmodtcommander.commanderRQtsysRRtargvtmain(((sr/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/mathlib/angle.pyss"R›