private static double Magnitude(Point3D point1, Point3D point2) { Point3D vector = new Point3D( point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z); return Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y + vector.Z * vector.Z); }
public static double DistancePointLine(Point3D point, Point3D lineStart, Point3D lineEnd) { double lineMag = Magnitude(lineEnd, lineStart); double u = (((point.X - lineStart.X) * (lineEnd.X - lineStart.X)) + ((point.Y - lineStart.Y) * (lineEnd.Y - lineStart.Y)) + ((point.Z - lineStart.Z) * (lineEnd.Z - lineStart.Z))) / (lineMag * lineMag); if (u < 0.0f || u > 1.0f) return -1; // closest point does not fall within the line segment Point3D intersection = new Point3D( lineStart.X + u * (lineEnd.X - lineStart.X), lineStart.Y + u * (lineEnd.Y - lineStart.Y), lineStart.Z + u * (lineEnd.Z - lineStart.Z)); return Magnitude(point, intersection); }
public double Down(int v, Bitmap bitmap) { Point3D interpolP = new Point3D( vertices[0].X + smallDelta * v - 1, vertices[0].Y, MNTools.GetBitmapValue(vertices[0].X + smallDelta * v - 1, vertices[0].Y, bitmap)); Point3D lineStart = new Point3D( vertices[0].X, vertices[0].Y, MNTools.GetBitmapValue(vertices[0].X, vertices[0].Y, bitmap)); Point3D lineEnd = new Point3D( vertices[3].X, vertices[3].Y, MNTools.GetBitmapValue(vertices[3].X, vertices[3].Y, bitmap)); int signum = POTools.DistanceSignum( new PointF((float)interpolP.X, (float)interpolP.Z), new PointF((float)lineStart.X, (float)lineStart.Z), new PointF((float)lineEnd.X, (float)lineEnd.Z)); return signum * Point3D.DistancePointLine(interpolP, lineStart, lineEnd); }