计算两条线的交点 returns -1.#IND in CSV-file
Calculation of intersection points of two lines returns -1.#IND in CSV-file
在我的软件中,我尝试计算两条线的交点。我从第一行的四个双精度变量开始(两个用于 x/two for y),第二行使用四个双精度变量。数学对我来说很清楚,而且在纸面上它是有效的。为了进一步处理,我必须将交点保存在 CSV 文件中。但是当我打开文件时,我只有 -1.#IND
,据我了解,这意味着 negative infinite
或 Not 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;
有了坐标,我就可以为这两条线建立方程。在下一步中,我将查看变量 m1
和 m2
。如果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
循环将矢量相交保存在 CSV 文件中。
for(int i=0; i<intersects.size(); i++)
{
file << "Intersects" << ";" << intersects[i][0] << ";" << intersects[i][1] << ";" << intersects[i][2] << endl;
}
但是当我打开文件时,出现了上述错误。我已经尝试了另一种数据类型,如 float,但没有任何改变。我知道代码的第一部分和最后一部分是有效的,因为我已经将它用于不同类型的数学,然而,在这种情况下,我的数学方法被错误地选择了,所以我不得不改变它。所以我认为问题必须在 if
-statement.
的条件下
编辑: 在评论的帮助下,我现在修改了我的代码。所以这是我的新代码:
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.
在我的软件中,我尝试计算两条线的交点。我从第一行的四个双精度变量开始(两个用于 x/two for y),第二行使用四个双精度变量。数学对我来说很清楚,而且在纸面上它是有效的。为了进一步处理,我必须将交点保存在 CSV 文件中。但是当我打开文件时,我只有 -1.#IND
,据我了解,这意味着 negative infinite
或 Not 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;
有了坐标,我就可以为这两条线建立方程。在下一步中,我将查看变量 m1
和 m2
。如果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
循环将矢量相交保存在 CSV 文件中。
for(int i=0; i<intersects.size(); i++)
{
file << "Intersects" << ";" << intersects[i][0] << ";" << intersects[i][1] << ";" << intersects[i][2] << endl;
}
但是当我打开文件时,出现了上述错误。我已经尝试了另一种数据类型,如 float,但没有任何改变。我知道代码的第一部分和最后一部分是有效的,因为我已经将它用于不同类型的数学,然而,在这种情况下,我的数学方法被错误地选择了,所以我不得不改变它。所以我认为问题必须在 if
-statement.
编辑: 在评论的帮助下,我现在修改了我的代码。所以这是我的新代码:
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.