示例#1
0
        /// <summary>
        /// Create and return a matrix based on given two points
        /// The matrix represents a coordinate system.
        /// </summary>
        /// <param name="origin">Origin of the new coordinate system</param>
        /// <param name="pointOnX">Point on which new X axis lies</param>
        /// <returns>The matrix which represents the co-ordinate system</returns>
        public static Matrix44 GetLCSMatrix(IPoint3D origin, IPoint3D pointOnX)
        {
            //Vector3D localX = GeomOperation.Subtract(pointOnX, origin).Normalize;
            Vector3D localX = GeomOperation.Subtract(pointOnX, origin);
            Vector3D localZ = new Vector3D(0, 0, 1);

            if (GeomOperation.IsCollinear(localZ, localX, MathConstants.ZeroWeak))             //MathConstants.ZeroGeneral))
            {
                // When X is vertical then Z goes in X dir or -X
                //localZ = new Vector3D(0, 1, 0);
                if (localX.DirectionZ > 0)
                {
                    localZ = new Vector3D(-1, 0, 0);
                }
                else
                {
                    localZ = new Vector3D(1, 0, 0);
                }
            }

            //Vector3D localY = (localZ * localX).Normalize;
            //Matrix44 matrix = new Matrix44(origin, localX, localY);
            Vector3D localY = (localZ * localX);

            localZ = (localX * localY).Normalize;
            Matrix44 matrix = new Matrix44(origin, localX.Normalize, localY.Normalize, localZ);

            return(matrix);
        }
示例#2
0
        /// <summary>
        /// Calculate normal of line passing through start and end. Default plane is XY
        /// </summary>
        /// <param name="start">Start point</param>
        /// <param name="end">End point</param>
        /// <returns>Returns the normal</returns>
        private static Vector3D GetNormal(IPoint3D start, IPoint3D end)
        {
            Vector3D localZ = new Vector3D(0, 0, 1);
            Vector3D localX = Subtract(end, start).Normalize;

            if (GeomOperation.IsCollinear(localX, localZ, MathConstants.ZeroGeneral))
            {
                localZ = new Vector3D(0, 1, 0);
            }

            Vector3D localY = localZ * localX;

            return(localX * localY);
        }
示例#3
0
        /// <summary>
        /// Create and return a matrix based on given points
        /// The matrix represents a coordinate system.
        /// </summary>
        /// <param name="origin">Origin of the new coordinate system</param>
        /// <param name="pointOnX">Point on which new X axis lies</param>
        /// <param name="pointInPlane">Third point on the plane</param>
        /// <param name="plane">Specifies pointInPlane is in XY plane or in XZ plane</param>
        /// <returns>Return the matrix which represents the co-ordinate system</returns>
        public static IMatrix44 GetLCSMatrix(IPoint3D origin, IPoint3D pointOnX, IPoint3D pointInPlane, Plane plane)
        {
            // Vector3D localX = GeomOperation.Subtract(pointOnX, origin).Normalize;
            Vector3D localX = GeomOperation.Subtract(pointOnX, origin);
            Vector3D localY = GeomOperation.Subtract(pointInPlane, origin);

            if (GeomOperation.IsCollinear(localY, localX, MathConstants.ZeroGeneral))
            {
                //throw new NotSupportedException("Given points are in a line. Unable to create coordinate system");
                return(null);
            }

            if (plane == Plane.XY)
            {
                //Vector3D localZ = localX * localY;
                //localY = (localZ * localX).Normalize;
                ////TODO localY = localY.Normalize; only
                //Matrix44 matrix = new Matrix44(origin, localX, localY);
                Vector3D localZ = localX * localY;
                localY = (localZ * localX);
                localZ = (localX * localY).Normalize;
                IMatrix44 matrix = new Matrix44(origin, localX.Normalize, localY.Normalize, localZ);
                return(matrix);
            }
            else if (plane == Plane.ZX)
            {
                //Vector3D localZ = (localY * localX).Normalize;
                //Matrix44 matrix = new Matrix44(origin, localX, localZ);
                Vector3D localZ = (localY * localX);
                localY = (localX * localZ).Normalize;
                IMatrix44 matrix = new Matrix44(origin, localX.Normalize, localZ.Normalize, localY);
                return(matrix);
            }

            throw new NotSupportedException("Third point should be either in XY plane or in ZX plane");
        }
示例#4
0
        /// <summary>
        /// Create and return a matrix based on given two points
        /// The matrix represents a coordinate system.
        /// </summary>
        /// <param name="origin">Origin of the new coordinate system</param>
        /// <param name="pointOnX">Point on which new X axis lies</param>
        /// <returns>The matrix which represents the co-ordinate system</returns>
        public static Matrix44 GetLCSMatrix(WM.Point3D origin, WM.Point3D pointOnX)
        {
            Vector3D localX = new Vector3D(pointOnX.X - origin.X, pointOnX.Y - origin.Y, pointOnX.Z - origin.Z);
            Vector3D localZ = new Vector3D(0, 0, 1);

            if (GeomOperation.IsCollinear(localZ, localX, MathConstants.ZeroWeak))             //MathConstants.ZeroGeneral))
            {
                if (localX.DirectionZ > 0)
                {
                    localZ = new Vector3D(-1, 0, 0);
                }
                else
                {
                    localZ = new Vector3D(1, 0, 0);
                }
            }

            Vector3D localY = (localZ * localX);

            localZ = (localX * localY).Normalize;
            Matrix44 matrix = new Matrix44(origin, localX.Normalize, localY.Normalize, localZ);

            return(matrix);
        }