CSV文件中的两条线的交点的计算返回-1.#IND

Calculation of intersection points of two lines returns -1.#IND in CSV-file

本文关键字:返回 计算 #IND 文件 两条线 CSV      更新时间:2023-10-16

在我的软件中,我尝试计算两行的相交点。我从第一行的四个双变量开始(x/二的两个变量),第二行的四个双变量。数学对我来说很清楚,在纸上它正在工作。要进一步处理,我必须将交叉点保存在CSV文件中。但是,当我打开文件时,我只有-1.#IND,据我了解,这意味着negative infiniteNot A Number。所以这是我的代码:

double A_x=boundingbox[i][0];
double A_y=boundingbox[i][1];
double B_x=boundingbox[i+1][0];
double B_y=boundingbox[i+1][0];
double C_x = matrix[j][0];
double C_y = matrix[j][1];
double D_x = matrix[j+1][0];
double D_y = matrix[j+1][1];

所以首先,我从两个向量获得了四个点的坐标。

double AB_x=B_x - A_x;
double AB_y=B_y - A_y;
double m1 = AB_y / AB_x;
double c1 = A_y - m1*A_x;
double CD_x = D_x-C_x;
double CD_y = D_y-C_y;
double m2 = CD_y/CD_x;
double c2 = C_y-m1*C_x;

使用坐标,我可以为两行的方程式设置方程。在下一步中,我会查看变量m1m2。如果m1减去m2是0,则没有交叉点。

if( (m1-m2) != 0) {
    double point_x = (c2 - c1) / (m1 - m2);
    double point_y = m1 * point_x + c1;
    intersects.push_back(std::array<double, 3>());
    int q = intersects.size()-1;
    intersects[q][0]=point_x;
    intersects[q][1]=point_y;
    intersects[q][2]=i;
}

最后,我只使用 for -loop将矢量相交在csv -file中。

for(int i=0; i<intersects.size(); i++)
{
    file << "Intersects" << ";" << intersects[i][0] << ";" << intersects[i][1] << ";" << intersects[i][2] << endl;
}

但是,当我打开文件时,我刚刚出现了上述错误。我已经尝试了诸如Float之类的不同类型的数据类型,但是没有任何改变。我知道代码的第一部分和最后一部分正在起作用,因为我已经用另一种数学使用了它,但是,在这种数学方法中,我已经错误地选择了它,因此我不得不更改它。因此,我认为问题必须是if统计的条件。

编辑:在注释的帮助下,我现在调整了我的代码。所以这是我的新代码:

for(int a=fillingStart; a<boundingbox.size()-1; a += 2)
{
    double Ax=boundingbox[a][0];
    double Ay=boundingbox[a][1];
    double Bx=boundingbox[a+1][0];
    double By=boundingbox[a+1][1];
    double B1=Bx-Ax;
    double A1=By-Ay;
    for(size_t j=0; j<(matrix.size()-1); j++)
    {
        double Cx=matrix[j][0];
        double Cy=matrix[j][1];
        double Dx=matrix[j+1][0];
        double Dy=matrix[j+1][1];
        double B2=Dx-Cx;
        double A2=Dy-Cy;
        double det=A1*B2-A2*B1;
        if(det!=0) { // det == 0 -> Lines are parallel
            double C1=A1*Ax+B1*Ay;                          
            double C2=A2*Cx + B2*Cy;
            double point_x=(B2*C1-B1*C2)/det;
            double point_y=(A1*C2-A2*C1)/det;
            if(IsPointInBoundingBox(Ax, Ay, Bx, By, point_x, point_y) == 1 && IsPointInBoundingBox(Cx, Cy, Dx, Dy, point_x, point_y) == 1)
            {
                intersects.push_back(std::array<double, 3>());
                int q = intersects.size()-1;
                intersects[q][0]=point_x;
                intersects[q][1]=point_y;
                intersects[q][2]=matrix[j][2];
            }   
        }
    }   
}
int IsPointInBoundingBox(double x1, double y1, double x2, double y2, double px, double py)
{
    if(min(x1, x2) <= px && px <= max(x1,x2) && min(y1,y2) <= py  && py <= max(y1,y2) )
    {
         return 1;
    }
    else
         return 0;
}

当我运行程序时,没有交叉路口写入文件中。获得文件交集的唯一方法是调节IsPointInBoundingBox函数。要使它开始工作,我必须使用此代码:

if( (px+0.01) >= min(x1,x2) && (px-0.01) <= max(x1,x2) && 
        (py+0.01) >= min(y1,y2) && (py-0.01) <= max(y1,y2) )
{
    return 1;
}
else
    return 0;

我的大问题是我必须使用不同的输入。通过将+-0.1添加到我的代码中,我必须计算界限是否较小或可能较小。但是我不明白,为什么我会因原始功能而失去所有交叉点。我已经手动计算了交叉点,并始终在集合边界中找到一个点。

按零检查除法。 AB_X CD_X 可以是0。