private void updateCachedVars() { CosPhi = (float)Math.Cos(m_phi); SinPhi = (float)Math.Sin(m_phi); SinPhiShift = (float)Math.Sin(m_phi + Offset); CosPhiShift = (float)Math.Cos(m_phi + Offset); CosRho = (float)Math.Cos(m_rho); SinRho = (float)Math.Sin(m_rho); // update top ILPoint3Df top = ILPoint3Df.normalize(-SinPhi * CosRho, CosPhi * CosRho, SinRho); m_topX = top.X; m_topY = top.Y; m_topZ = top.Z; computeQuadrant(); }
/// <summary> /// rotate the vector, keep length /// </summary> /// <param name="normal">axis as rotation normal</param> /// <param name="angleDeg">angle to move (radian)</param> /// <returns>rotated version of this vector, does not change original vector</returns> public ILPoint3Df Spin(ILPoint3Df normal, float angleDeg) { float a = angleDeg * (float)Math.PI / 180f; float cosa = (float)Math.Cos(a); float sina = (float)Math.Sin(a); normal = ILPoint3Df.normalize(normal); float omincosa = 1 - cosa; ILPoint3Df ret = new ILPoint3Df( (cosa + X * X * omincosa) * normal.X + (X * Y * omincosa - Z * sina) * normal.Y + (X * Z * omincosa + Y * sina) * normal.Z, (Y * X * omincosa + Z * sina) * normal.X + (cosa + Y * Y * omincosa) * normal.Y + (Y * Z * omincosa - X * sina) * normal.Z, (Z * X * omincosa - Y * sina) * normal.X + (Z * Y * omincosa + X * sina) * normal.Y + (cosa + Z * Z * omincosa) * normal.Z); return(ret); }