簡體   English   中英

線段相交算法

[英]line segment intersection algorithm

我正在閱讀《算法簡介》一書,以實現線段交點,並且對使用該算法獲得的結果感到困惑。 我必須在算法中缺少某些內容,需要一些幫助才能找到它。 檢查以下代碼段:

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

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

如您所見,兩條線是使用上面定義的坐標來表示的,並且您還可以想象輪廓線​​是由輪廓線開始和輪廓線結束來表達的,而希爾伯特線則可以由希爾伯特線開始和希爾伯特線來表達。 而且這兩條線不可能相交。 不幸的是,該算法告訴我有一個交叉點,這讓我很困惑。 下面是其余的代碼:

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

在此過程中我有什么想念的嗎?

謝謝

這里:

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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM