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.Y和Y,您会发现两者不相等
我认为这里的精度处理有问题
由于这种差异,崩溃正在发生。
请找个人点灯好吗
#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(正确,但有一些精度错误)。更正了代码。它现在可以编译了。也值得一读。