问题描述
假设我们有两行。
L1:y1 = m1.x1 + c1
L2:y2 = m2.x2 + c2
这样m1!= m2
intersection_X =(c2-c1)/(m1-m2)
交集Y = m1 *相交X + c1
此外,如果我们计算交点Y ,而W
intersection_Y 应该都相等。
如果运行下面的代码并检查 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,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;
}