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))); }
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))); }
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); }
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); }
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); } } }
private void AreEqual_ClosestPoints_Point(Segment2 segment1, Segment2 segment2, Vector2 expected) { AreEqual_ClosestPoints(segment1, segment2, expected, expected, expected, expected); }
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); }
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); }
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); }
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())); }
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); }
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())); }
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)); }
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")); }
public void direction() { var u = new Segment2(new Point2(2, 1), new Point2(-1, 3)); Assert.Equal(new Vector2(-3, 2), u.Direction); }
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); }
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); }
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); }
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()); }
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); }
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); }
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); }
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); }
private void AreEqual_ClosestPoint(Segment2 segment, Vector2 point) { AreEqual_ClosestPoint(segment, point, point); }
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); }
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); }
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); }
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); }
private void IsFalse_Intersect_Perpendicular(Line2 line, Vector2 perpendicular, Vector2 offset) { var segment = new Segment2(-perpendicular + offset, perpendicular + offset); IsFalse_Intersect(line, segment); }