[英]Use of Status structure in Plane sweep Algorithm for line Segment Intersection
[英]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.