Exemple #1
0
        /// <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;
        }
Exemple #2
0
 /// <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);
     }
 }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }