如何从两个点找到一条直线的一般形式方程?

29

给定输入:

double x1,y1,x2,y2;

我该如何找到一般形式的方程(双系数a、b、c,其中ax + by + c = 0)?

注意:我希望能够通过计算来完成这项任务。因此,与斜率截距式等价的内容可能是:

double dx, dy;
double m, b;

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

很显然,这很简单,但我一直没有找到通用方程形式的解决方案(因为它可以处理垂直线,所以更有用)。我已经查阅了我的线性代数书和两本计算几何书籍(都过于高级而无法解释这个问题)。

5个回答

53

如果你从方程 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

1
这种形式的另一个好处是,即使线是垂直的,或者给定的两个点是相同的,计算也不会失败。然而,在计算之后仍然需要验证,以便消耗a、b、c参数的代码不会受到意外的影响。 - rwong
2
此外,应将 (a, b) 的值进行归一化以避免数值问题。使用 L2 范数是相当典型的,因此 a^2 + b^2=1 - marcos.nieto
2
如果您使用单独的系数进行后续计算,请注意,当它是一条竖线时,这可能仍会导致问题,因为它在约简形式中不会产生垂直线。 - TankofVines
9
你可以将 c 简化为 x1 * y2 - x2 * y1(分配并收集)。 - Jeffrey Scofield
3
仅作将来参考,这将给出系数的形式为 Ax + By = C,而不是 Ax + By + C = 0。 - Mojo Jojo
显示剩余5条评论

3

通过减去两个点(x2-x1, y2-y1)来得到切线。将其标准化并旋转90度以获得法向量(a,b)。用其中一个点进行点积运算以获得常数c


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);
}

1

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


-6
#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年)。代码并没有计算任何东西;你只是手动硬编码并将其打印到终端。你甚至限制了它只能使用整数和字符(!?)。 - Jake
3
我已经是一个活跃会员超过2年了,之前从未见过这样的情况 :) - csg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接