C++ 交点1.Y和Y应该相等。但是点1.Y和Y有区别,为什么?

C++ 交点1.Y和Y应该相等。但是点1.Y和Y有区别,为什么?,c++,math,geometry,precision,intersection,C++,Math,Geometry,Precision,Intersection,假设我们有两行。 L1:y1=m1.x1+c1 L2:y2=m2.x2+c2 这样m1!=m2 交叉点_X=(c2-c1)/(m1-m2) 交点_Y=m1*交点_X+c1 同样,如果我们计算交叉点Yw.r.tL2,即交叉点Y=m2*交叉点X+c2 两个交点应相等。 如果您运行下面的代码并检查point1.Y和Y,您会发现两者不相等我认为这里的精度处理有问题 由于这种差异,崩溃正在发生。 请找个人点灯好吗 #include <iostream> #include<cmath&g

假设我们有两行。

L1:y1=m1.x1+c1
L2:y2=m2.x2+c2
这样m1!=m2

交叉点_X=(c2-c1)/(m1-m2)
交点_Y=m1*交点_X+c1

同样,如果我们计算交叉点Yw.r.tL2,即交叉点Y=m2*交叉点X+c2
两个交点应相等。
如果您运行下面的代码并检查point1.YY,您会发现两者不相等
我认为这里的精度处理有问题
由于这种差异,崩溃正在发生。
请找个人点灯好吗


#include <iostream>
#include<cmath>
#include<limits>

using namespace std;

#define FUZZ_GEN (1e-9)       //tolerance for vertical check
#define FEQUAL(a, b, fuzz)  (fabs(a - b) <= (fuzz))

struct Point {
    double X, Y;
};

class LineSegment {            //Line class

public:
    LineSegment(double x1, double y1, double x2, double y2);

    void IntersectionPoints(LineSegment side);        

    double X1, Y1, X2, Y2, M, C;
};

LineSegment::LineSegment(double fX1, double fY1, double fX2, double fY2)   //Constructor for line
    : X1(fX1),
    Y1(fY1),
    X2(fX2),
    Y2(fY2)
{
    if (FEQUAL(X1, X2, FUZZ_GEN))     // if vertical, slope is inf.
    {
        M = C = std::numeric_limits<double>::infinity();        // slope undefined
    }
    else
    {

        M = (Y2 - Y1) / (X2 - X1);
        C = Y1 - (M * X1);
    }
}
void LineSegment::IntersectionPoints (LineSegment side) {

    Point point1;
    point1.X = (C - side.C) / (side.M - M);     //intersection point 1
    point1.Y = M * point1.X + C;
    
    double Y = side.M * point1.X + side.C;       // ?? Y != point1.Y
}

int main()
{
// data coming from lower level APIs. Can't be changed
    LineSegment side = LineSegment(10.267716536547709,   //create first line
            6.8779527559055005,
            10.031496064106765,
            6.8779527559055005);

    LineSegment line = LineSegment(10.149606299212586,     // create second line
        9.1220472440944818,
        10.149606296983265,
        4.2665936725507594);

    line.IntersectionPoints(side);  //call to calc intersection point 
    return  0;
}


#包括
#包括
#包括
使用名称空间std;
#定义FUZZ_GEN(1e-9)//垂直检查公差
#定义FEQUAL(a,b,fuzz)(fabs(a-b)双精度浮点数的数量是有限的

这意味着在两个浮点数之间有无限多个实数。浮点数之间有巨大的间隙-充满了无法表示的数字

定义两条直线时,它们的交点不太可能正好位于双精度浮点数上。它将位于两个数字之间的空白处

想象你放大到如此之深,以至于你可以清楚地看到浮点数之间的空间。你可以像下图那样可视化交点,其中网格线是浮点数:


如果此处下角的坐标为x=0 y=0,则最靠近交点的x轴值为x=2。但如果在x=2处计算两条直线,则直线C-D的值为y=2,直线A-B的值为y=3。为什么?因为直线在(2,2)或(2,3)处不相交,它们相交于之间的某个点。

您的代码没有在GCC 10.1上编译。您的示例似乎几乎是最小的可复制示例。也许您可以提供您在这个问题上找到的2y值。我的假设是:它们之间有一点差异,因为浮点确实存在精度错误。它们应该是alm如果你的算法是正确的,ost也一样。你能给出一些关于“不相等”的例子吗?我的意思是:2不等于3(完全错误),但2.00001不等于2.00002(正确,但有一些精度错误)。更正了代码。它现在可以编译了。也值得一读。