2011-11-11 1 views
1

同列の私のコードはうまくいかず、その地獄が私の中から退屈です。ポイントクラスで2つのポイントを使用してラインクラスを使用する最善の方法はありますか?私のコリネアールティのテストはクラッシュしているので、私は過去数日の間、骨抜きに詰まっています。これは、2つの線が同一線上にあるかどうかを調べる正しい方法ですか?

相続人
bool line::isColinear(line) 
{ 
    bool line2=false; 
    line l1,l2; 

    if (l1.slope()==l2.slope()) 
    { 
     if (l1.y_int()==l2.y_int()) 
     { 
      line2 =true; 
      return line2; 
     } 
    } 
    else 
    { 
     line2 =false; 
    } 

} 

//私のラインクラスのコピー

class line 
{ 
    private: 

    point p1,p2; 

    public: 

    bool isColinear(line); 
    bool isParallel(line); 
    point solve(line); 
    double slope(); 
    double y_int(); 
    void Display(ostream&); 
}; 
+4

「動作していないようですか?それは私たちにはあまり意味がありません。この関数は、線のうち何も返さないので、何か間違っています。あなたは他の機能をテストしましたか? – Beta

+0

デバッガで実行しましたか?それは、あなたがどこでクラッシュしたのか(そしておそらくそれが理由である)を知る助けになります。 –

+3

このコードはすべて間違っています。常に 'true'を返す関数を書いてみて、それを働かせてからビルドしてください。そして今、答えを受け入れる。 – Beta

答えて

2
  1. 2点の間に線を保存しています。 X1X2と等しい場合は直線の傾きは通常

    slope = (y2 - y1)/(x2 - x1)

として定義されている、あなたはゼロエラー/例外によって除算を持つことができます。あなたは、整数として座標、あなたは全体でダブルスを使用している場合は、

  • 期待するものを手に入れるだけで整数の除算を行うことなくできた点にしてください保存している場合

    1. について注意する

      その他のもの

  • 1

    あり、本当に間違っている何が起こっているのかを判断するために、ここではほぼ十分ではありませんので、いくつかの一般論:

    • がフローティング比較することはありません値が等しいかどうかを直接指定します。それは時間の驚くほどの量を動作させません。代わりに、あなたは(通常、私たちは「イプシロン」と呼んで)「ゼロ」と、それを呼び出すことがコンテンツだほど少量でその違いを比較:

      if (abs((num1 - num2)) < 0.001) { 
          /* pretend they're equal */ 
      } else { 
          /* not equal */ 
      } 
      
    • line2は、この例では不要です。結論から直接trueまたはfalseを返すかもしれません。多くの場合、return trueまたはreturn falseでも不必要に混乱します。このメソッドを少し書き換えたとします。3つのメソッドがあります。 (どちらか、または改善ではないかもしれませんただ、少しのためにそれを前提としています。。)

      bool line::compare_slope(line l2) { 
          return fabs((l2.slope() - self.slope()) < 0.001; // don't hardcode this 
      } 
      
      bool line::compare_origin(line l2) { 
          return fabs((l2.y_int() - self.y_int()) < 0.001; // nor this 
      } 
      
      bool line::is_colinear(line l2) { 
          return compare_slope(l2) && compare_origin(l2); 
      } 
      

      ないtrueまたはfalseハードコードされた任意の場所に - 代わりに、あなたはtruefalseを計算するために、条件文の値に依存しています。 (ちなみに、これらの関数の繰り返しは、関数floating_comparison(double f1, double f2, double epsilon)がプロジェクト全体のεを変更するか、問題の浮動小数点数の絶対値に基づいてεを計算するほうがはるかに簡単になることを示している)

    1

    私の推測では、l1l2が初期化されていないことから、そのslope方法は、ゼロ除算を行っているということですそれらを比較するときの公差を使用しています。それらを適切に初期化するか、適切な変数に切り替えると、クラッシュが修正されます。

    一度作業しても、テストは失敗する可能性があります。浮動小数点数を比較することはできませんし、たとえ同じである必要があると思われる場合でも、浮動小数点数は等しいと見なすことはできません。 What Every Computer Scientist Should Know About Floating-Point Arithmeticとお読みください。

    0

    here由来)(2Dにおける)ラインの単純な式は:

    P1(x1、y1)とP2(X2、Y2)の行を決定する点です。

    (Y-Y1)(X2-X1)+(Y1-Y2)(X-X1)= 0(のは、F(X、Yを使用してみましょう)= 0)

    かどうかを試験するために2つの線は、第2の線が点P3(x3、y3)、P4(x4、y4)によって定義されると想像する。

    これらの線が「全く同じ」であることを確認するには、2番目の線を決定する2つの点(P3、P4)が前の線に「十分」に近いかどうかをテストする必要があります。

    これは、f(x3、y3)とf(x4、y4)を計算することによって簡単に実行できます。これらの値が0に近い場合、線は同じです。

    Pseudocode: 
    // I would chose tolerance around 1 
    if (f(x3,y3) < tolerance && f(x4,y4) < tolerance) 
    { 
        // line P1,P2 is the same as P3,P4 
    } 
    
    関連する問題