/// <summary> /// Update the direction and position of the source after rotating by a given polar and azimuthal angle /// </summary> /// <param name="rotationAnglePair">polar and azimuthal angle angle pair</param> /// <param name="currentDirection">The direction to be updated</param> /// <param name="currentPosition">The position to be updated</param> public static void UpdateDirectionPositionAfterRotatingByGivenAnglePair( PolarAzimuthalAngles rotationAnglePair, ref Direction currentDirection, ref Position currentPosition) { // readability eased with local copies of following double ux = currentDirection.Ux; double uy = currentDirection.Uy; double uz = currentDirection.Uz; double x = currentPosition.X; double y = currentPosition.Y; double z = currentPosition.Z; double cost, sint, cosp, sinp; /* cosine and sine of theta and phi */ cost = Math.Cos(rotationAnglePair.Theta); sint = Math.Sqrt(1.0 - cost * cost); cosp = Math.Cos(rotationAnglePair.Phi); sinp = Math.Sin(rotationAnglePair.Phi); currentDirection.Ux = ux * cost * cosp - uy * sinp + uz * sint * cosp; currentDirection.Uy = ux * cost * sinp + uy * cosp + uz * sint * sinp; currentDirection.Uz = -ux * sint + uz * cost; currentPosition.X = x * cost * cosp - y * sinp + z * sint * cosp; currentPosition.Y = x * cost * sinp + y * cosp + z * sint * sinp; currentPosition.Z = -x * sint + z * cost; }
/// <summary> /// Update the direction and position after beam axis rotation and translation /// </summary> /// <param name="pos">Position</param> /// <param name="dir">Direction</param> /// <param name="sourceAxisRotation">Source Axis Rotation</param> /// <param name="translate">Translation</param> /// <param name="flags">Flags</param> public static void UpdateDirectionPositionAfterGivenFlags( ref Position pos, ref Direction dir, PolarAzimuthalAngles sourceAxisRotation, Position translate, SourceFlags flags) { if (flags.RotationOfPrincipalSourceAxisFlag) { UpdateDirectionPositionAfterRotatingByGivenAnglePair(sourceAxisRotation, ref dir, ref pos); } if (flags.TranslationFromOriginFlag) { pos = UpdatePositionAfterTranslation(pos, translate); } }
/// <summary> /// Provide corresponding Polar Azimuthal Angle pair for a given direction /// </summary> /// <param name="direction">Current direction</param> /// <returns>polar azimuthal angle pair</returns> public static PolarAzimuthalAngles GetPolarAzimuthalPairFromDirection( Direction direction) { if (direction == SourceDefaults.DefaultDirectionOfPrincipalSourceAxis.Clone()) { return(new PolarAzimuthalAngles(0.0, 0.0)); } double x, y, z, r, theta, phi; x = direction.Ux; y = direction.Uy; z = direction.Uz; theta = Math.Acos(z); if ((x != 0.0) || (y != 0.0)) { r = Math.Sqrt(x * x + y * y); if (y >= 0.0) { phi = Math.Acos(x / r); } else { phi = 2 * Math.PI - Math.Acos(x / r); } } else { phi = 0; } PolarAzimuthalAngles polarAzimuthalAngles = new PolarAzimuthalAngles( theta, phi); return(polarAzimuthalAngles); }
/// <summary> /// Update the direction after rotating by given polar and azimuthal angle /// </summary> /// <param name="rotationAnglePair">polar and azimuthal angle pair</param> /// <param name="currentDirection">The direction to be updated</param> /// <returns>direction</returns> public static Direction UpdateDirectionAfterRotatingByGivenAnglePair( PolarAzimuthalAngles rotationAnglePair, Direction currentDirection) { // readability eased with local copies of following double ux = currentDirection.Ux; double uy = currentDirection.Uy; double uz = currentDirection.Uz; double cost, sint, cosp, sinp; /* cosine and sine of theta and phi */ cost = Math.Cos(rotationAnglePair.Theta); sint = Math.Sin(rotationAnglePair.Theta); cosp = Math.Cos(rotationAnglePair.Phi); sinp = Math.Sin(rotationAnglePair.Phi); currentDirection.Ux = ux * cost * cosp - uy * sinp + uz * sint * cosp; currentDirection.Uy = ux * cost * sinp + uy * cosp + uz * sint * sinp; currentDirection.Uz = -ux * sint + uz * cost; return(currentDirection); }