private static bool SegmentSegmentCollinear(Vector2 leftA, Vector2 leftB, float sqrLeftLength, Vector2 rightA, Vector2 rightB, out IntersectionSegmentSegment2 intersection) { Vector2 leftDirection = leftB - leftA; float rightAProjection = Vector2.Dot(leftDirection, rightA - leftB); if (Mathf.Abs(rightAProjection) < Geometry.Epsilon) { // LB == RA // LA------LB // RA------RB intersection = IntersectionSegmentSegment2.Point(leftB); return(true); } if (rightAProjection < 0) { // LB > RA // LA------LB // RARB // RA--RB // RA------RB Vector2 pointB; float rightBProjection = Vector2.Dot(leftDirection, rightB - leftA); if (rightBProjection > sqrLeftLength) { pointB = leftB; } else { pointB = rightB; } intersection = IntersectionSegmentSegment2.Segment(rightA, pointB); return(true); } // LB < RA // LA------LB // RA------RB intersection = IntersectionSegmentSegment2.None(); return(false); }
private static bool SegmentSegmentCollinear(Vector2 leftA, Vector2 leftB, Vector2 rightA, Vector2 rightB, out IntersectionSegmentSegment2 intersection) { Vector2 leftDirection = leftB - leftA; float projectionRA = Vector2.Dot(leftDirection, leftB - rightA); if (Mathf.Abs(projectionRA) < Geometry.Epsilon) { // LB == RA // LA------LB // RA------RB intersection = IntersectionSegmentSegment2.Point(leftB); return(true); } if (projectionRA > 0) { // LB > RA // LA------LB // RARB // RA--RB // RA------RB Vector2 pointB; float projectionRB = Vector2.Dot(leftDirection, rightB - leftA); if (projectionRB > leftDirection.sqrMagnitude) { pointB = leftB; } else { pointB = rightB; } intersection = IntersectionSegmentSegment2.Segment(rightA, pointB); return(true); } // LB < RA // LA------LB // RA------RB intersection = IntersectionSegmentSegment2.None(); return(false); }