2016-06-22 1 views
-3

내 소프트웨어에서는 두 줄의 교차점을 계산하려고합니다. 첫 번째 줄에는 4 개의 double 변수 (두 개는 x/y는 두 개)로 시작하고 두 번째 줄에는 네 개의 이중 변수로 시작합니다. 수학은 분명하고 종이는 작동합니다. 추가 처리를 위해 교차점을 CSV 파일에 저장해야합니다. 그러나 내가 파일을 열 때 내가 가지고있는 것은 모두 -1.#IND입니다. 이것은 내가 이해할 때 negative infinite 또는 Not A Number을 의미합니다. 그래서 내 코드는 다음과 같습니다.두 줄의 교차점 계산은 -1을 반환합니다. CSV 파일의 # IND

이렇게 두 벡터에서 네 점의 좌표를 얻습니다.

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; 
} 

난 그냥 벡터가 CSV 파일에서 교차 저장할 for -loop를 사용합니다.

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을 추가함으로써, 경계가 작거나 작은지를 계산해야합니다. 그러나 나는 원래의 기능으로 모든 교차로를 잃어 버리지 않습니다. 나는 이미 교차로를 수동으로 계산했고 항상 설정 한 경계에서 한 지점을 발견했다.

+0

사용 벡터 - 수학 (무한 할 수있는 라인의 기울기 (경사) 주) –

+0

는 당신이 우리에게 무엇을 수행 할 수 있습니다 : 2 개 라인을을, 그들은 시컨트하고 확인 교차점을 수동으로 계산하십시오. 대화식 Python 쉘 (IDLE 또는 PyCharm 또는 ...)에서 algorythm을 실행하십시오. 그것은 오류가 될 수있는 곳을 찾기에 충분해야합니다 ... –

+0

나는 내 작업을 할 사람을 요구하지 않습니다. 나는 이미 내 두 벡터의 교차점을 수동으로 계산하고 항상 올바른 교차점을 발견했다. 그러나 코드에서 수학적 접근 방식을 변환하려고 할 때 언급 한 오류가있었습니다. – user3794592

답변

1

0으로 나눈 값을 확인하십시오. AB_x, CD_x은 0

+0

알겠지만 어떻게 피할 수 있습니까?제 말은 AB_x 또는 CD_x가 0 인 경우 숫자를 더할 수 없으므로 0으로 나누는 것을 피하십시오 – user3794592

+0

이 [how-do-you-detect-where-two-line-segments -intersect] (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

관련 문제