2016-04-16 10 views
0

線分交点を実装するための「アルゴリズムの紹介」に従っており、アルゴリズムの結果と混同しています。私はアルゴリズム内で何かを見逃しているに違いない。それを見つけるためには何か助けが必要だ。あなたは二行は、上記で定義された座標を用いて配合されていることがわかりますし、あなたもhilbertLineがhilbertLineStartによって処方することができるのに対しcontourLineは、contourLineStartとcontourLineEndによって定式化されていることを想像できるように線分交点アルゴリズム

glm::i16vec2 contourLineStart(1057,1762); 
glm::i16vec2 contourLineEnd(1057,0); 

glm::i16vec2 hilbertLineStart(-1762,-2466); 
glm::i16vec2 hilbertLineEnd(-1734,-2466); 

:以下のコードスニペットをチェックとhilbertLineEnd。そして、これらの2本の線が交差する方法はありません。残念ながら、アルゴリズムは交差点があり、私を多く混乱させていると私に伝えています。ここにコードの残りの部分があります:

glm::i32 direction(const glm::i16vec2& pi, 
        const glm::i16vec2& pj, 
        const glm::i16vec2& pk) 
{ 
    return ((pk.x - pi.x)*(pj.y - pi.y)) - ((pj.x - pi.x)*(pk.y - pi.y)); 
} 

int main() 
{ 
    glm::i16vec2 contourLineStart(1057,1762); 
    glm::i16vec2 contourLineEnd(1057,0); 

    glm::i16vec2 hilbertLineStart(-1762,-2466); 
    glm::i16vec2 hilbertLineEnd(-1734,-2466); 

    glm::i16 d1 = direction(contourLineStart,contourLineEnd,hilbertLineStart); 
    glm::i16 d2 = direction(contourLineStart,contourLineEnd,hilbertLineEnd); 
    glm::i16 d3 = direction(hilbertLineStart,hilbertLineEnd,contourLineStart); 
    glm::i16 d4 = direction(hilbertLineStart,hilbertLineEnd,contourLineEnd); 


    if((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0) && 
     (d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)) 
    { 
    std::cout << "There is a intersection" << std::endl; 
    } 
    else 
    { 
    std::cout << "There is no intersection" << std::endl; 
    } 

return 0; 
} 

私はこのプロセスで何か欠けていますか?ここで

おかげ

+0

は、ここでは、オフトピックですので、私はスタックにこれを移動していますオーバーフロー。まず、コードをデバッグしようとする必要があります。手作業でコードを実行し、各行で何が起きているのかを見て、それが意味をなさないかどうかを確認します。私はここで16ビット整数を使用することについてかなり疑念があります。整数のオーバーフローを求めているようです。 –

+1

私はC++のエキスパートではありませんが、16ビット整数型の算術演算を行っているように見えます(中間結果はオーバーフローしています)。各乗算のオペランドを32ビットintにキャストしてみてください。 – Gene

+0

ヒントのおかげで、単純なintは正常に動作しました。私はあなたが16ビット整数について正しいと信じています。私は単純なintとしてそれらを再宣言し、今交差点のテストはうまくいくようです。 – sajis997

答えて

1

if((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0) && 
    (d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)) 

(a || b && c || d)のあいまいさを避けるために、いくつかの括弧を追加します。質問をコーディング

if(((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && 
    ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) 
関連する問題