トライアングルアプローチを使用します:
まず、エリアを確認します。エリアが0に近い場合、ポイントはライン上にあります。
しかし、ACの長さが非常に長い場合、面積は0から大きく増加しますが、視覚的には、BがAC上にあることがわかります。つまり、三角形の高さを確認する必要がある場合です。
これを行うには、1年生から学んだ式を覚えておく必要があります。Area = Base * Height / 2
コードは次のとおりです。
bool Is3PointOn1Line(IList<Vector2> arrVert, int idx1, int idx2, int idx3)
{
//check if the area of the ABC triangle is 0:
float fArea = arrVert[idx1].x * (arrVert[idx2].y - arrVert[idx3].y) +
arrVert[idx2].x * (arrVert[idx3].y - arrVert[idx1].y) +
arrVert[idx3].x * (arrVert[idx1].y - arrVert[idx2].y);
fArea = Mathf.Abs(fArea);
if (fArea < SS.EPSILON)
{
//Area is zero then it's the line
return true;
}
else
{
//Check the height, in case the triangle has long base
float fBase = Vector2.Distance(arrVert[idx1], arrVert[idx3]);
float height = 2.0f * fArea / fBase;
return height < SS.EPSILON;
}
}
使用法:
Vector2[] arrVert = new Vector2[3];
arrVert[0] = //...
arrVert[1] = //...
arrVert[2] = //...
if(Is3PointOn1Line(arrVert, 0, 1, 2))
{
//Ta-da, they're on same line
}
PS:SS.EPSILON = 0.01fで、Unityの関数(例:)を使用してVector2.Distance
いますが、あなたはその考えを理解しました。