Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }