如何由两点坐标确定一条直线的ax+by+c=0表达式

如何由两点坐标确定一条直线的ax+by+c=0表达式
比如已知两坐标:
(x1,y1),(x2,y2);
对于表达式ax+by+c=0;
a=?,b=?,c=?;

y=kx+m,
y1=kx1+m
y2=kx2+m,
k=(y2-y1)/(x2-x1)
m=y1-(y2-y1)x1/(x2-x1)
y=(y2-y1)/(x2-x1)x+(y1
(x2-x1)-x1(y2-y1))/(x2-x1)
(y1-y2)x+(x2-x1)y+(x1y2-x2y1)=0,
a=y1-y2,
b=x2-x1,
1
c=x1y2-x2y1
2
a=a/gcd(a,b);
b=b/gcd(a,b)
c=-ax-by;
借鉴于:https://www.zybang.com/question/6413f293470b3cbb7e2b0ca6d89c4da3.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用最小二乘法来拟合一组点到直线。 假设有n个点,坐标为(x1,y1),(x2,y2),...,(xn,yn),我们需要找到一条直线Ax+By+C=0,使得这n个点到这条直线的距离的平方和最小。 首先,我们可以计算每个点到直线的距离d,即:d = (Ax + By + C) / sqrt(A^2 + B^2)。 然后,我们需要最小化所有点到直线距离的平方和,即:E = Σ(di^2),i从1到n。 我们可以对A、B、C分别偏导数,然后令偏导数等于0,解出A、B、C的值,即可得到最佳的拟合直线。 具体实现可以参考下面的C++代码: ``` #include <iostream> #include <cmath> #include <vector> using namespace std; struct Point { double x; double y; }; void fitLine(vector<Point>& points, double& A, double& B, double& C) { int n = points.size(); double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0, sumYY = 0; for (int i = 0; i < n; i++) { sumX += points[i].x; sumY += points[i].y; sumXY += points[i].x * points[i].y; sumXX += points[i].x * points[i].x; sumYY += points[i].y * points[i].y; } double denom = n * sumXX - sumX * sumX; if (denom == 0) { A = 1; B = 0; C = -points[0].x; } else { A = (n * sumXY - sumX * sumY) / denom; B = (sumXX * sumY - sumX * sumXY) / denom; C = -A * points[0].x - B * points[0].y; } } int main() { vector<Point> points = {{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}}; double A, B, C; fitLine(points, A, B, C); cout << "A = " << A << ", B = " << B << ", C = " << C << endl; return 0; } ``` 这个程序可以拟合一个包含5个点的点集,并输出拟合直线的参数A、B、C。你可以根据自己的需要修改点集的内容和数量。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值