В моем программном обеспечении я пытаюсь вычислить точки пересечения двух линий. Я начинаю с четырех двойных переменных для первой строки (два для x/two для y) и четырех двойных переменных для второй строки. Математика понятна мне, и на бумаге она работает. Для дальнейшей обработки я должен сохранить точки пересечения в файле CSV. Но когда я открываю файл, у меня есть -1.#IND
, который, как я понимаю, означает negative infinite
или Not A Number
. Итак, вот мой код:Расчет точек пересечения двух строк возвращает -1. # IND в CSV-файле
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
-loop, чтобы сохранить вектор пересечет в 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
к моему коду, мне нужно было бы рассчитать, являются ли bounderies маленькими или могут быть меньше. Но я не понимаю, почему я теряю все пересечения с моей оригинальной функцией. Я уже рассчитал пересечения вручную и всегда нашел точку в наборе bounderies.
Используйте вектор-математика (обратите внимание на градиент (наклон) строки может быть бесконечными) –
делать то, что вы просите нас сделать: взять 2 линии, убедитесь, что они секущие и вручную вычислите точку пересечения. Затем в интерактивной оболочке Python (IDLE или PyCharm или ...) выполните ваш алгоритм. Этого должно быть достаточно, чтобы найти, где ошибка может быть ... –
Я не прошу кого-либо выполнить мою задачу. Я уже вычислил точки пересечения двух моих векторов вручную и всегда нашел правильные точки пересечения. Но когда я попытался преобразовать свой математический подход в код, у меня была упомянутая ошибка. – user3794592