123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- using System;
- namespace BBIWARG.Utility
- {
-
-
-
- public class LineSegment2D
- {
-
-
-
- public Vector2D Direction { get { return Line.Direction; } }
-
-
-
- public float Length { get; private set; }
-
-
-
- public Line2D Line { get; private set; }
-
-
-
- public Vector2D P1 { get; private set; }
-
-
-
- public Vector2D P2 { get; private set; }
-
-
-
-
-
- public LineSegment2D(Vector2D p1, Vector2D p2)
- {
-
- P1 = p1;
- P2 = p2;
- Line = new Line2D(P1, P2 - P1);
- Length = P1.getDistanceTo(P2);
- }
-
-
-
-
-
- public float getDistanceTo(Vector2D point)
- {
-
- float l2 = (P1 - P2).dotProduct(P1 - P2);
- if (l2 == 0.0)
- return point.getDistanceTo(P1);
-
-
-
- float t = (point - P1).dotProduct(P2 - P1) / l2;
- if (t < 0.0)
- return point.getDistanceTo(P1);
- else if (t > 1.0)
- return point.getDistanceTo(P2);
- Vector2D projection = P1 + t * (P2 - P1);
- return point.getDistanceTo(projection);
- }
-
-
-
-
-
- public float getParallelDistanceTo(LineSegment2D line)
- {
- if (Line.onSide(line.P1) != Line.onSide(line.P2)) return 0;
- Vector2D a1 = Line.projectToLine(line.P1);
- Vector2D a2 = Line.projectToLine(line.P2);
- float distanceA1 = a1.getDistanceTo(line.P1);
- float distanceA2 = a2.getDistanceTo(line.P2);
- return Math.Min(distanceA1, distanceA2);
- }
-
-
-
-
-
- public float getVerticalDistanceTo(LineSegment2D line)
- {
- Vector2D a1 = Line.projectToLine(line.P1);
- Vector2D a2 = Line.projectToLine(line.P2);
- if (P1.isInBox(a1, a2) || P2.isInBox(a1, a2)) return 0;
- float distanceP1A1 = P1.getDistanceTo(a1);
- float distanceP1A2 = P1.getDistanceTo(a2);
- float distanceP2A1 = P2.getDistanceTo(a1);
- float distanceP2A2 = P2.getDistanceTo(a2);
- return Math.Min(Math.Min(distanceP1A1, distanceP1A2), Math.Min(distanceP2A1, distanceP2A2));
- }
-
-
-
-
-
- public bool intersectsWith(LineSegment2D ls)
- {
- Vector2D intersection = Line.getIntersection(ls.Line);
- return intersection != null && intersection.isInBox(P1, P2) && intersection.isInBox(ls.P1, ls.P2);
- }
-
-
-
-
-
-
- public override string ToString()
- {
- return (int)P1.X + "|" + (int)P1.Y + " --- " + (int)P2.X + "|" + (int)P2.Y;
- }
- }
- }
|