两条线段是否相交

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

平面解析几何的小问题了;
线段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 Double
End Type

Public Type Line
 a As Dot
 b As Dot
End Type

Public iscross(a As Line, b As Line) As Long
Dim v1 As Double,v2 As Double,v3 As Double,v4 As Double
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 Then    //同符号,在一边
iscross = 0
Exit Funtion
End If
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 Then  //同符号,在一边
iscross = 0
Exit Funtion
End If
iscross = 1
End Function

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

下面理论有误只供学习!

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

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

若按照你所言,

——————  A

  |       B
  |
  |

 

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

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

 

思路一

1.看兩條綫段所在直綫,是否平行
case1平行,break
case2相交,交點為P
2.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的延長線上,而兩綫段並不相交的情況。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值