mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-03 00:00:57 +08:00
44 lines
1.4 KiB
C#
44 lines
1.4 KiB
C#
namespace AIStudio.Wpf.DiagramDesigner.Geometrys
|
|
{
|
|
public struct LineBase
|
|
{
|
|
public LineBase(PointBase start, PointBase end)
|
|
{
|
|
Start = start;
|
|
End = end;
|
|
}
|
|
|
|
public PointBase Start { get; }
|
|
public PointBase End { get; }
|
|
|
|
public PointBase? GetIntersection(LineBase line)
|
|
{
|
|
var pt1Dir = new PointBase(End.X - Start.X, End.Y - Start.Y);
|
|
var pt2Dir = new PointBase(line.End.X - line.Start.X, line.End.Y - line.Start.Y);
|
|
var det = (pt1Dir.X * pt2Dir.Y) - (pt1Dir.Y * pt2Dir.X);
|
|
var deltaPt = new PointBase(line.Start.X - Start.X, line.Start.Y - Start.Y);
|
|
var alpha = (deltaPt.X * pt2Dir.Y) - (deltaPt.Y * pt2Dir.X);
|
|
var beta = (deltaPt.X * pt1Dir.Y) - (deltaPt.Y * pt1Dir.X);
|
|
|
|
if (det == 0 || alpha * det < 0 || beta * det < 0)
|
|
return null;
|
|
|
|
if (det > 0)
|
|
{
|
|
if (alpha > det || beta > det)
|
|
return null;
|
|
|
|
}
|
|
else
|
|
{
|
|
if (alpha < det || beta < det)
|
|
return null;
|
|
}
|
|
|
|
return new PointBase(Start.X + (alpha * pt1Dir.X / det), Start.Y + (alpha * pt1Dir.Y / det));
|
|
}
|
|
|
|
public override string ToString() => $"Line from {Start} to {End}";
|
|
}
|
|
}
|