Пример #1
0
        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);
        }
Пример #2
0
        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);
        }