我将使用三角形方法:
首先,我会检查 Area,如果 Area 接近 0,那么 Point 就在 Line 上。
但是想想AC的长度这么大的情况,那么Area从0增加了很多,但是视觉上,我们仍然看到B在AC上:当我们需要检查三角形的高度时。
为此,我们需要记住我们从一年级学到的公式: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
,但你明白了。