計算直線上距離某座標最近的一個投影點
0x01 調用方式
var p = GetProjectivePoint(new Point(0,0), new Point(300,300), new Point(100,150));
Console.WriteLine(p);
0x02 源碼
protected Point GetProjectivePoint(Point P1, Point P2, Point pOut)
{
Point pLine = P1;
if (P1.X == P2.X && P1.Y == P2.Y)
{
return P1;
}
if (P1.X == P2.X)
{
return new Point(pLine.X, pOut.Y);
}
else if (P1.Y == P2.Y)
{
return new Point(pOut.X, pLine.Y);
}
Double k = ((Double)(P1.Y - P2.Y)) / (P1.X - P2.X);
var X = (float)((k * pLine.X + pOut.X / k + pOut.Y - pLine.Y) / (1 / k + k));
var Y = (float)(-1 / k * (X - pOut.X) + pOut.Y);
return new Point(X,Y);
}