내 소프트웨어에서는 두 줄의 교차점을 계산하려고합니다. 첫 번째 줄에는 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;
좌표를 사용하면 두 줄의 수식을 설정할 수 있습니다. 다음 단계에서는 변수 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;
}
난 그냥 벡터가 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
을 추가함으로써, 경계가 작거나 작은지를 계산해야합니다. 그러나 나는 원래의 기능으로 모든 교차로를 잃어 버리지 않습니다. 나는 이미 교차로를 수동으로 계산했고 항상 설정 한 경계에서 한 지점을 발견했다.
사용 벡터 - 수학 (무한 할 수있는 라인의 기울기 (경사) 주) –
는 당신이 우리에게 무엇을 수행 할 수 있습니다 : 2 개 라인을을, 그들은 시컨트하고 확인 교차점을 수동으로 계산하십시오. 대화식 Python 쉘 (IDLE 또는 PyCharm 또는 ...)에서 algorythm을 실행하십시오. 그것은 오류가 될 수있는 곳을 찾기에 충분해야합니다 ... –
나는 내 작업을 할 사람을 요구하지 않습니다. 나는 이미 내 두 벡터의 교차점을 수동으로 계산하고 항상 올바른 교차점을 발견했다. 그러나 코드에서 수학적 접근 방식을 변환하려고 할 때 언급 한 오류가있었습니다. – user3794592