2016-06-22 3 views
-3

В моем программном обеспечении я пытаюсь вычислить точки пересечения двух линий. Я начинаю с четырех двойных переменных для первой строки (два для 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.

+0

Используйте вектор-математика (обратите внимание на градиент (наклон) строки может быть бесконечными) –

+0

делать то, что вы просите нас сделать: взять 2 линии, убедитесь, что они секущие и вручную вычислите точку пересечения. Затем в интерактивной оболочке Python (IDLE или PyCharm или ...) выполните ваш алгоритм. Этого должно быть достаточно, чтобы найти, где ошибка может быть ... –

+0

Я не прошу кого-либо выполнить мою задачу. Я уже вычислил точки пересечения двух моих векторов вручную и всегда нашел правильные точки пересечения. Но когда я попытался преобразовать свой математический подход в код, у меня была упомянутая ошибка. – user3794592

ответ

1

Проверить деление на ноль. AB_x, CD_x может быть 0.

+0

Я вижу это, но как я могу избежать этого.Я имею в виду, если AB_x или CD_x равны 0, я просто не могу добавить к нему какое-то число, поэтому я избегаю деления на ноль – user3794592

+0

Возможно, вы захотите посмотреть на этот раздел [how-do-you-detect-where-two-line-segment -intersect] (http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect) – prashkr

+0

Другое хорошее объяснение: [Пересечение линии] (https: // www. topcoder.com/community/data-science/data-science-tutorials/geometry-concepts-line-intersection-and-its-applications/) – prashkr

Смежные вопросы