兩條線段共有三種相對位置,平行,相交和重合,題目如果給出兩條線段端點座標,然後判斷這兩條線段的相對位置,如果是相交還要算出交點座標。
可以用叉積來做,將兩條線段看做兩條向量
平行就是這兩條向量的叉積為0
重合就是他們首尾連線的向量與其中某條向量的叉積也為0
//先判斷兩條線段是否不平行(最好同時判斷是否有交點並且不平行,因為浮點運算不精確),然後計算兩條線段的交點。以下是c語言**:
#include#include
#define eps 1e-8 //精度,因為浮點數運算不精確
#define zero(x) (((x)>0?(x):-(x))struct
point;
//計算交叉乘積(p1-p0)x(p2-p0)
double
xmult(point p1,point p2,point p0) //
intdot_online_in(point p,point l1,point l2) //
intsame_side(point p1,point p2,point l1,point l2) //
判兩直線平行
intparallel(point u1,point u2,point v1,point v2) //
判三點共線
intdots_inline(point p1,point p2,point p3) //
判兩線段相交,包括端點和部分重合
intintersect_in(point u1,point u2,point v1,point v2) //
計算兩線段交點,請判線段是否相交(同時還是要判斷是否平行!)
point intersection(point u1,point u2,point v1,point v2)
int main(void
)
else
return0;
}
向量叉積之判斷兩條線段相交
詳情點選數學基礎之向量點乘與叉乘 常用的方法是通過向量叉乘來判斷,這種方法不需要算出直線方程 再判斷交點有否 在 實現上比較簡便。用這種方法判別線段是否相交一般分為兩步 1.快速排斥實驗 2.跨立實驗 首先判斷兩條線段在 x 以及 y 座標的投影是否有重合。也就是判斷乙個線段中 x 較大的端點是否小...
判斷兩條線段的相對位置
判斷兩條線段的相對位置,用int s1表示第一條線段,int s2表示第二條線段,即兩線段兩端點的座標為 s1 0 s1 1 s1 2 s1 3 和 s2 0 s2 1 s2 2 s2 3 如果兩線段沒有交點則返回 no 只有乙個交點則返回 point 多個交點則返回 segment public ...
兩條線段是否相交
可以通過叉積來判斷兩條線段是否相交,ab ac與ab ad的結果為異號,並且 cd ca與cd cb的結果為 異號,則兩條直線相交。b相交.判斷兩線段是否相交 1 快速排斥試驗 設以線段 p1p2 為對角線的矩形為 r,設以線段 q1q2 為對角線的矩形為 t,若 r t 不相交,則兩線段不可能相交...