/// <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); }
/// <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); }
/// <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"); }
/// <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); }