计算直线上距离某坐标最近的一个投影点 0x01 调用方式 var p = GetProjectivePoint(new Point(0,0), new Point(300,300), new Point(100,150)); Console.WriteLine(p); 0x02 源码 /// <summary> /// 计算直线上距离某坐标最近的一个投影点 /// </summary> /// <param name="P1">直线的坐标1</param> /// <param name="P2">直线的坐标2</param> /// <param name="pOut">直线外的坐标</param> /// <returns></returns> 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); }