【问题标题】:How can I find the general form equation of a line from two points?如何从两点找到直线的一般形式方程?
【发布时间】:2012-11-06 00:39:51
【问题描述】:

给定输入:

double x1,y1,x2,y2;

我怎样才能找到一般形式的方程(double a,b,c where ax + by + c = 0)?

注意:我希望能够通过计算来做到这一点。所以斜率截距形式的等价物是这样的:

double dx, dy;
double m, b;

dx = x2 - x1;
dy = y2 - y1;
m = dy/dx;
b = y1;

显然,这很简单,但我一直无法找到一般方程形式的解(这更有用,因为它可以做垂直线)。我已经看过我的线性代数书和两本关于计算几何的书(都太高级了,无法解释这一点)。

【问题讨论】:

    标签: geometry


    【解决方案1】:

    如果你从方程y-y1 = (y2-y1)/(x2-x1) * (x-x1)(即由两点定义的直线的方程)开始,通过一些操作可以得到(y1-y2) * x + (x2-x1) * y + (x1-x2)*y1 + (y2-y1)*x1 = 0,你可以认出:

    • a = y1-y2,
    • b = x2-x1,
    • c = (x1-x2)*y1 + (y2-y1)*x1

    【讨论】:

    • 这种形式的另一个好处是即使直线是垂直的,或者如果两个给定的点相同,计算也不会爆炸。但是,计算之后仍然需要验证,因此使用 a, b, c 参数的代码不会被意外捕获
    • 另外,(a, b) 的值应该被标准化以避免数值问题。使用范数 L2 是很典型的,所以a^2 + b^2=1
    • 如果您使用单个系数进行后续计算,请注意,当它是一条垂直线时,这可能仍然会给您带来问题,因为它不会产生简化形式的垂直
    • 您可以将c 简化为x1 * y2 - x2 * y1(分发和收集)。
    • 仅供将来参考,这给出了 Ax + By = C 形式的系数,而不是 Ax + By + C = 0
    【解决方案2】:

    通过减去两个点(x2-x1, y2-y1) 得到正切。对其进行归一化并旋转 90 度得到法线向量(a,b)。取其中一个点的点积得到常数c

    【讨论】:

      【解决方案3】:

      如果你从2点定义线的方程开始

      (x - x1)/(x2 - x1) = (y - y1)/(y2 - y1)
      

      你可以得到下一个等式

      x(y2 - y1) - y(x2 - x1) - x1*y2 + y1*x2 = 0
      

      所以系数将是:

      • a = y2 - y1
      • b = -(x2 - x1) = x1 - x2
      • c = y1*x2 - x1*y2

      我在 C 中的算法实现

      inline v3 LineEquationFrom2Points(v2 P1, v2 P2) {
          v3 Result;
      
          Result.A = P2.y - P1.y;
          Result.B = -(P2.x - P1.x);
          Result.C = P1.y * P2.x - P1.x * P2.y;
      
          return(Result);
      }
      

      【讨论】:

        【解决方案4】:

        捷径步骤: “问题:(4,5) (3,-7)解决: m=-12/1 那么 12x-y= 48 "注意:m 是一个斜率" 复制分子,加“X” 正分数之间的负号。 (提示:类似符号 = 添加 + 复制符号) 1.将第二组改为相反的符号, 2.ADD y1 to y2(表示根据符号添加或减去它们), 3.ADD x1到x2(也意味着根据符号添加或减去它们), 4.然后将 12 和 1 乘以任何问题集。 在“BOOM” Tada! 之后,你就有答案了

        【讨论】:

          【解决方案5】:
          #include <stdio.h>
          main()
          {
              int a,b,c;
              char x,y;
              a=5;
              b=10;
              c=15;
              x=2;
              y=3;
              printf("the equation of line is %dx+%dy=%d" ,a,b,c);
          }
          

          【讨论】:

          • 这根本不是用户要问的(他们在将近 5 年前就问过了)。代码不计算任何东西;您刚刚手动完成,硬编码并将其打印到终端。您甚至将其限制为整数和字符(!?)。
          • 我成为活跃会员已有 2 年多了,以前从未见过这样的事情 :)
          猜你喜欢
          • 1970-01-01
          • 2010-12-07
          • 2011-03-03
          • 1970-01-01
          • 1970-01-01
          • 2011-09-26
          • 1970-01-01
          • 2018-06-22
          • 1970-01-01
          相关资源
          最近更新 更多