目录
一、基本公式
A、直线公式
- 是直线 上的其中一点;
- 是直线 上的另外一点;
- 是直线 外的一点;
- 是直线 外的一点 在 上的投影;
a.推理
B、向量垂直公式
- 是直线 上的其中一点;
- 是直线 上的另外一点;
- 是直线 外的一点;
- 是直线 外的一点 在 上的投影;
a.推理
二、结合公式1【直线公式】与公式2【向量垂直公式】
1.原始计算
2.替换计算
三、简化计算结果
其中:
- 是直线 上的其中一点;
- 是直线 上的另外一点;
- 是直线 外的一点;
- 是直线 外的一点 在 上的投影;
- 是 到 的向量 ,,;
四、公式在C#代码中的应用
/// <summary>
/// 求直线上的投影点
/// </summary>
/// <param name="P1">直线上的点1</param>
/// <param name="P2">直线上的点2</param>
/// <param name="P3">直线外的点</param>
/// <returns></returns>
public PointF LinePointProjection(PointF P1,PointF P2,PointF P3)
{
double a1 = P2.X - P1.X;
double b1 = P2.Y - P1.Y;
double y1 = P1.Y;
double x1 = P1.X;
double y2 = P2.Y;
double x2 = P2.X;
double y3 = P3.Y;
double x3 = P3.X;
double a1a1 = Math.Pow(a1, 2.0);
double b1b1 = Math.Pow(b1, 2.0);
double denominator = a1a1 + b1b1;
if (denominator == 0) return P3;
double x1y2 = x1 * y2;
double x2y1 = x2 * y1;
double a1b1 = a1 * b1;
double moleculey = b1b1 * y3 + a1b1 * x3 - a1 * x1y2 + a1 * x2y1;
double moleculex = a1a1 * x3 + a1b1 * y3 - b1 * x2y1 + b1 * x1y2;
return new PointF((float)(moleculex/denominator),(float)(moleculey/denominator));
}