2016-06-22 21 views
-3

在我的軟件中,我嘗試計算兩條線的交點。我從第一行的四個雙變量(兩個x /兩個y)開始,第二行四個雙變量。數學對我來說很清楚,在紙上它工作。爲了進一步處理,我必須將交點保存在CSV文件中。但是當我打開文件時,我擁有的是-1.#IND,據我瞭解這意味着negative infiniteNot A Number。所以這是我的代碼:計算兩條線的交點將返回-1#CSV文件中的IND#

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文件相交。

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添加到我的代碼中,我將不得不計算bacing是否較小,或者可能較小。但我沒有得到,爲什麼我失去了所有的交叉口,與我原來的功能。我已經手動計算了十字路口,並且總是在設定的路段中找到一個點。

+0

使用矢量數學(注意線的斜度(傾斜)可能是無限的) –

+0

你要我們怎麼做:取2行,確保他們是割線手動計算交點。然後在一個交互式Python shell(IDLE或PyCharm或...)中執行你的algorythm。它應該足以發現錯誤可能在哪裏...... –

+0

我並不是要求任何人來完成我的任務。我已經手動計算了兩個向量的相交點,並始終找到正確的交點。但是當我試圖在代碼中轉換我的數學方法時,我遇到了提到的錯誤。 – user3794592

回答

1

檢查除以零。 AB_xCD_x可以爲0

+0

我明白了,但我該如何避免這種情況。我的意思是,如果AB_x或CD_x是0,我只是不能添加一些數字,所以我避免零除 – user3794592

+0

你可能想看看這個[你怎麼做,檢測,在哪裏,兩行線段[交叉]](http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect) – prashkr

+0

另一個很好的解釋:[Line Intersection](https:// www。 topcoder.com/community/data-science/data-science-tutorials/geometry-concepts-line-intersection-and-its-applications/) – prashkr