两条线段是否相交

    技术2022-05-11  63

    高手发帖,个人终结,吸收精华

    平面解析几何的小问题了;线段A(x1,y1)-B(x2,y2),所在直线L1方程为F(x,y)=0;线段C(x3,y3)-D(x4,y4),所在直线L2方程为G(x,y)=0;思路:(即问题的充要条件)(点A与点B在直线L2两侧) AND (点C与点D在直线L1两侧);方法:如果点P(Xp,Yp)不在直线a*x+b*y+c=0上,则a*Xp+b*Yp+c<>0;如果用两个点的坐标代入同一直线方程a*x+b*y+c计算出的值异号,则两点在直线两侧;解法:(G(x1,y1)*G(x2,y2)<0) AND ( F(x3,y3)*F(x4,y4)<0 )

    //*******************************************************************************************************************

    比较传统的方法:*利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。否则,相交。*/struct dots{double x,y;};

    struct lines{struct dots a,b;};

    int iscross(struct lines m,struct lines n){double v1,v2,v3,v4;v1=(m.b.x-m.a.x)*(n.b.y-m.a.y) - (m.b.y-m.a.y)*(n.b.x-m.a.x);v2=(m.b.x-m.a.x)*(n.a.y-m.a.y) - (m.b.y-m.a.y)*(n.a.x-m.a.x);if(v1*v2>=0)return 0;v3=(n.b.x-n.a.x)*(m.b.y-n.a.y) - (n.b.y-n.a.y)*(m.b.x-n.a.x);v4=(n.b.x-n.a.x)*(m.a.y-n.a.y) - (n.b.y-n.a.y)*(m.a.x-n.a.x);if(v3*v4>=0)return 0;return 1;}

    一般先将矩形无交集的情况排除,再做叉集运算。算是一种优化吧。

    最近有一些新的研究成果:4-几何结构下测试线段相交性快速算法

    王洪申  强会英 

    摘 要:提出了一种4-几何结构下两线段相交性测试的快速算法.算法根据4-几何结构的特点,主要以加减运算和快速判断代替了过多使用乘法的传统判断线段相交性的算法,从而加快了算法速度.实验证明算法的性能良好.关键词:线段相交性测试;4-几何结构;交点;算法分类号:TP391  文献标识码:A 文章编号:1000-7180(2005)11-181-02

    A Fast Algorithm for Line Intersection Testing on 4-geometry

    WANG Hong-shen  Qiang Hui-ying   

    作者简介:王洪申,男,(1971-),硕士研究生,讲师.研究方向为计算机图形学、电路布图理论. 作者简介:强会英,女,(1973-),硕士研究生,讲师.研究方向为计算几何、图论. 作者单位:王洪申(西北工业大学机电工程学院,陕西,西安,710072)      强会英(兰州交通大学数理与软件工程学院,甘肃,兰州,730070) 

    参考文献:

    [1]洪先龙,朱祺,经彤,王垠,杨呖,蔡懿慈.非直角互连-布线技术发展的新趋势[J].半导体学报,2003,24(3):225.[2]孙家广.计算机图形学[M].北京:清华大学出版社,2000,418.[3]周培德.计算几何-算法分析与设计.北京:清华大学出版社,2002:137~138.[4]M Gavrilova, J G Rokne. Reliable Line Segment Intersection Testing. Computer-Aided Design, 2000, 32: 737~745.

    //****************************************************************************************************************

    向量叉积法 VB 版(不知是否好用):

    Public Type Dot x As Double y As DoubleEnd Type

    Public Type Line a As Dot b As DotEnd Type

    Public iscross(a As Line, b As Line) As LongDim v1 As Double,v2 As Double,v3 As Double,v4 As Doublev1 = (m.b.x-m.a.x)*(n.b.y-m.a.y) - (m.b.y-m.a.y)*(n.b.x-m.a.x)v2 = (m.b.x-m.a.x)*(n.a.y-m.a.y) - (m.b.y-m.a.y)*(n.a.x-m.a.x)If v1 * v2 >= 0 Then    //同符号,在一边iscross = 0Exit FuntionEnd Ifv3 = (n.b.x-n.a.x)*(m.b.y-n.a.y) - (n.b.y-n.a.y)*(m.b.x-n.a.x)v4 = (n.b.x-n.a.x)*(m.a.y-n.a.y) - (n.b.y-n.a.y)*(m.a.x-n.a.x)If v3 * v4 >= 0 Then  //同符号,在一边iscross = 0Exit FuntionEnd Ifiscross = 1End Function

    //*****************************************************************************************************************

    下面理论有误只供学习!

    of123() 提到利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。否则,相交。

    鄙人覺得,這仍然是必要條件,注意樓主所說,是綫段!

    若按照你所言,

    ——————  A

      |       B  |  |

     

    A綫段滿足兩端點在B綫段兩側,但兩綫段仍不相交;

    //******************但是这个时候:B綫段不滿足兩端點在A綫段兩側,所以仍不相交;(国际海员)注释

     

    思路一

    1.看兩條綫段所在直綫,是否平行case1平行,breakcase2相交,交點為P2.P均不在綫段A,B上。

    不過這樣還是麻煩,還是從相交的充要條件來判斷,

    但是treesong(treesong)所言

        线段A(x1,y1)-B(x2,y2),所在直线L1方程为F(x,y)=0;    线段C(x3,y3)-D(x4,y4),所在直线L2方程为G(x,y)=0;    思路:(即问题的充要条件)    (点A与点B在直线L2两侧) AND (点C与点D在直线L1两侧);    方法:    如果点P(Xp,Yp)不在直线a*x+b*y+c=0上,则a*Xp+b*Yp+c<>0;    如果用两个点的坐标代入同一直线方程a*x+b*y+c计算出的值异号,则两点在直线两侧;    解法:    (G(x1,y1)*G(x2,y2)<0) AND ( F(x3,y3)*F(x4,y4)<0 )

    這個想法正確,但是,由於應用的是直綫方程,所以判斷的還只是兩條直綫相交的充要條件,不嚴密,犯的仍然是上面的錯誤,即:存在綫段2的端點C在綫段1的延長線上,而兩綫段並不相交的情況。

    這種思路的代碼不會寫,還望高手提供。//******************************************************************************************************************* 


    最新回复(0)