29 幾何演算法 兩條線段相交檢測

2021-10-05 18:31:10 字數 2865 閱讀 7364

利用向量叉積進行線段相交判斷。

時間複雜度θ(1)

extern "c" class algorithmlib segmentintersection

; class linepoint

;

segmentintersection::linepoint::linepoint()

segmentintersection::linepoint::~linepoint()

segmentintersection::linepoint::linepoint(

math::point<2> pop_,

point_type type_)

segmentintersection::comparablelinegeometry::comparablelinegeometry()

segmentintersection::comparablelinegeometry::comparablelinegeometry(

const planegeometry::linegeometry& line_)

segmentintersection::comparablelinegeometry::~comparablelinegeometry()

bool segmentintersection::comparablelinegeometry::operator<(

const comparablelinegeometry& cline_)

else }

bool segmentintersection::comparablelinegeometry::operator==(const comparablelinegeometry& cline_)

else }

bool segmentintersection::comparablelinegeometry::operator!=(const comparablelinegeometry& cline_)

bool segmentintersection::comparablelinegeometry::operator>(const comparablelinegeometry& cline_)

segmentintersection::segmentintersection()

segmentintersection::~segmentintersection()

bool segmentintersection::run(

const planegeometry::linegeometry& line1_,

const planegeometry::linegeometry& line2_)

else if (_dir1 == geometry::rotate_direction::clock

&& _dir2 == geometry::rotate_direction::anticlock)

else if (_dir3 == geometry::rotate_direction::anticlock

&& _dir4 == geometry::rotate_direction::clock)

else if (_dir3 == geometry::rotate_direction::clock

&& _dir4 == geometry::rotate_direction::anticlock)

if (_bsect)

if (_dir1 == geometry::no_rotate

&& geometry::ispointonline(line2_, line1_.m_postart))

else if (_dir2 == geometry::rotate_direction::no_rotate

&& geometry::ispointonline(line2_, line1_.m_poend))

else if (_dir3 == geometry::rotate_direction::no_rotate

&& geometry::ispointonline(line1_, line2_.m_postart))

else if (_dir4 == geometry::rotate_direction::no_rotate

&& geometry::ispointonline(line1_, line2_.m_poend))

return _bsect;

}

p1 叉乘 p2 > 0,按右手定則,認為從向量p1經過逆時針旋轉到達p2

正確性證明:

直接證明法

假設線段1,線段2相交。

情形1:

則必有:

基於線段1,到達線段2起點和終點旋轉方向不同

情形2:

若端點為,線段1起點,則必有 線段2,不經旋轉到達線段1起點

此時,若進一步判斷,線段1起點位於線段2之上,則可證明相交。

由於演算法中,對端點的4種可能均進行了,判斷,

所以,演算法可以覆蓋到此類情形。

情形3:

多個交點,

此時必有線段1和線段2共線

此時若相交,則必須有重疊部分

如果重疊部分存在,則必有 被重疊段的起始端點位於另一線段之上

此時必有

另一線段不經過選轉即可到達被重疊段的起始端點+被重疊段的起始端點位於另一線段之上

演算法可以覆蓋到此類情形。

綜合,演算法在三種情形下,均可得到正確結果。正確性得證。

兩條線段是否相交

可以通過叉積來判斷兩條線段是否相交,ab ac與ab ad的結果為異號,並且 cd ca與cd cb的結果為 異號,則兩條直線相交。b相交.判斷兩線段是否相交 1 快速排斥試驗 設以線段 p1p2 為對角線的矩形為 r,設以線段 q1q2 為對角線的矩形為 t,若 r t 不相交,則兩線段不可能相交...

判斷兩條線段是否相交

如上圖,判斷線段ab和線段cd相交。分析 如果線段ab和線段cd相交,只能是圖中的兩種相交情況。可以用向量叉乘來判斷。如果 向量ab叉乘向量ac 向量ab叉乘向量ad 0 並且 向量cd叉乘向量ca 向量cd叉乘向量cb 0,那麼說明線段ab與線段cd相交。設a x1,y1 b x2,y2 c x3...

判斷兩條線段是否相交

題目 給定兩條線段,判斷這兩條線段是否相交,線段ab的表示形式是a x1,y1 b x2,y2 線段cd的表示形式為c x3,y3 d x4,y4 那麼我們如何判斷線段ab與線段cd是否相交。解析 在介紹如何解決線段相交問題之前,我們先介紹向量的叉積。如下圖所示 下面的圖 1 表示p1向量在p2向量...