この 2 つのクラスがあなたの質問に答えてくれると思います。Heron の Formulaを使用して GetArea() 関数を作成しました。セグメント ポイントが常に最初に IsPointWithinDistanceToLineSegment に渡され、TestPoint が常に 3 番目に渡されるようにします。
編集: X と Y に整数のみを許可する Point を愚かに使用しました。X と Y として double または float を取る別のクラスでこれを修正する必要があります...
public class Geometry
{
public static double GetDistanceBetweenTwoPoints(Point SegmentStart, Point SegmentEnd)
{
return Math.Sqrt(Math.Pow(SegmentEnd.X - SegmentStart.X, 2) + Math.Pow(SegmentEnd.Y - SegmentStart.Y, 2));
}
public static bool IsPointWithinDistanceToLineSegment(Point SegmentStart, Point SegmentEnd, Point TestPoint, double TestDistance)
{
if (GetDistanceBetweenTwoPoints(SegmentStart,SegmentEnd) <= TestDistance || GetDistanceBetweenTwoPoints(SegmentEnd,TestPoint) <= TestDistance)
{
return true;
}
var T = new Triangle(SegmentStart, SegmentEnd, TestPoint);
var BaseLength = GetDistanceBetweenTwoPoints(SegmentStart, SegmentEnd);
var Area = T.GetArea();
var TriangleHeight = 2* Area / BaseLength;
return T.AB >= T.BC && T.AB >= T.AC && TriangleHeight <= TestDistance;
}
}
public class Triangle
{
public Triangle(Point a, Point b, Point c)
{
this.a = a;
this.b = b;
this.c = c;
}
public Point a
{
get;
set;
}
public Point b
{
get;
set;
}
public Point c
{
get;
set;
}
//Lengths of Sides
public double AB
{
get
{
return Geometry.GetDistanceBetweenTwoPoints(a, b);
}
}
public double AC
{
get
{
return Geometry.GetDistanceBetweenTwoPoints(a, c);
}
}
public double BC
{
get
{
return Geometry.GetDistanceBetweenTwoPoints(b, c);
}
}
public double GetArea()
{
var Term1 = Math.Pow((Math.Pow(AB, 2) + Math.Pow(AC, 2) + Math.Pow(BC, 2)), 2);
var Term2 = 2 * (Math.Pow(AB, 4) + Math.Pow(AC, 4) + Math.Pow(BC, 4));
var result = .25 * Math.Sqrt(Term1 - Term2);
return result;
}
}