【C#】(二维) 直线外一点在直线上的投影点

目录

一、基本公式

A、直线公式

a.推理

B、向量垂直公式

a.推理

二、结合公式1【直线公式】与公式2【向量垂直公式】

1.原始计算

2.替换计算

三、简化计算结果

四、公式在C#代码中的应用


一、基本公式

A、直线公式

\frac{x-x_1}{x_2-x_1}=\frac{y-y_1}{y_2-y_1}

  • P_1(x_1,y_1) 是直线 \tiny \overline{P_1P_2} 上的其中一点;
  • P_2(x_2,y_2) 是直线 \tiny \overline{P_1P_2} 上的另外一点;
  • P_3(x_3,y_3) 是直线 \tiny \overline{P_1P_2} 外的一点;
  • P_0(x_0,y_0) 是直线 \tiny \overline{P_1P_2} 外的一点 P_3(x_3,y_3)  在\tiny \overline{P_1P_2} 上的投影;

a.推理

(x-x_1) \cdot (y_2-y_1)=(y-y_1)\cdot (x_2-x_1)

x \cdot (y_2-y_1) - x_1 \cdot (y_2-y_1)=y\cdot (x_2-x_1) -y_1\cdot (x_2-x_1)

x \cdot (y_2-y_1) - x_1y_2+x_1y_1=y\cdot (x_2-x_1) -y_1x_2+y_1x_1

x=\frac{y\cdot (x_2-x_1) -x_2y_1 + x_1y_2}{y_2-y_1}

x_0=\frac{y_0 (x_2-x_1) -x_2y_1 + x_1y_2}{y_2-y_1}=\frac{a_1y_0 -x_2y_1 + x_1y_2}{b_1}

B、向量垂直公式

0=(x_2-x_1)\cdot (x_3-x_0) + (y_2-y_1)\cdot (y_3-y_0)

  • P_1(x_1,y_1) 是直线 \tiny \overline{P_1P_2} 上的其中一点;
  • P_2(x_2,y_2) 是直线 \tiny \overline{P_1P_2} 上的另外一点;
  • P_3(x_3,y_3) 是直线 \tiny \overline{P_1P_2} 外的一点;
  • P_0(x_0,y_0) 是直线 \tiny \overline{P_1P_2} 外的一点 P_3(x_3,y_3)  在\tiny \overline{P_1P_2} 上的投影;

a.推理

x_3x_2-x_3x_1 - x_0(x_2-x_1) + y_3y_2-y_3y_1 -y_0 (y_2-y_1)=0

x_0=\frac{ x_3x_2-x_3x_1 + y_3y_2-y_3y_1 -y_0 (y_2-y_1)}{(x_2-x_1) }

二、结合公式1【直线公式】与公式2【向量垂直公式】

1.原始计算

x_0=\frac{y_0 (x_2-x_1) -x_2y_1 + x_1y_2}{y_2-y_1}=\frac{ x_3x_2-x_3x_1 + y_3y_2-y_3y_1 -y_0 (y_2-y_1)}{x_2-x_1}

\tiny (x_2-x_1)(y_0 (x_2-x_1) -x_2y_1 + x_1y_2)=(y_2-y_1)( x_3x_2-x_3x_1 + y_3y_2-y_3y_1 -y_0 (y_2-y_1))

\tiny y_0 (x_2-x_1)^2 -x_2y_1(x_2-x_1) + x_1y_2(x_2-x_1)= x_3x_2(y_2-y_1)-x_3x_1(y_2-y_1) + y_3y_2(y_2-y_1)-y_3y_1(y_2-y_1) -y_0 (y_2-y_1)^2

\tiny y_0 (x_2-x_1)^2+y_0 (y_2-y_1)^2 =x_2x_3y_2-x_2x_3y_1-x_1x_3y_2+x_1x_3y_1 + y_2^2y_3-2\times y_1y_2y_3+y_1^2y_3 +x_2^2y_1-x_1x_2y_1 - x_1x_2y_2+x_1^2y_2

\tiny y_0 =\frac{x_2x_3y_2-x_2x_3y_1-x_1x_3y_2+x_1x_3y_1 + y_2^2y_3-2\times y_1y_2y_3+y_1^2y_3 +x_2^2y_1-x_1x_2y_1 - x_1x_2y_2+x_1^2y_2}{ (x_2-x_1)^2+ (y_2-y_1)^2}

\tiny x_0 =\frac{y_2y_3x_2-y_2y_3x_1-y_1y_3x_2+y_1y_3x_1 + x_2^2x_3-2\times x_1x_2x_3+x_1^2x_3 +y_2^2x_1-y_1y_2x_1 - y_1y_2x_2+y_1^2x_2}{ (x_2-x_1)^2+ (y_2-y_1)^2}

2.替换计算

0=a_1x_3-a_1x_0 + b_1y_3- b_1y_0

y_0=\frac{a_1x_3-a_1x_0 + b_1y_3 }{b_1}

x_0=\frac{a_1y_0 -x_2y_1 + x_1y_2}{b_1} =\frac{a_1\frac{a_1x_3-a_1x_0 + b_1y_3 }{b_1} -x_2y_1 + x_1y_2}{b_1} = \frac{a_1^2x_3-a_1^2x_0 + a_1b_1y_3 -b_1x_2y_1 +b_1x_1y_2}{b_1^2}

a_1^2x_0 + b_1^2x_0=a_1^2x_3+ a_1b_1y_3 -b_1x_2y_1 +b_1x_1y_2

x_0=\frac{a_1^2x_3+ a_1b_1y_3 -b_1x_2y_1 +b_1x_1y_2 }{ a_1^2+ b_1^2}

y_0=\frac{a_1x_3-a_1x_0 + b_1y_3 }{b_1} =\frac{a_1x_3-a_1\frac{a_1^2x_3+ a_1b_1y_3 -b_1x_2y_1 +b_1x_1y_2 }{ a_1^2+ b_1^2} + b_1y_3 }{b_1}

y_0 =\frac{a_1x_3(a_1^2+ b_1^2)-a_1(a_1^2x_3+ a_1b_1y_3 -b_1x_2y_1 +b_1x_1y_2) + b_1y_3(a_1^2+ b_1^2) }{b_1(a_1^2+ b_1^2)}

y_0 =\frac{a_1^3x_3+ a_1b_1^2x_3-a_1^3x_3- a_1^2b_1y_3 +a_1b_1x_2y_1 -a_1b_1x_1y_2 + b_1y_3a_1^2+ b_1y_3b_1^2 }{b_1(a_1^2+ b_1^2)}

y_0 =\frac{ a_1b_1^2x_3 +a_1b_1x_2y_1 -a_1b_1x_1y_2 + b_1^3y_3 }{b_1(a_1^2+ b_1^2)}

y_0 =\frac{ a_1b_1x_3 +a_1x_2y_1 -a_1x_1y_2 + b_1^2y_3 }{(a_1^2+ b_1^2)}=\frac{ b_1^2y_3+ a_1b_1x_3-a_1x_1y_2 +a_1x_2y_1 }{a_1^2+ b_1^2}

三、简化计算结果

x_0=\frac{a_1^2x_3+ a_1b_1y_3 -b_1x_2y_1 +b_1x_1y_2 }{ a_1^2+ b_1^2}

y_0 =\frac{ b_1^2y_3+ a_1b_1x_3-a_1x_1y_2 +a_1x_2y_1 }{a_1^2+ b_1^2}

其中:

  • P_1(x_1,y_1) 是直线 \tiny \overline{P_1P_2} 上的其中一点;
  • P_2(x_2,y_2) 是直线 \tiny \overline{P_1P_2} 上的另外一点;
  • P_3(x_3,y_3) 是直线 \tiny \overline{P_1P_2} 外的一点;
  • P_0(x_0,y_0) 是直线 \tiny \overline{P_1P_2} 外的一点 P_3(x_3,y_3)  在\tiny \overline{P_1P_2} 上的投影;
  • V(a_1,b_1) 是 P_1(x_1,y_1)  到 P_2(x_2,y_2) 的向量 \vec{P_1P_2} = (x_2-x_1,y_2-y_1) ,a_1=x_2-x_1b_1=y_2-y_1

四、公式在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));
        }
发布了384 篇原创文章 · 获赞 70 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/chenlu5201314/article/details/99697392
今日推荐