Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
@return: New, rotated vector (L{Vector3d}).
@JSname: I{rotateAround}.
'''
a = self.others(axis, name='axis').unit() # axis being rotated around
c = cos(theta)
b = a.times(1 - c)
s = a.times(sin(theta))
p = self.unit().xyz # point being rotated
# multiply p by a quaternion-derived rotation matrix
return self.classof(fdot(p, a.x * b.x + c, a.x * b.y - s.z, a.x * b.z + s.y),
fdot(p, a.y * b.x + s.z, a.y * b.y + c, a.y * b.z - s.x),
fdot(p, a.z * b.x - s.y, a.z * b.y + s.x, a.z * b.z + c))
@arg theta: The angle of rotation (C{radians}).
@return: New, rotated vector (L{Vector3d}).
@JSname: I{rotateAround}.
'''
a = self.others(axis, name='axis').unit() # axis being rotated around
c = cos(theta)
b = a.times(1 - c)
s = a.times(sin(theta))
p = self.unit().xyz # point being rotated
# multiply p by a quaternion-derived rotation matrix
return self.classof(fdot(p, a.x * b.x + c, a.x * b.y - s.z, a.x * b.z + s.y),
fdot(p, a.y * b.x + s.z, a.y * b.y + c, a.y * b.z - s.x),
fdot(p, a.z * b.x - s.y, a.z * b.y + s.x, a.z * b.z + c))
'''(INTERNAL) Compute the 4-, 6- or 8-th order Krüger Alpha
or Beta series coefficients per Karney 2011, 'Transverse
Mercator with an accuracy of a few nanometers', U{page 7,
equations 35 and 36}.
@arg AB8Ks: 8-Tuple of 8-th order Krüger Alpha or Beta series
coefficient tuples.
@return: Krüger series coefficients (C{.KsOrder}-tuple).
@see: The 30-th order U{TMseries30
}.
'''
k = self.KsOrder
ns = fpowers(self.n, k)
return tuple(fdot(AB8Ks[i][:k-i], *ns[i:]) for i in range(k))
@arg xyz: Local C{(x, y, z)} coordinates (C{3-tuple}).
@arg xyz0: Optional, local C{(x0, y0, z0)} origin (C{3-tuple}).
@return: Unrotated C{(x, y, z)} location (C{3-tuple}).
'''
if xyz0:
if len(xyz0) != len(xyz):
raise LenError(self.unrotate, xyz0=len(xyz0), xyz=len(xyz))
_xyz = (1.0,) + xyz
# x' = x0 + M[0] * x + M[1] * y + M[2] * z
# y' = y0 + M[3] * x + M[4] * y + M[5] * z
# z' = z0 + M[6] * x + M[7] * y + M[8] * z
xyz_ = (fdot(_xyz, xyz0[0], *self[0:3]),
fdot(_xyz, xyz0[1], *self[3:6]),
fdot(_xyz, xyz0[2], *self[6:]))
else:
# x' = M[0] * x + M[1] * y + M[2] * z
# y' = M[3] * x + M[4] * y + M[5] * z
# z' = M[6] * x + M[7] * y + M[8] * z
xyz_ = (fdot(xyz, *self[0:3]),
fdot(xyz, *self[3:6]),
fdot(xyz, *self[6:]))
return xyz_
@arg y: Y coordinate (C{meter}).
@arg z: Z coordinate (C{meter}).
@kwarg inverse: Optional direction, forward or inverse (C{bool}).
@return: A L{Vector3Tuple}C{(x, y, z)}, transformed.
'''
if inverse:
_xyz = -1, -x, -y, -z
_s1 = self.s1 - 2 # == -(1 - s * 1e-6)) == -(1 - (s1 - 1))
else:
_xyz = 1, x, y, z
_s1 = self.s1
# x', y', z' = (.tx + x * .s1 - y * .rz + z * .ry,
# .ty + x * .rz + y * .s1 - z * .rx,
# .tz - x * .ry + y * .rx + z * .s1)
r = Vector3Tuple(fdot(_xyz, self.tx, _s1, -self.rz, self.ry),
fdot(_xyz, self.ty, self.rz, _s1, -self.rx),
fdot(_xyz, self.tz, -self.ry, self.rx, _s1))
return self._xnamed(r)
s = E.e2s2(sa) # r, v = E.roc2_(sa, _F0)
v = a_F0 / sqrt(s) # nu
r = v * E.e12 / s # rho = a_F0 * E.e12 / pow(s, 1.5) == a_F0 * E.e12 / (s * sqrt(s))
vr = v / r # == s / E.e12
x2 = vr - 1 # η2
ta = tan(a)
v3, v5, v7 = fpowers(v, 7, 3) # PYCHOK false!
ta2, ta4, ta6 = fpowers(ta**2, 3) # PYCHOK false!
tar = ta / r
V4 = (a,
tar / ( 2 * v),
tar / ( 24 * v3) * fdot((1, 3, -9), 5 + x2, ta2, ta2 * x2),
tar / (720 * v5) * fdot((61, 90, 45), 1, ta2, ta4))
csa = 1.0 / ca
X5 = (_B0,
csa / v,
csa / ( 6 * v3) * fsum_(vr, ta2, ta2),
csa / ( 120 * v5) * fdot((5, 28, 24), 1, ta2, ta4),
csa / (5040 * v7) * fdot((61, 662, 1320, 720), 1, ta2, ta4, ta6))
d, d2, d3, d4, d5, d6, d7 = fpowers(e - _E0, 7) # PYCHOK false!
a = fdot(V4, 1, -d2, d4, -d6)
b = fdot(X5, 1, d, -d3, d5, -d7)
self._latlon = _LLEB(degrees90(a), degrees180(b), datum=self.datum, name=self.name)
return self._latlon3(LatLon, datum)
tar = ta / r
V4 = (a,
tar / ( 2 * v),
tar / ( 24 * v3) * fdot((1, 3, -9), 5 + x2, ta2, ta2 * x2),
tar / (720 * v5) * fdot((61, 90, 45), 1, ta2, ta4))
csa = 1.0 / ca
X5 = (_B0,
csa / v,
csa / ( 6 * v3) * fsum_(vr, ta2, ta2),
csa / ( 120 * v5) * fdot((5, 28, 24), 1, ta2, ta4),
csa / (5040 * v7) * fdot((61, 662, 1320, 720), 1, ta2, ta4, ta6))
d, d2, d3, d4, d5, d6, d7 = fpowers(e - _E0, 7) # PYCHOK false!
a = fdot(V4, 1, -d2, d4, -d6)
b = fdot(X5, 1, d, -d3, d5, -d7)
self._latlon = _LLEB(degrees90(a), degrees180(b), datum=self.datum, name=self.name)
return self._latlon3(LatLon, datum)
v3, v5, v7 = fpowers(v, 7, 3) # PYCHOK false!
ta2, ta4, ta6 = fpowers(ta**2, 3) # PYCHOK false!
tar = ta / r
V4 = (a,
tar / ( 2 * v),
tar / ( 24 * v3) * fdot((1, 3, -9), 5 + x2, ta2, ta2 * x2),
tar / (720 * v5) * fdot((61, 90, 45), 1, ta2, ta4))
csa = 1.0 / ca
X5 = (_B0,
csa / v,
csa / ( 6 * v3) * fsum_(vr, ta2, ta2),
csa / ( 120 * v5) * fdot((5, 28, 24), 1, ta2, ta4),
csa / (5040 * v7) * fdot((61, 662, 1320, 720), 1, ta2, ta4, ta6))
d, d2, d3, d4, d5, d6, d7 = fpowers(e - _E0, 7) # PYCHOK false!
a = fdot(V4, 1, -d2, d4, -d6)
b = fdot(X5, 1, d, -d3, d5, -d7)
self._latlon = _LLEB(degrees90(a), degrees180(b), datum=self.datum, name=self.name)
return self._latlon3(LatLon, datum)
ta2, ta4 = fpowers(ta, 4, 2) # PYCHOK false!
vsa = v * sa
I4 = (E.b * _F0 * _M(E.Mabcd, a) + _N0,
(vsa / 2) * ca,
(vsa / 24) * ca3 * fsum_(5, -ta2, 9 * x2),
(vsa / 720) * ca5 * fsum_(61, ta4, -58 * ta2))
V4 = (_E0,
(v * ca),
(v / 6) * ca3 * (r - ta2),
(v / 120) * ca5 * fdot((-18, 1, 14, -58), ta2, 5 + ta4, x2, ta2 * x2))
d, d2, d3, d4, d5, d6 = fpowers(b - _B0, 6) # PYCHOK false!
n = fdot(I4, 1, d2, d4, d6)
e = fdot(V4, 1, d, d3, d5)
if Osgr is None:
r = _EasNor2Tuple(e, n)
else:
r = Osgr(e, n, datum=_Datums_OSGB36, **Osgr_kwds)
if lon is None and isinstance(latlon, _LLEB):
r._latlon = latlon # XXX weakref(latlon)?
return _xnamed(r, name)