Ejemplo n.º 1
0
        public void distance_point() {
            var s = new Segment2(Point2.Zero, new Point2(4, 2));

            Assert.Equal(3, s.Distance(new Point2(-3, 0)));
            Assert.Equal(Math.Sqrt(18), s.Distance(new Point2(7, 5)));
            Assert.Equal(Math.Sqrt(5), s.Distance(new Point2(1, 3)));
        }
Ejemplo n.º 2
0
        public void distance_squared_point() {
            var s = new Segment2(new Point2(), new Point2(4, 2));

            Assert.Equal(9, s.DistanceSquared(new Point2(-3, 0)));
            Assert.Equal(18, s.DistanceSquared(new Point2(7, 5)));
            Assert.Equal(5, s.DistanceSquared(new Point2(1, 3)));
        }
Ejemplo n.º 3
0
        public void constructor_copy() {
            var i = new Segment2(new Point2(1, 2), new Point2(4, 5));

            var j = new Segment2(i);

            Assert.Equal(new Point2(1, 2), j.A);
            Assert.Equal(new Point2(4, 5), j.B);
        }
Ejemplo n.º 4
0
 public void equal() {
     var z = new Segment2(new Point2(1, 3), new Point2(2, 5));
     var q = new Segment2(new Point2(1, 3), new Point2(2, 5));
     Assert.Equal(z, q);
     Assert.Equal(q, z);
     q = new Segment2(new Point2(0, 2), new Point2(5, 6));
     Assert.NotEqual(z, q);
     Assert.NotEqual(q, z);
 }
Ejemplo n.º 5
0
        public void intersect_point_test() {
            var s = new Segment2(new Point2(), new Point2(4, 2));

            Assert.False(s.Intersects(new Point2(-3, 0)));
            Assert.False(s.Intersects(new Point2(7, 5)));
            Assert.False(s.Intersects(new Point2(1, 3)));
            Assert.True(s.Intersects(new Point2()));
            Assert.True(s.Intersects(new Point2(4, 2)));
            Assert.True(s.Intersects(new Point2(2, 1)));
        }
        public static void segment_segment_intersection_result()
        {
            var a = new Segment2(A, B);
            var b = new Segment2(C, D);

            var forward = a.Intersection(b);
            var reverse = b.Intersection(a);

            forward.Should().NotBeNull();
            forward.Should().Be(reverse);
        }
        public void intersection_cross_ends() {
            var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
            var b = new Segment2(new Point2(0.5, 1.5), new Point2(1, 1));

            var res = (SegmentIntersectionOperation.PointResult)SegmentIntersectionOperation.IntersectionDetails(a, b);
            Assert.Equal(new Point2(1, 1), res.P);
            Assert.Equal(new Vector2(1, 1), res.Ratios);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Head, res.TypeA);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Head, res.TypeB);

            res = (SegmentIntersectionOperation.PointResult)SegmentIntersectionOperation.IntersectionDetails(b, a);
            Assert.Equal(new Point2(1, 1), res.P);
            Assert.Equal(new Vector2(1, 1), res.Ratios);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Head, res.TypeA);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Head, res.TypeB);
        }
        public static void line_segment_intersection_result()
        {
            var a1 = new Line2(A, B);
            var a2 = new Line2(B, A);
            var b1 = new Segment2(C, D);
            var b2 = new Segment2(D, C);

            var forward1 = a1.Intersection(b1);
            var forward2 = a2.Intersection(b2);
            var reverse1 = b1.Intersection(a1);
            var reverse2 = b2.Intersection(a2);

            forward1.Should().NotBeNull();
            forward1.Should().Be(forward2);
            forward1.Should().Be(reverse1);
            forward1.Should().Be(reverse2);
        }
        public void intersection_same() {
            var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
            var b = new Segment2(new Point2(1, 1), new Point2(0, 0));

            var res = SegmentIntersectionOperation.IntersectionDetails(a, a) as SegmentIntersectionOperation.SegmentResult;
            AreSpatiallyEqual(a, res.S);
            AreSpatiallyEqual(b, res.S);
            Assert.Equal(a.A, res.S.A);
            Assert.Equal(a.B, res.S.B);
            Assert.Equal(new Vector2(0, 0), res.A.Ratios);
            Assert.Equal(new Vector2(1, 1), res.B.Ratios);

            res = SegmentIntersectionOperation.IntersectionDetails(b, b) as SegmentIntersectionOperation.SegmentResult;
            AreSpatiallyEqual(a, res.S);
            AreSpatiallyEqual(b, res.S);
            Assert.Equal(b.A, res.S.A);
            Assert.Equal(b.B, res.S.B);
            Assert.Equal(new Vector2(0, 0), res.A.Ratios);
            Assert.Equal(new Vector2(1, 1), res.B.Ratios);

            res = SegmentIntersectionOperation.IntersectionDetails(a, b) as SegmentIntersectionOperation.SegmentResult;
            AreSpatiallyEqual(a, res.S);
            AreSpatiallyEqual(b, res.S);
            Assert.Equal(a.A, res.S.A);
            Assert.Equal(a.B, res.S.B);
            Assert.Equal(new Vector2(0, 1), res.A.Ratios);
            Assert.Equal(new Vector2(1, 0), res.B.Ratios);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Butt, res.A.TypeA);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Head, res.A.TypeB);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Head, res.B.TypeA);
            Assert.Equal(SegmentIntersectionOperation.SegmentIntersectionType.Butt, res.B.TypeB);

            res = SegmentIntersectionOperation.IntersectionDetails(b, a) as SegmentIntersectionOperation.SegmentResult;
            AreSpatiallyEqual(a, res.S);
            AreSpatiallyEqual(b, res.S);
            Assert.Equal(b.A, res.S.A);
            Assert.Equal(b.B, res.S.B);
            Assert.Equal(new Vector2(0, 1), res.A.Ratios);
            Assert.Equal(new Vector2(1, 0), res.B.Ratios);

        }
 private void AreEqual_ClosestPoints(Ray2D ray, Segment2 segment, Vector2 expected)
 {
     AreEqual_ClosestPoints(ray, segment, expected, expected);
 }
        public void Distance_Diagonal()
        {
            float length  = 3;
            var   ray     = new Ray2D();
            var   segment = new Segment2();

            foreach (var origin in originPoints2)
            {
                foreach (var direction in directionPoints2)
                {
                    Vector2 perpendicular = direction.RotateCW90();
                    ray.origin    = origin;
                    ray.direction = direction;

                    for (int segmentAngle = 15; segmentAngle < 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = direction.RotateCW(segmentAngle);

                        segment.a = origin;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment);
                        segment.a = origin + direction;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment);
                        segment.a = origin - direction;
                        segment.b = segment.a + segmentDirection.RotateCW90() * length;
                        AreEqual_Distance(ray, segment, 1);

                        segment.a = origin + perpendicular;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, 1);
                        segment.a = origin + perpendicular + direction;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, 1);
                        segment.a = origin + perpendicular * 2 + direction;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, 2);
                        segment.a = origin + perpendicular + direction * 2;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, 1);
                        segment.a = origin + perpendicular * 2 + direction * 2;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, 2);

                        segment.a = origin - segmentDirection;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment);
                        segment.a = origin + direction - segmentDirection;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment);
                    }

                    Vector2 diagonal = direction.RotateCW45();
                    for (int segmentAngle = 0; segmentAngle <= 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = diagonal.RotateCW(segmentAngle);
                        segment.a = origin + perpendicular - direction;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, PTUtils.Sqrt2);
                        segment.a = origin + perpendicular * length - direction * length;
                        segment.b = segment.a + segmentDirection * length;
                        AreEqual_Distance(ray, segment, PTUtils.Sqrt2 * length);
                    }

                    segment.a = origin + perpendicular - direction - diagonal * 2;
                    segment.b = segment.a + diagonal * 4;
                    AreEqual_Distance(ray, segment, PTUtils.Sqrt2);
                    segment.a = origin + perpendicular - direction;
                    segment.b = segment.a + diagonal * 4;
                    AreEqual_Distance(ray, segment, PTUtils.Sqrt2);
                    segment.a = origin + perpendicular + direction;
                    segment.b = segment.a + diagonal.RotateCW90() * 4;
                    AreEqual_Distance(ray, segment, 1);
                }
            }
        }
Ejemplo n.º 12
0
 private void AreEqual_ClosestPoints_Point(Segment2 segment1, Segment2 segment2, Vector2 expected)
 {
     AreEqual_ClosestPoints(segment1, segment2, expected, expected, expected, expected);
 }
Ejemplo n.º 13
0
        public void Intersect_Diagonal()
        {
            var segment1 = new Segment2();
            var segment2 = new Segment2();

            foreach (var origin in originPoints2)
            {
                foreach (var direction in directionPoints2)
                {
                    Vector2 perpendicular = direction.RotateCW90();
                    segment1.a = origin;
                    segment1.b = origin + direction * 10;

                    for (int segmentAngle = 15; segmentAngle < 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = direction.RotateCW(segmentAngle);

                        segment2.a = origin;
                        segment2.b = segment2.a + segmentDirection * length;
                        True_IntersectPoint(segment1, segment2, segment2.a);
                        segment2.a = origin + direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        True_IntersectPoint(segment1, segment2, segment2.a);
                        segment2.a = origin - direction;
                        segment2.b = segment2.a + segmentDirection.RotateCW90() * length;
                        False_Intersect(segment1, segment2);

                        segment2.a = origin + perpendicular;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);
                        segment2.a = origin + perpendicular + direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);
                        segment2.a = origin + perpendicular * 2 + direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);
                        segment2.a = origin + perpendicular + direction * 2;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);
                        segment2.a = origin + perpendicular * 2 + direction * 2;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);

                        segment2.a = origin - segmentDirection;
                        segment2.b = segment2.a + segmentDirection * length;
                        True_IntersectPoint(segment1, segment2, origin);
                        segment2.a = origin + direction - segmentDirection;
                        segment2.b = segment2.a + segmentDirection * length;
                        True_IntersectPoint(segment1, segment2, origin + direction);
                    }

                    Vector2 diagonal = direction.RotateCW45();
                    for (int segmentAngle = 0; segmentAngle <= 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = diagonal.RotateCW(segmentAngle);
                        segment2.a = origin + perpendicular - direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);
                        segment2.a = origin + perpendicular * length - direction * length;
                        segment2.b = segment2.a + segmentDirection * length;
                        False_Intersect(segment1, segment2);
                    }

                    segment2.a = origin + perpendicular - direction - diagonal * 2;
                    segment2.b = segment2.a + diagonal * 4;
                    False_Intersect(segment1, segment2);
                    segment2.a = origin + perpendicular - direction;
                    segment2.b = segment2.a + diagonal * 4;
                    False_Intersect(segment1, segment2);
                    segment2.a = origin + perpendicular + direction;
                    segment2.b = segment2.a + diagonal.RotateCW90() * 4;
                    False_Intersect(segment1, segment2);
                }
            }
        }
 /// <summary>
 /// Calculates the intersection between two segments.
 /// </summary>
 /// <param name="a">The first segment.</param>
 /// <param name="b">The second segment.</param>
 /// <returns>The geometry resulting from the intersection.</returns>
 public static IPlanarGeometry Intersection(Segment2 a, Segment2 b)
 {
     return(null == a || null == b
         ? null
         : IntersectionDetails(a, b).Geometry);
 }
        public static bool NetSegmentRayCastMasked(NetSegment mysegment, ushort segmentID, Segment3 ray, float snapElevation, bool bothSides, out float t, out float priority)
        {
            bool lht = false;

            //if (SimulationManager.instance.m_metaData.m_invertTraffic == SimulationMetaData.MetaBool.True) lht = true;
            Debug.Log(mysegment.m_flags);
            if ((mysegment.m_flags & NetSegment.Flags.Invert) != 0)
            {
                lht = true;
            }
            bool    isMasked = false;
            NetInfo info     = mysegment.Info;

            t        = 0f;
            priority = 0f;
            Bounds bounds = mysegment.m_bounds;

            bounds.Expand(16f);
            if (!bounds.IntersectRay(new Ray(ray.a, ray.b - ray.a)))
            {
                return(false);
            }
            NetManager instance = Singleton <NetManager> .instance;
            Bezier3    bezier   = default(Bezier3);

            bezier.a = instance.m_nodes.m_buffer[mysegment.m_startNode].m_position;
            bezier.d = instance.m_nodes.m_buffer[mysegment.m_endNode].m_position;
            bool result = false;

            info.m_netAI.GetRayCastHeights(segmentID, ref mysegment, out float leftMin, out float rightMin, out float max);
            bezier.a.y += max;
            bezier.d.y += max;
            bool flag  = (instance.m_nodes.m_buffer[mysegment.m_startNode].m_flags & NetNode.Flags.Middle) != 0;
            bool flag2 = (instance.m_nodes.m_buffer[mysegment.m_endNode].m_flags & NetNode.Flags.Middle) != 0;

            NetSegment.CalculateMiddlePoints(bezier.a, mysegment.m_startDirection, bezier.d, mysegment.m_endDirection, flag, flag2, out bezier.b, out bezier.c);
            float minNodeDistance = info.GetMinNodeDistance();
            //
            float collisionHalfWidth = info.m_halfWidth;
            float maskHalfWidth      = info.m_pavementWidth;
            //
            float num4 = (int)instance.m_nodes.m_buffer[mysegment.m_startNode].m_elevation;
            float num5 = (int)instance.m_nodes.m_buffer[mysegment.m_endNode].m_elevation;

            if (info.m_netAI.IsUnderground())
            {
                num4 = 0f - num4;
                num5 = 0f - num5;
            }
            num4 += info.m_netAI.GetSnapElevation();
            num5 += info.m_netAI.GetSnapElevation();
            float a    = Mathf.Lerp(minNodeDistance, collisionHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num4) / 12f));
            float b2   = Mathf.Lerp(minNodeDistance, collisionHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num5) / 12f));
            float am   = Mathf.Lerp(minNodeDistance, maskHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num4) / 12f));
            float b2m  = Mathf.Lerp(minNodeDistance, maskHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num5) / 12f));
            float num6 = Mathf.Min(leftMin, rightMin);

            t        = 1000000f;
            priority = 1000000f;
            Segment3 segment = default(Segment3);

            segment.a = bezier.a;
            Segment2 segment2 = default(Segment2);

            Debug.Log($"mouse ray: {ray.a} --> {ray.b}");
            Debug.Log($"segment direction: {bezier.a} --> {bezier.b}");
            for (int i = 1; i <= 16; i++)
            {
                segment.b = bezier.Position((float)i / 16f);
                float   num7         = ray.DistanceSqr(segment, out float u2, out float v2);
                float   num8         = Mathf.Lerp(a, b2, ((float)(i - 1) + v2) / 16f);
                float   num8m        = Mathf.Lerp(am, b2m, ((float)(i - 1) + v2) / 16f);
                Vector3 vector2      = segment.Position(v2);
                bool    atOffsetSide = bothSides || IsTrafficHandSideOf(segment, ray, u2, lht);
                if (atOffsetSide && num7 < priority && Segment1.Intersect(ray.a.y, ray.b.y, vector2.y, out u2))
                {
                    Vector3 vector3 = ray.Position(u2);
                    num7 = Vector3.SqrMagnitude(vector3 - vector2);
                    //Debug.Log($"num7: {num7}, num8: {num8}, num8m: {num8m}");
                    if (num7 < priority && num7 < num8 * num8)
                    {
                        if (flag && i == 1 && v2 < 0.001f)
                        {
                            Vector3 rhs = segment.a - segment.b;
                            u2 += Mathf.Max(0f, Vector3.Dot(vector3, rhs)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs.sqrMagnitude * ray.LengthSqr()));
                        }
                        if (flag2 && i == 16 && v2 > 0.999f)
                        {
                            Vector3 rhs2 = segment.b - segment.a;
                            u2 += Mathf.Max(0f, Vector3.Dot(vector3, rhs2)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs2.sqrMagnitude * ray.LengthSqr()));
                        }
                        priority = num7;
                        t        = u2;
                        result   = true;
                        if (num7 < num8m * num8m)
                        {
                            isMasked = true;
                        }
                    }
                }
                if (atOffsetSide && num6 < max)
                {
                    float num9 = vector2.y + num6 - max;
                    if (Mathf.Max(ray.a.y, ray.b.y) > num9 && Mathf.Min(ray.a.y, ray.b.y) < vector2.y)
                    {
                        float num10;
                        if (Segment1.Intersect(ray.a.y, ray.b.y, vector2.y, out u2))
                        {
                            segment2.a = VectorUtils.XZ(ray.Position(u2));
                            num10      = u2;
                        }
                        else
                        {
                            segment2.a = VectorUtils.XZ(ray.a);
                            num10      = 0f;
                        }
                        float num11;
                        if (Segment1.Intersect(ray.a.y, ray.b.y, num9, out u2))
                        {
                            segment2.b = VectorUtils.XZ(ray.Position(u2));
                            num11      = u2;
                        }
                        else
                        {
                            segment2.b = VectorUtils.XZ(ray.b);
                            num11      = 1f;
                        }
                        num7 = segment2.DistanceSqr(VectorUtils.XZ(vector2), out u2);
                        if (num7 < priority && num7 < num8 * num8)
                        {
                            u2 = num10 + (num11 - num10) * u2;
                            Vector3 lhs = ray.Position(u2);
                            if (flag && i == 1 && v2 < 0.001f)
                            {
                                Vector3 rhs3 = segment.a - segment.b;
                                u2 += Mathf.Max(0f, Vector3.Dot(lhs, rhs3)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs3.sqrMagnitude * ray.LengthSqr()));
                            }
                            if (flag2 && i == 16 && v2 > 0.999f)
                            {
                                Vector3 rhs4 = segment.b - segment.a;
                                u2 += Mathf.Max(0f, Vector3.Dot(lhs, rhs4)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs4.sqrMagnitude * ray.LengthSqr()));
                            }
                            priority = num7;
                            t        = u2;
                            result   = true;
                            if (num7 < num8m * num8m)
                            {
                                isMasked = true;
                            }
                        }
                    }
                }
                segment.a = segment.b;
            }
            priority = Mathf.Max(0f, Mathf.Sqrt(priority) - collisionHalfWidth);

            if (isMasked)
            {
                result = false;
            }
            return(result);
        }
Ejemplo n.º 16
0
 public void intersection_same() {
     var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
     var b = new Segment2(new Point2(1, 1), new Point2(0, 0));
     var res = a.Intersection(a);
     AreSpatiallyEqual(a, res);
     AreSpatiallyEqual(b, res);
     res = b.Intersection(b);
     AreSpatiallyEqual(a, res);
     AreSpatiallyEqual(b, res);
     res = a.Intersection(b);
     AreSpatiallyEqual(a, res);
     AreSpatiallyEqual(b, res);
     res = b.Intersection(a);
     AreSpatiallyEqual(a, res);
     AreSpatiallyEqual(b, res);
 }
Ejemplo n.º 17
0
 public void perpendicular_not_intersecting() {
     var a = new Segment2(new Point2(0, 1), new Point2(1, 0));
     var b = new Segment2(new Point2(2, 2), new Point2(1, 1));
     var res = a.Intersection(b);
     Assert.Null(res);
     res = b.Intersection(a);
     Assert.Null(res);
 }
Ejemplo n.º 18
0
        public void ray_intersects_test() {
            var a = new Segment2(new Point2(0, -1), new Point2(0, 1));
            var b = new Ray2(new Point2(1, 1), new Vector2(1, 1));
            var c = new Ray2(new Point2(1, 1), new Vector2(-1, -1));
            var d = new Ray2(new Point2(0, 1), new Vector2(0, 1));
            var e = new Ray2(new Point2(0, -1), new Vector2(0, -1));
            var f = new Ray2(new Point2(0, 0), new Vector2(0, 3));

            Assert.False(a.Intersects(b));
            Assert.True(a.Intersects(c));
            Assert.False(a.Intersects(new Ray2(new Point2(0, 2), new Vector2(0, 1))));
            Assert.False(a.Intersects(new Ray2(new Point2(0, -2), new Vector2(0, -1))));
            Assert.True(a.Intersects(d));
            Assert.True(a.Intersects(d.GetReverse()));
            Assert.True(a.Intersects(e));
            Assert.True(a.Intersects(e.GetReverse()));
            Assert.True(a.Intersects(f));
            Assert.True(a.Intersects(f.GetReverse()));
        }
Ejemplo n.º 19
0
 public void intersection_overlap() {
     var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
     var b = new Segment2(new Point2(.5, .5), new Point2(2, 2));
     var exp = new Segment2(new Point2(.5, .5), new Point2(1, 1));
     var res = a.Intersection(b);
     Assert.Equal(exp, res);
     res = b.Intersection(a);
     Assert.Equal(exp, res);
 }
Ejemplo n.º 20
0
        public void raw_intersection_result() {
            var a = new Segment2(new Point2(0, -1), new Point2(0, 1));
            var b = new Ray2(new Point2(1, 1), new Vector2(1, 1));
            var c = new Ray2(new Point2(1, 1), new Vector2(-1, -1));
            var d = new Ray2(new Point2(0, 1), new Vector2(0, 1));
            var e = new Ray2(new Point2(0, -1), new Vector2(0, -1));
            var f = new Ray2(new Point2(0, 0), new Vector2(0, 3));

            Assert.Equal(null, a.Intersection(b));
            Assert.Equal(new Point2(0, 0), a.Intersection(c));
            Assert.Equal(null, a.Intersection(new Ray2(new Point2(0, 2), new Vector2(0, 1))));
            Assert.Equal(null, a.Intersection(new Ray2(new Point2(0, -2), new Vector2(0, -1))));
            Assert.Equal(new Point2(0, 1), a.Intersection(d));
            Assert.Equal(a, a.Intersection(d.GetReverse()));
            Assert.Equal(new Point2(0, -1), a.Intersection(e));
            Assert.Equal(a, a.Intersection(e.GetReverse()));
            Assert.Equal(new Segment2(f.P, a.B), a.Intersection(f));
            Assert.Equal(new Segment2(a.A, f.P), a.Intersection(f.GetReverse()));
        }
Ejemplo n.º 21
0
        public void line_intersects_test() {
            var a = new Segment2(new Point2(0, -1), new Point2(0, 1));
            var b = new Line2(new Point2(1, 1), new Vector2(1, 1));
            var c = new Line2(new Point2(1, 1), new Vector2(0, 1));
            var d = new Line2(new Point2(0, 0), new Vector2(0, 1));
            var e = new Line2(new Point2(0, -2), new Vector2(1, 1));

            Assert.True(a.Intersects(b));
            Assert.False(a.Intersects(c));
            Assert.True(a.Intersects(d));
            Assert.False(a.Intersects(e));
        }
Ejemplo n.º 22
0
        public void line_intersection_result() {
            var a = new Segment2(new Point2(0, -1), new Point2(0, 1));
            var b = new Line2(new Point2(1, 1), new Vector2(1, 1));
            var c = new Line2(new Point2(1, 1), new Vector2(0, 1));
            var d = new Line2(new Point2(0, 0), new Vector2(0, 1));

            Assert.Equal(new Point2(0, 0), a.Intersection(b));
            Assert.Equal(null, a.Intersection(c));
            Assert.Equal(a, a.Intersection(d));
        }
 private void IsTrue_Intersect(Ray2D ray, Segment2 segment, out IntersectionRaySegment2 intersection)
 {
     Assert.IsTrue(Geometry.IntersectRaySegment(ray.origin, ray.direction, segment.a, segment.b, out intersection),
                   ray.ToString("F8") + "\n" + segment.ToString("F8"));
 }
Ejemplo n.º 24
0
 public void direction() {
     var u = new Segment2(new Point2(2, 1), new Point2(-1, 3));
     Assert.Equal(new Vector2(-3, 2), u.Direction);
 }
Ejemplo n.º 25
0
 public void constructor_elements() {
     var s = new Segment2(new Point2(0, 0), new Point2(2, 3));
     Assert.Equal(new Point2(0, 0), s.A);
     Assert.Equal(new Point2(2, 3), s.B);
 }
Ejemplo n.º 26
0
        public void magnitude() {
            var s = new Segment2(new Point2(1, 2), new Vector2(3, 4));

            Assert.Equal(Math.Sqrt(9 + 16), s.GetMagnitude());
        }
 private void AreEqual_ClosestPoints(Segment2 segment, Circle2 circle, Vector2 expectedSegmentA, Vector2 expectedSegmentB,
                                     Vector2 expectedCircle)
 {
     AreEqual_ClosestPoints(segment, circle, expectedSegmentA, expectedSegmentB, expectedCircle, expectedCircle);
 }
Ejemplo n.º 28
0
        public void magnitude_squared() {
            var s = new Segment2(new Point2(1, 2), new Vector2(3, 4));

            Assert.Equal(9 + 16, s.GetMagnitudeSquared());
        }
        public static bool RayCast(ref NetSegment mysegment, ushort segmentID, Segment3 ray, float snapElevation, bool nameOnly, out float t, out float priority)
        {
            if (CSUROffset.IsCSUROffset(mysegment.Info.m_netAI.m_info))
            {
                return(NetSegmentRayCastMasked(mysegment, segmentID, ray, -1000f, false, out t, out priority));
            }
            NetInfo info = mysegment.Info;

            t        = 0f;
            priority = 0f;
            if (nameOnly && (mysegment.m_flags & NetSegment.Flags.NameVisible2) == NetSegment.Flags.None)
            {
                return(false);
            }
            Bounds bounds = mysegment.m_bounds;

            bounds.Expand(16f);
            if (!bounds.IntersectRay(new Ray(ray.a, ray.b - ray.a)))
            {
                return(false);
            }
            NetManager instance = Singleton <NetManager> .instance;
            Bezier3    bezier   = default(Bezier3);

            bezier.a = instance.m_nodes.m_buffer[mysegment.m_startNode].m_position;
            bezier.d = instance.m_nodes.m_buffer[mysegment.m_endNode].m_position;
            bool result = false;

            if (nameOnly)
            {
                RenderManager instance2 = Singleton <RenderManager> .instance;
                if (instance2.GetInstanceIndex((uint)(49152 + segmentID), out uint instanceIndex))
                {
                    InstanceManager.NameData nameData = instance2.m_instances[instanceIndex].m_nameData;
                    Vector3   position   = instance2.m_instances[instanceIndex].m_position;
                    Matrix4x4 dataMatrix = instance2.m_instances[instanceIndex].m_dataMatrix2;
                    float     num        = Vector3.Distance(position, ray.a);
                    if (nameData != null && num < 1000f)
                    {
                        float snapElevation2 = info.m_netAI.GetSnapElevation();
                        bezier.a.y += snapElevation2;
                        bezier.d.y += snapElevation2;
                        NetSegment.CalculateMiddlePoints(bezier.a, mysegment.m_startDirection, bezier.d, mysegment.m_endDirection, true, true, out bezier.b, out bezier.c);
                        float   num2   = Mathf.Max(1f, Mathf.Abs(dataMatrix.m33 - dataMatrix.m30));
                        float   d      = num * 0.0002f + 0.05f / (1f + num * 0.001f);
                        Vector2 vector = nameData.m_size * d;
                        float   t2     = Mathf.Max(0f, 0.5f - vector.x / num2 * 0.5f);
                        float   t3     = Mathf.Min(1f, 0.5f + vector.x / num2 * 0.5f);
                        bezier = bezier.Cut(t2, t3);
                        float num3 = bezier.DistanceSqr(ray, out float u, out float _);
                        if (num3 < vector.y * vector.y * 0.25f)
                        {
                            Vector3 b = bezier.Position(u);
                            if (Segment1.Intersect(ray.a.y, ray.b.y, b.y, out u))
                            {
                                num3 = Vector3.SqrMagnitude(ray.Position(u) - b);
                                if (num3 < vector.y * vector.y * 0.25f)
                                {
                                    t      = u;
                                    result = true;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                info.m_netAI.GetRayCastHeights(segmentID, ref mysegment, out float leftMin, out float rightMin, out float max);
                bezier.a.y += max;
                bezier.d.y += max;
                bool flag  = (instance.m_nodes.m_buffer[mysegment.m_startNode].m_flags & NetNode.Flags.Middle) != NetNode.Flags.None;
                bool flag2 = (instance.m_nodes.m_buffer[mysegment.m_endNode].m_flags & NetNode.Flags.Middle) != NetNode.Flags.None;
                NetSegment.CalculateMiddlePoints(bezier.a, mysegment.m_startDirection, bezier.d, mysegment.m_endDirection, flag, flag2, out bezier.b, out bezier.c);
                float minNodeDistance    = info.GetMinNodeDistance();
                float collisionHalfWidth = info.m_netAI.GetCollisionHalfWidth();
                float num4 = (float)(int)instance.m_nodes.m_buffer[mysegment.m_startNode].m_elevation;
                float num5 = (float)(int)instance.m_nodes.m_buffer[mysegment.m_endNode].m_elevation;
                if (info.m_netAI.IsUnderground())
                {
                    num4 = 0f - num4;
                    num5 = 0f - num5;
                }
                num4 += info.m_netAI.GetSnapElevation();
                num5 += info.m_netAI.GetSnapElevation();
                float a    = Mathf.Lerp(minNodeDistance, collisionHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num4) / 12f));
                float b2   = Mathf.Lerp(minNodeDistance, collisionHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num5) / 12f));
                float num6 = Mathf.Min(leftMin, rightMin);
                t        = 1000000f;
                priority = 1000000f;
                Segment3 segment = default(Segment3);
                segment.a = bezier.a;
                for (int i = 1; i <= 16; i++)
                {
                    segment.b = bezier.Position((float)i / 16f);
                    float   num7    = ray.DistanceSqr(segment, out float u2, out float v2);
                    float   num8    = Mathf.Lerp(a, b2, ((float)(i - 1) + v2) / 16f);
                    Vector3 vector2 = segment.Position(v2);
                    if (num7 < priority && Segment1.Intersect(ray.a.y, ray.b.y, vector2.y, out u2))
                    {
                        Vector3 vector3 = ray.Position(u2);
                        num7 = Vector3.SqrMagnitude(vector3 - vector2);
                        if (num7 < priority && num7 < num8 * num8)
                        {
                            if (flag && i == 1 && v2 < 0.001f)
                            {
                                Vector3 rhs = segment.a - segment.b;
                                u2 += Mathf.Max(0f, Vector3.Dot(vector3, rhs)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs.sqrMagnitude * ray.LengthSqr()));
                            }
                            if (flag2 && i == 16 && v2 > 0.999f)
                            {
                                Vector3 rhs2 = segment.b - segment.a;
                                u2 += Mathf.Max(0f, Vector3.Dot(vector3, rhs2)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs2.sqrMagnitude * ray.LengthSqr()));
                            }
                            priority = num7;
                            t        = u2;
                            result   = true;
                        }
                    }
                    if (num6 < max)
                    {
                        float num9 = vector2.y + num6 - max;
                        if (Mathf.Max(ray.a.y, ray.b.y) > num9 && Mathf.Min(ray.a.y, ray.b.y) < vector2.y)
                        {
                            Segment2 segment2 = default(Segment2);
                            float    num10;
                            if (Segment1.Intersect(ray.a.y, ray.b.y, vector2.y, out u2))
                            {
                                segment2.a = VectorUtils.XZ(ray.Position(u2));
                                num10      = u2;
                            }
                            else
                            {
                                segment2.a = VectorUtils.XZ(ray.a);
                                num10      = 0f;
                            }
                            float num11;
                            if (Segment1.Intersect(ray.a.y, ray.b.y, num9, out u2))
                            {
                                segment2.b = VectorUtils.XZ(ray.Position(u2));
                                num11      = u2;
                            }
                            else
                            {
                                segment2.b = VectorUtils.XZ(ray.b);
                                num11      = 1f;
                            }
                            num7 = segment2.DistanceSqr(VectorUtils.XZ(vector2), out u2);
                            if (num7 < priority && num7 < num8 * num8)
                            {
                                u2 = num10 + (num11 - num10) * u2;
                                Vector3 lhs = ray.Position(u2);
                                if (flag && i == 1 && v2 < 0.001f)
                                {
                                    Vector3 rhs3 = segment.a - segment.b;
                                    u2 += Mathf.Max(0f, Vector3.Dot(lhs, rhs3)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs3.sqrMagnitude * ray.LengthSqr()));
                                }
                                if (flag2 && i == 16 && v2 > 0.999f)
                                {
                                    Vector3 rhs4 = segment.b - segment.a;
                                    u2 += Mathf.Max(0f, Vector3.Dot(lhs, rhs4)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs4.sqrMagnitude * ray.LengthSqr()));
                                }
                                priority = num7;
                                t        = u2;
                                result   = true;
                            }
                        }
                    }
                    segment.a = segment.b;
                }
                priority = Mathf.Max(0f, Mathf.Sqrt(priority) - collisionHalfWidth);
            }
            return(result);
        }
Ejemplo n.º 30
0
        public void centroid() {
            var s = new Segment2(new Point2(1, 2), new Vector2(3, 4));

            Assert.Equal(new Point2(1 + (3.0 / 2.0), 2 + (4 / 2)), s.GetCentroid());
        }
Ejemplo n.º 31
0
        public void Distance_Diagonal()
        {
            var segment1 = new Segment2();
            var segment2 = new Segment2();

            foreach (var origin in originPoints2)
            {
                foreach (var direction in directionPoints2)
                {
                    Vector2 perpendicular = direction.RotateCW90();
                    segment1.a = origin;
                    segment1.b = origin + direction * 10;

                    for (int segmentAngle = 15; segmentAngle < 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = direction.RotateCW(segmentAngle);

                        segment2.a = origin;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2);
                        segment2.a = origin + direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2);
                        segment2.a = origin - direction;
                        segment2.b = segment2.a + segmentDirection.RotateCW90() * length;
                        AreEqual_Distance(segment1, segment2, 1);

                        segment2.a = origin + perpendicular;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, 1);
                        segment2.a = origin + perpendicular + direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, 1);
                        segment2.a = origin + perpendicular * 2 + direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, 2);
                        segment2.a = origin + perpendicular + direction * 2;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, 1);
                        segment2.a = origin + perpendicular * 2 + direction * 2;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, 2);

                        segment2.a = origin - segmentDirection;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2);
                        segment2.a = origin + direction - segmentDirection;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2);
                    }

                    Vector2 diagonal = direction.RotateCW45();
                    for (int segmentAngle = 0; segmentAngle <= 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = diagonal.RotateCW(segmentAngle);
                        segment2.a = origin + perpendicular - direction;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, PTUtils.Sqrt2);
                        segment2.a = origin + perpendicular * length - direction * length;
                        segment2.b = segment2.a + segmentDirection * length;
                        AreEqual_Distance(segment1, segment2, PTUtils.Sqrt2 * length);
                    }

                    segment2.a = origin + perpendicular - direction - diagonal * 2;
                    segment2.b = segment2.a + diagonal * 4;
                    AreEqual_Distance(segment1, segment2, PTUtils.Sqrt2);
                    segment2.a = origin + perpendicular - direction;
                    segment2.b = segment2.a + diagonal * 4;
                    AreEqual_Distance(segment1, segment2, PTUtils.Sqrt2);
                    segment2.a = origin + perpendicular + direction;
                    segment2.b = segment2.a + diagonal.RotateCW90() * 4;
                    AreEqual_Distance(segment1, segment2, 1);
                }
            }
        }
 private void False_Intersect(Segment2 segment, Circle2 circle)
 {
     Assert.False(Intersect.SegmentCircle(segment.a, segment.b, circle.center, circle.radius, out _), format, segment, circle);
     Assert.False(Intersect.SegmentCircle(segment.b, segment.a, circle.center, circle.radius, out _), format, segment, circle);
 }
Ejemplo n.º 33
0
 private void AreEqual_ClosestPoints(Segment2 segment1, Segment2 segment2, Vector2 expected1, Vector2 expected2)
 {
     AreEqual_ClosestPoints(segment1, segment2, expected1, expected2, expected2, expected1);
 }
        public static void segment_ray_intersection_result()
        {
            var a1 = new Segment2(A, B);
            var a2 = new Segment2(B, A);
            var b = new Ray2(C, D);

            var forward1 = a1.Intersection(b);
            var forward2 = a2.Intersection(b);
            var reverse1 = b.Intersection(a1);
            var reverse2 = b.Intersection(a2);

            forward1.Should().NotBeNull();
            forward1.Should().Be(forward2);
            forward1.Should().Be(reverse1);
            forward1.Should().Be(reverse2);
        }
Ejemplo n.º 35
0
 private void True_IntersectSegment(Segment2 segment1, Segment2 segment2, Vector2 expectedA, Vector2 expectedB)
 {
     True_IntersectSegment(segment1, segment2, expectedA, expectedB, expectedA, expectedB);
 }
 /// <summary>
 /// Calculates the intersection between two segments.
 /// </summary>
 /// <param name="a">The first segment.</param>
 /// <param name="b">The second segment.</param>
 /// <returns>The detailed result of the intersection.</returns>
 public static IResult IntersectionDetails(Segment2 a, Segment2 b) {
     Contract.Ensures(Contract.Result<IResult>() != null);
     if (null == a || null == b)
         return DefaultNoIntersection;
     return IntersectionDetails(a.A, a.B, b.A, b.B);
 }
        public void Intersect_Diagonal()
        {
            float length  = 3;
            var   ray     = new Ray2D();
            var   segment = new Segment2();

            foreach (var origin in originPoints2)
            {
                foreach (var direction in directionPoints2)
                {
                    Vector2 perpendicular = direction.RotateCW90();
                    ray.origin    = origin;
                    ray.direction = direction;

                    for (int segmentAngle = 15; segmentAngle < 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = direction.RotateCW(segmentAngle);

                        segment.a = origin;
                        segment.b = segment.a + segmentDirection * length;
                        IsTrue_IntersectPoint(ray, segment, segment.a);
                        segment.a = origin + direction;
                        segment.b = segment.a + segmentDirection * length;
                        IsTrue_IntersectPoint(ray, segment, segment.a);
                        segment.a = origin - direction;
                        segment.b = segment.a + segmentDirection.RotateCW90() * length;
                        IsFalse_Intersect(ray, segment);

                        segment.a = origin + perpendicular;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);
                        segment.a = origin + perpendicular + direction;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);
                        segment.a = origin + perpendicular * 2 + direction;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);
                        segment.a = origin + perpendicular + direction * 2;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);
                        segment.a = origin + perpendicular * 2 + direction * 2;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);

                        segment.a = origin - segmentDirection;
                        segment.b = segment.a + segmentDirection * length;
                        IsTrue_IntersectPoint(ray, segment, origin);
                        segment.a = origin + direction - segmentDirection;
                        segment.b = segment.a + segmentDirection * length;
                        IsTrue_IntersectPoint(ray, segment, origin + direction);
                    }

                    Vector2 diagonal = direction.RotateCW45();
                    for (int segmentAngle = 0; segmentAngle <= 180; segmentAngle += 15)
                    {
                        Vector2 segmentDirection = diagonal.RotateCW(segmentAngle);
                        segment.a = origin + perpendicular - direction;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);
                        segment.a = origin + perpendicular * length - direction * length;
                        segment.b = segment.a + segmentDirection * length;
                        IsFalse_Intersect(ray, segment);
                    }

                    segment.a = origin + perpendicular - direction - diagonal * 2;
                    segment.b = segment.a + diagonal * 4;
                    IsFalse_Intersect(ray, segment);
                    segment.a = origin + perpendicular - direction;
                    segment.b = segment.a + diagonal * 4;
                    IsFalse_Intersect(ray, segment);
                    segment.a = origin + perpendicular + direction;
                    segment.b = segment.a + diagonal.RotateCW90() * 4;
                    IsFalse_Intersect(ray, segment);
                }
            }
        }
        public void intersection_within() {
            var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
            var b = new Segment2(new Point2(-.5, -.5), new Point2(2, 2));

            var res = SegmentIntersectionOperation.IntersectionDetails(a, b) as SegmentIntersectionOperation.SegmentResult;
            Assert.Equal(a, res.S);
            Assert.Equal(new Vector2(0, .2), res.A.Ratios);
            Assert.Equal(1, res.B.S);
            Assert.Equal(.6, res.B.T, 10);

            res = SegmentIntersectionOperation.IntersectionDetails(b, a) as SegmentIntersectionOperation.SegmentResult;
            Assert.Equal(a, res.S);
            Assert.Equal(new Vector2(.2, 0), res.A.Ratios);
            Assert.Equal(.6, res.B.S, 10);
            Assert.Equal(1, res.B.T);
        }
        private void IsFalse_Intersect_Perpendicular(Ray2D ray, Vector2 perpendicular, Vector2 offset)
        {
            var segment = new Segment2(-perpendicular + offset, perpendicular + offset);

            IsFalse_Intersect(ray, segment);
        }
Ejemplo n.º 40
0
 public void intersection_cross_ends() {
     var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
     var b = new Segment2(new Point2(0.5, 1.5), new Point2(1, 1));
     var res = a.Intersection(b);
     Assert.Equal(new Point2(1, 1), res);
     res = b.Intersection(a);
     Assert.Equal(new Point2(1, 1), res);
 }
Ejemplo n.º 41
0
 private void AreEqual_ClosestPoint(Segment2 segment, Vector2 point)
 {
     AreEqual_ClosestPoint(segment, point, point);
 }
Ejemplo n.º 42
0
 private void IsTrue_Intersect(Line2 line, Segment2 segment, out IntersectionLineSegment2 intersection)
 {
     Assert.IsTrue(Geometry.IntersectLineSegment(line.origin, line.direction, segment.a, segment.b, out intersection),
                   line.ToString("F8") + "\n" + segment.ToString("F8"));
 }
 protected void DrawSegment(ref Segment2 segment)
 {
     Gizmos.DrawLine(segment.P0, segment.P1);
 }
Ejemplo n.º 44
0
 public void intersection_within() {
     var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
     var b = new Segment2(new Point2(-.5, -.5), new Point2(2, 2));
     var res = a.Intersection(b);
     Assert.Equal(a, res);
     res = b.Intersection(a);
     Assert.Equal(a, res);
 }
 /// <summary>
 /// Calculates the intersection between two segments.
 /// </summary>
 /// <param name="a">The first segment.</param>
 /// <param name="b">The second segment.</param>
 /// <returns>The geometry resulting from the intersection.</returns>
 public static IPlanarGeometry Intersection(Segment2 a, Segment2 b) {
     return null == a || null == b
         ? null
         : IntersectionDetails(a, b).Geometry;
 }
        public static bool Prefix(ref NetSegment __instance, ushort segmentID, Segment3 ray, float snapElevation, bool nameOnly, out float t, out float priority, ref bool __result)
        {
            // NON-STOCK CODE STARTS
            float laneOffset  = 0;
            float startOffset = 0;
            float endOffset   = 0;
            bool  IsCSURSLane = CSURUtil.IsCSURSLane(__instance.Info.m_netAI.m_info, ref laneOffset, ref startOffset, ref endOffset);

            if (CSURUtil.IsCSUROffset(__instance.Info.m_netAI.m_info) && !IsCSURSLane)
            {
                __result = NetSegmentRayCastMasked(__instance, segmentID, ray, -1000f, false, out t, out priority);
                return(false);
            }
            // NON-STOCK CODE ENDS
            NetInfo info = __instance.Info;

            t        = 0f;
            priority = 0f;
            if (nameOnly && (__instance.m_flags & NetSegment.Flags.NameVisible2) == NetSegment.Flags.None)
            {
                __result = false;
                return(false);
            }
            Bounds bounds = __instance.m_bounds;

            bounds.Expand(16f);
            if (!bounds.IntersectRay(new Ray(ray.a, ray.b - ray.a)))
            {
                __result = false;
                return(false);
            }
            NetManager instance = Singleton <NetManager> .instance;
            Bezier3    bezier   = default(Bezier3);

            bezier.a = instance.m_nodes.m_buffer[__instance.m_startNode].m_position;
            bezier.d = instance.m_nodes.m_buffer[__instance.m_endNode].m_position;
            bool result = false;

            if (nameOnly)
            {
                RenderManager instance2 = Singleton <RenderManager> .instance;
                if (instance2.GetInstanceIndex((uint)(49152 + segmentID), out uint instanceIndex))
                {
                    InstanceManager.NameData nameData = instance2.m_instances[instanceIndex].m_nameData;
                    Vector3   position   = instance2.m_instances[instanceIndex].m_position;
                    Matrix4x4 dataMatrix = instance2.m_instances[instanceIndex].m_dataMatrix2;
                    float     num        = Vector3.Distance(position, ray.a);
                    if (nameData != null && num < 1000f)
                    {
                        float snapElevation2 = info.m_netAI.GetSnapElevation();
                        bezier.a.y += snapElevation2;
                        bezier.d.y += snapElevation2;
                        NetSegment.CalculateMiddlePoints(bezier.a, __instance.m_startDirection, bezier.d, __instance.m_endDirection, true, true, out bezier.b, out bezier.c);
                        float   num2   = Mathf.Max(1f, Mathf.Abs(dataMatrix.m33 - dataMatrix.m30));
                        float   d      = num * 0.0002f + 0.05f / (1f + num * 0.001f);
                        Vector2 vector = nameData.m_size * d;
                        float   t2     = Mathf.Max(0f, 0.5f - vector.x / num2 * 0.5f);
                        float   t3     = Mathf.Min(1f, 0.5f + vector.x / num2 * 0.5f);
                        bezier = bezier.Cut(t2, t3);
                        float num3 = bezier.DistanceSqr(ray, out float u, out float _);
                        if (num3 < vector.y * vector.y * 0.25f)
                        {
                            Vector3 b = bezier.Position(u);
                            if (Segment1.Intersect(ray.a.y, ray.b.y, b.y, out u))
                            {
                                num3 = Vector3.SqrMagnitude(ray.Position(u) - b);
                                if (num3 < vector.y * vector.y * 0.25f)
                                {
                                    t      = u;
                                    result = true;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                info.m_netAI.GetRayCastHeights(segmentID, ref __instance, out float leftMin, out float rightMin, out float max);
                bezier.a.y += max;
                bezier.d.y += max;
                bool flag  = (instance.m_nodes.m_buffer[__instance.m_startNode].m_flags & NetNode.Flags.Middle) != NetNode.Flags.None;
                bool flag2 = (instance.m_nodes.m_buffer[__instance.m_endNode].m_flags & NetNode.Flags.Middle) != NetNode.Flags.None;
                NetSegment.CalculateMiddlePoints(bezier.a, __instance.m_startDirection, bezier.d, __instance.m_endDirection, flag, flag2, out bezier.b, out bezier.c);
                // NON-STOCK CODE STARTS
                if (IsCSURSLane)
                {
                    float vehicleLaneNum = CSURUtil.CountCSURSVehicleLanes(info);
                    float otherLaneNum   = CSURUtil.CountCSURSOtherLanes(info);
                    float laneNum        = vehicleLaneNum + otherLaneNum;
                    startOffset = startOffset * 3.75f - laneNum * 1.875f + 1.875f + otherLaneNum * 3.75f;
                    endOffset   = endOffset * 3.75f - laneNum * 1.875f + 1.875f + otherLaneNum * 3.75f;

                    if ((__instance.m_flags & NetSegment.Flags.Invert) != 0)
                    {
                        startOffset = -startOffset;
                        endOffset   = -endOffset;
                    }
                    //EG: before patch: point1-point4 is 1.5*3.75
                    //After patch, point1-point4 is (1 1.3333 1.6667 2)*3.75
                    Vector3 newBezierA    = bezier.a + (new Vector3(__instance.m_startDirection.z, 0, -__instance.m_startDirection.x).normalized) * (startOffset);
                    Vector3 newBezierBDir = VectorUtils.NormalizeXZ(bezier.Tangent(0.333f));
                    Vector3 newBezierB    = bezier.b + (new Vector3(newBezierBDir.z, 0, -newBezierBDir.x).normalized) * (startOffset * 0.667f + endOffset * 0.333f);
                    Vector3 newBezierCDir = VectorUtils.NormalizeXZ(bezier.Tangent(0.667f));
                    Vector3 newBezierC    = bezier.c + (new Vector3(newBezierCDir.z, 0, -newBezierCDir.x).normalized) * (startOffset * 0.333f + endOffset * 0.667f);
                    Vector3 newBezierD    = bezier.d + (new Vector3(-__instance.m_endDirection.z, 0, __instance.m_endDirection.x).normalized) * (endOffset);

                    bezier.a = newBezierA;
                    bezier.b = newBezierB;
                    bezier.c = newBezierC;
                    bezier.d = newBezierD;
                }
                float minNodeDistance    = info.GetMinNodeDistance();
                float collisionHalfWidth = info.m_netAI.GetCollisionHalfWidth();
                float num4 = (float)(int)instance.m_nodes.m_buffer[__instance.m_startNode].m_elevation;
                float num5 = (float)(int)instance.m_nodes.m_buffer[__instance.m_endNode].m_elevation;
                if (info.m_netAI.IsUnderground())
                {
                    num4 = 0f - num4;
                    num5 = 0f - num5;
                }
                num4 += info.m_netAI.GetSnapElevation();
                num5 += info.m_netAI.GetSnapElevation();
                float a    = Mathf.Lerp(minNodeDistance, collisionHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num4) / 12f));
                float b2   = Mathf.Lerp(minNodeDistance, collisionHalfWidth, Mathf.Clamp01(Mathf.Abs(snapElevation - num5) / 12f));
                float num6 = Mathf.Min(leftMin, rightMin);
                t        = 1000000f;
                priority = 1000000f;
                Segment3 segment = default(Segment3);
                segment.a = bezier.a;
                for (int i = 1; i <= 16; i++)
                {
                    segment.b = bezier.Position((float)i / 16f);
                    float   num7    = ray.DistanceSqr(segment, out float u2, out float v2);
                    float   num8    = Mathf.Lerp(a, b2, ((float)(i - 1) + v2) / 16f);
                    Vector3 vector2 = segment.Position(v2);
                    if (num7 < priority && Segment1.Intersect(ray.a.y, ray.b.y, vector2.y, out u2))
                    {
                        Vector3 vector3 = ray.Position(u2);
                        num7 = Vector3.SqrMagnitude(vector3 - vector2);
                        if (num7 < priority && num7 < num8 * num8)
                        {
                            if (flag && i == 1 && v2 < 0.001f)
                            {
                                Vector3 rhs = segment.a - segment.b;
                                u2 += Mathf.Max(0f, Vector3.Dot(vector3, rhs)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs.sqrMagnitude * ray.LengthSqr()));
                            }
                            if (flag2 && i == 16 && v2 > 0.999f)
                            {
                                Vector3 rhs2 = segment.b - segment.a;
                                u2 += Mathf.Max(0f, Vector3.Dot(vector3, rhs2)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs2.sqrMagnitude * ray.LengthSqr()));
                            }
                            priority = num7;
                            t        = u2;
                            result   = true;
                        }
                    }
                    if (num6 < max)
                    {
                        float num9 = vector2.y + num6 - max;
                        if (Mathf.Max(ray.a.y, ray.b.y) > num9 && Mathf.Min(ray.a.y, ray.b.y) < vector2.y)
                        {
                            Segment2 segment2 = default(Segment2);
                            float    num10;
                            if (Segment1.Intersect(ray.a.y, ray.b.y, vector2.y, out u2))
                            {
                                segment2.a = VectorUtils.XZ(ray.Position(u2));
                                num10      = u2;
                            }
                            else
                            {
                                segment2.a = VectorUtils.XZ(ray.a);
                                num10      = 0f;
                            }
                            float num11;
                            if (Segment1.Intersect(ray.a.y, ray.b.y, num9, out u2))
                            {
                                segment2.b = VectorUtils.XZ(ray.Position(u2));
                                num11      = u2;
                            }
                            else
                            {
                                segment2.b = VectorUtils.XZ(ray.b);
                                num11      = 1f;
                            }
                            num7 = segment2.DistanceSqr(VectorUtils.XZ(vector2), out u2);
                            if (num7 < priority && num7 < num8 * num8)
                            {
                                u2 = num10 + (num11 - num10) * u2;
                                Vector3 lhs = ray.Position(u2);
                                if (flag && i == 1 && v2 < 0.001f)
                                {
                                    Vector3 rhs3 = segment.a - segment.b;
                                    u2 += Mathf.Max(0f, Vector3.Dot(lhs, rhs3)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs3.sqrMagnitude * ray.LengthSqr()));
                                }
                                if (flag2 && i == 16 && v2 > 0.999f)
                                {
                                    Vector3 rhs4 = segment.b - segment.a;
                                    u2 += Mathf.Max(0f, Vector3.Dot(lhs, rhs4)) / Mathf.Max(0.001f, Mathf.Sqrt(rhs4.sqrMagnitude * ray.LengthSqr()));
                                }
                                priority = num7;
                                t        = u2;
                                result   = true;
                            }
                        }
                    }
                    segment.a = segment.b;
                }
                priority = Mathf.Max(0f, Mathf.Sqrt(priority) - collisionHalfWidth);
            }
            __result = result;
            return(false);
        }
        public void intersection_overlap() {
            var a = new Segment2(new Point2(0, 0), new Point2(1, 1));
            var b = new Segment2(new Point2(.5, .5), new Point2(2, 2));
            var exp = new Segment2(new Point2(.5, .5), new Point2(1, 1));

            var res = SegmentIntersectionOperation.IntersectionDetails(a, b) as SegmentIntersectionOperation.SegmentResult;
            Assert.Equal(exp, res.S);
            Assert.Equal(new Vector2(.5, 0), res.A.Ratios);
            Assert.Equal(new Vector2(1, 1 / 3.0), res.B.Ratios);

            res = SegmentIntersectionOperation.IntersectionDetails(b, a) as SegmentIntersectionOperation.SegmentResult;
            Assert.Equal(exp, res.S);
            Assert.Equal(new Vector2(0, .5), res.A.Ratios);
            Assert.Equal(new Vector2(1 / 3.0, 1), res.B.Ratios);
        }
Ejemplo n.º 48
0
 private void AreEqual_ClosestPoints(Line2 line, Segment2 segment, Vector2 expected)
 {
     AreEqual_ClosestPoints(line, segment, expected, expected);
 }
        public void no_intersection_perpendicular() {
            var a = new Segment2(new Point2(0, 1), new Point2(1, 0));
            var b = new Segment2(new Point2(2, 2), new Point2(1, 1));

            var res = SegmentIntersectionOperation.IntersectionDetails(a, b);
            Assert.Null(res.Geometry);

            res = SegmentIntersectionOperation.IntersectionDetails(b, a);
            Assert.Null(res.Geometry);
        }
Ejemplo n.º 50
0
 private void IsFalse_Intersect(Line2 line, Segment2 segment)
 {
     Assert.IsFalse(Intersect.LineSegment(line.origin, line.direction, segment.a, segment.b, out _), format, line, segment);
     Assert.IsFalse(Intersect.LineSegment(line.origin, line.direction, segment.b, segment.a, out _), format, line, segment);
 }
 private void AreEqual_ClosestPoints(Segment2 segment, Circle2 circle, Vector2 expected)
 {
     AreEqual_ClosestPoints(segment, circle, expected, expected, expected);
 }
Ejemplo n.º 52
0
        private void IsFalse_Intersect_Perpendicular(Line2 line, Vector2 perpendicular, Vector2 offset)
        {
            var segment = new Segment2(-perpendicular + offset, perpendicular + offset);

            IsFalse_Intersect(line, segment);
        }