利用向量叉積進行線段相交判斷。
時間複雜度θ(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向量...