示例#1
0
        public static PointResult2f LineIntersectsRay(IList <Vector2f> line, Vector2f p, Vector2f n, bool reverse = false)
        {
            int count = line.Count;

            for (int i = 0; i < count - 1; i++)
            {
                int I0 = i;
                int I1 = i + 1;

                if (reverse)
                {
                    I0 = count - i - 2;
                    I1 = count - i - 1;
                }

                Vector2f a = line[I0];
                Vector2f b = line[I1];

                float t;
                if (RayIntersectsSegment(p, n, a, b, out t))
                {
                    PointResult2f result = new PointResult2f();
                    result.Hit   = true;
                    result.Point = a + t * (b - a);
                    result.T     = t;
                    result.A     = I0;
                    result.B     = I1;

                    return(result);
                }
            }

            return(PointResult2f.NoHit);
        }
示例#2
0
        public static PointResult2f ClosestPoint(IList <Vector2f> line, Vector2f point)
        {
            float         dist   = float.PositiveInfinity;
            PointResult2f result = new PointResult2f();
            Segment2f     seg;

            int count = line.Count;

            for (int i = 0; i < count - 1; i++)
            {
                int I0 = i;
                int I1 = i + 1;

                seg.A = line[I0];
                seg.B = line[I1];

                float t;
                SegmentIntersections2f.ClosestPointOnSegment(seg, point, out t);

                Vector2f closest = seg.A + (seg.B - seg.A) * t;
                float    d2      = Vector2f.SqrDistance(closest, point);
                if (d2 < dist)
                {
                    result.Hit   = true;
                    result.Point = closest;
                    result.T     = t;
                    result.A     = I0;
                    result.B     = I1;
                    dist         = d2;
                }
            }

            return(result);
        }