public static Pnt2D CutDirDir([NotNull] Pnt s0, [NotNull] Pnt dir0, [NotNull] Pnt s1, [NotNull] Pnt dir1, out double f) /* * (x1) (a1) (x2) (a2) (x) * ( ) + t*( ) = ( ) + v*( ) ==> ( ) * (y1) (b1) (y2) (b2) (y) * * return : Point2D : lines cut each other at Point (non parallel) * null : lines are parallel * t = square of distance between the parallels */ { Pnt p = s1 - s0; double det = dir0.VectorProduct(dir1); if (Math.Abs(det) > _epsi * (Math.Abs(s0.X) + Math.Abs(s1.X) + Math.Abs(s0.Y) + Math.Abs(s1.Y)) / 1000.0) { f = p.VectorProduct(dir1) / det; return((Pnt2D)(s0 + f * dir0)); } // parallel lines det = dir0.VectorProduct(p); f = (det * det) / dir0.OrigDist2(2); return(null); }
private static bool?GetOnRightSide( [NotNull] SegmentProxy nearestSegment, double nearestFraction, [NotNull] SegmentProxy segmentProxy, double alongFraction, [NotNull] IGeometry baseGeometry) { if (nearestSegment.PartIndex != segmentProxy.PartIndex) { return(null); } SegmentProxy from; SegmentProxy to; if (nearestFraction >= 1) { if (alongFraction > 0) { return(null); } ISegmentProxy next = nearestSegment.GetNextSegment(baseGeometry); if (next == null) { return(null); } if (next.SegmentIndex != segmentProxy.SegmentIndex) { return(null); } from = nearestSegment; to = segmentProxy; } else if (nearestFraction <= 0) { if (alongFraction < 1) { return(null); } ISegmentProxy next = segmentProxy.GetNextSegment(baseGeometry); if (next == null) { return(null); } if (next.SegmentIndex != nearestSegment.SegmentIndex) { return(null); } from = segmentProxy; to = nearestSegment; } else { // unexpected return(null); } Pnt vectorFrom = from.GetEnd(as3D: false) - from.GetStart(as3D: false); Pnt vectorTo = to.GetEnd(as3D: false) - to.GetStart(as3D: false); bool onRightSide = vectorFrom.VectorProduct(vectorTo) > 0; return(onRightSide); }