mathnet / mathnet-spatial

Math.NET Spatial
http://spatial.mathdotnet.com
MIT License
376 stars 132 forks source link

MathNet.Spatial.Euclidean.Line3D retruns UnExpected NULL #239

Open ASCmetrology opened 6 months ago

ASCmetrology commented 6 months ago

MathNet.Spatial.Euclidean.Line3D Intersection with Plane returns unexpected NULL:

//------------------------------------ // Immediate below FAILS, expecting (200, ~0, ~0) but receive aPtint = NULL:

                MathNet.Spatial.Euclidean.Point3D LinePt1 = new Point3D(200, 0, 0);
                MathNet.Spatial.Euclidean.Point3D LinePt2 = new Point3D(100, 0, 0);
                Line3D a_Line3D = new Line3D(LinePt1, LinePt2);
                        Ap = -100; Bp = 0; Cp = -3.979039320256561E-13;
                    Vector3D aNormal = new Vector3D(Ap, Bp, Cp);                         
                UnitVector3D aNormalV = aNormal.Normalize();
                Point3D PtOnPlane = new Point3D(200, -100, 100);
                Plane a_Plane = new Plane(PtOnPlane, aNormalV);
                Point3D? aPtint = new Point3D();
                aPtint = a_Line3D.IntersectionWith(a_Plane, 4.9E-324);  //returns unexpected NULL.

//------------------------------------

Below DOES work, receives aPtint = (200, 0, 0);

                MathNet.Spatial.Euclidean.Point3D LinePt1 = new Point3D(200, 0, 0);
                MathNet.Spatial.Euclidean.Point3D LinePt2 = new Point3D(100, 0, 0);
                Line3D a_Line3D = new Line3D(LinePt1, LinePt2);
                    Vector3D aNormal = new Vector3D(-100, 0, 0);
                UnitVector3D aNormalV = aNormal.Normalize();
                Point3D PtOnPlane = new Point3D(200, -100, 100); 
                Plane a_Plane = new Plane(PtOnPlane, aNormalV); 
                Point3D? aPtint = new Point3D();
                aPtint = a_Line3D.IntersectionWith(a_Plane, 4.9E-324);

Notes: _difference in above is changing Cp value from -3.979039320256561E-13 to 0; _modification of error epsilon from 4.9E-324 to 0 etc did not change results. _employing using VS 2017 fully updated; Working as expected for all other code within subject test.

ASCmetrology commented 6 months ago

Apparently reason for listed ~issue is: Line SEGMENT is slightly ~short of penetrating the Plane. We are desiring to determine Plane intersect with INFINITE Line. Method suggestion appreciated.

jkalias commented 6 months ago

Apparently reason for listed ~issue is: Line SEGMENT is slightly ~short of penetrating the Plane. We are desiring to determine Plane intersect with INFINITE Line. Method suggestion appreciated.

I am not really sure I understood your explanation, can you explain it again with other words please?

ASCmetrology commented 6 months ago

Reference the original posted FAILS code: That code returns NULL for the intersection (ie, No Intersect); I suggest This because the LINE is not considered infinite by MathNet. Using Ray3D in-place-of Line3D probably is the solution; However, I suspect would need to check BOTH directions (direct and mirror) of Ray to insure all tested for plane intersect.

jkalias commented 6 months ago

I think the error lies in the implementation of public Point3D? IntersectionWith(Line3D line, double tolerance = float.Epsilon) of Plane.cs, which is identical to public Point3D? IntersectionWith(LineSegment3D line, double tolerance = float.Epsilon) (notice, Line3D vs. LineSegment3D).

As far as I can tell, Spatial treats Ray3D as an infinite (mathematical) line and LineSegment3D as a... segment of a line, with a given start and end.

For my understanding, Line3D should de removed and its usages replaced by Ray3D

Jones-Adam commented 4 months ago

Indeed, Line3D was at one point on the schedule to be deprecated