2016-06-22 6 views
-3

私のソフトウェアでは、2本の線の交点を計算しようとしています。最初の行には4つの二重変数(xは2つ、yは2つ)から始まり、2行目は4つの二重変数から始めます。数学は私には分かりやすく、紙の上ではうまくいきます。さらに処理するために、私はCSVファイルに交点を保存する必要があります。しかし、私がファイルを開くとき、私が持っているのは-1.#INDです。私が理解するところではnegative infiniteまたはNot A Numberを意味します。だから私のコード:2行の交点の計算結果は-1です。CSVファイル内の#IND

だから私は2つのベクトルから4点の座標を取得します。

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; 

座標を使って、私は2つの線の方程式を設定することができます。次のステップでは、変数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関数をmodefyingすることです。私はこのコードを使用する必要があり作業にそれを取得するには:

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

私は誰にも私の仕事を依頼していません。私はすでに私の2つのベクトルの交点を手動で計算し、正しい交点を常に見つけました。しかし、コードで数学的なアプローチを変換しようとすると、私は言及エラーがあった。 – user3794592

答えて

1

0で除算を確認してください。 AB_xCD_xは0

+0

私はそれを見ますが、どうすればそれを避けることができます。私は、AB_xまたはCD_xが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

別の良い説明:[ラインの交差点](https:// www。 topcoder.com/community/data-science/data-science-tutorials/geometry-concepts-line-intersection-and-its-applications/) – prashkr

関連する問題