在纵横坐标系中,由A点到B点连结组成一条线段,C点到D点连结组成另一条线段,怎样用一个函数来判断两条线段是否相交呢?SUB 判断是否相交(A,B,C,D) 请大家给出我,这里的东西吧! END SUB
大体的思路说一下,具体的VB函数我也不会写。直线AB, 直线CD,从直线AB上A点开始,取点E,判断E点是不是在直线CD上,如果在那AB和CD相交。如果不相交,那么E点的X坐标累加,直到整个直线AB都走完。下面是判断点在直线上的函数,我搜的 判断点P(x,y)与有向直线P1(x1,y1)-P2(x2,y2)之间的关系 Public Function fxpb(x1 As Double, y1 As Double, x2 As Double, x As Double, y As Double) As Integer '判断点P(x,y)与有向直线P1(x1,y1)-P2(x2,y2)之间的关系 '当点在直线上时返回0;当点在直线左侧时返回-1;当点在直线右侧时返回1 Dim xy As Double xy = (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1) If Abs(xy) <= 0.000001 Then fxpb = 0 Else If xy > 0# Then fxpb = 1 Else fxpb = -1 End If End If End Function
点的XY都在CD线的XY之内不就行了,
判斷線段AB和線段CD是否相交。 思路: (1)求出線段AB和CD所在直線的交點P(xP,yP)。’如果平行,則線段AB,CD不相交。 直線公式,y=kx+b '(把端點帶入方程,求出直線的方程的k,b) 然後根據兩個直線方程求交點P。 (2)判斷P(x,y)是否在其中一條線段內既可。 if (xA-xP)*(xB-xP)>0 then '相交 點P在線段內 else '無交點 點P不在線段內 end if
---quoting--- colorslife(霜水茶) 如 k1=(line1.y1-line1.y2)/(line1.x1-line1.x2) k2=(line2.y1-line2.y2)/(line2.x1-line2.x2) 如果k1=k2 then 平行 ---quoting ends---
判断斜率是否相等如 k1=(line1.y1-line1.y2)/(line1.x1-line1.x2) k2=(line2.y1-line2.y2)/(line2.x1-line2.x2)如果k1=k2 then 平行 否则 相交(平面中)--- 是这样吗?没测试过 ///*******************************************************我觉得可行
'计算直线(x1,y1)-(x2,y2)与直线(x3,y3)-(x4,y4)的交点(cx,cy),False无交点 Private Function GetPoint(ByVal x1 As Double, ByVal y1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal x3 As Double, ByVal y3 As Double, ByVal x4 As Double, ByVal y4 As Double, ByRef cx As Double, ByRef cy As Double) As Boolean Dim A As Double 'y=Ax+B Dim B As Double Dim C As Double 'y=Cx+D Dim D As Double'x=(B-D)/(C-A) If (x2 = x1) Then A = 10 ^ 20 Else A = (y2 - y1) / (x2 - x1) End If B = y1 - A * x1
If (x4 = x3) Then C = 10 ^ 20 Else C = (y4 - y3) / (x4 - x3) End If D = y3 - C * x3
If A = C Then GetPoint = False Exit Function End If
cx = (B - D) / (C - A) cy = A * cx + B GetPoint = True End Function以前写的,需要改一下再加上cx->[x1,x2]、[x3,x4],cy->[y1,y2]、[y3,y4]判断应该就可以了
判斷線段AB和線段CD是否相交。 思路: (1)求出線段AB和CD所在直線的交點P(xP,yP)。 y=kx+b '(把端點帶入方程,求出直線的方程的k1,k2,b1,b2) 然後根據兩個直線方程求交點P。 if P不存在 則兩綫段平行 else (2)判斷P(x,y)是否均在兩條綫段上!因爲有可能是其中一條的延長線與另一條綫段相交 if (xA-xP)*(xB-xP)<0&&(xC-xP)*(xD-xP)<0 '兩綫段相交 else '兩綫段不相交 end if具體代碼不記得了,回去查
VB能不能自定义结构体类型?/* type definition and prototype */ typedef struct { double x; double y; } point_t;double slope(point_t pt_start, point_t pt_end); /* type definition and prototype ends*/ 比较两条线的斜率: line A (A1, A2), 斜率: slope(A1, A2); line B (B1, B2), 斜率: slope(B1, B2);
楼主提了一个很高深的问题。见研究文献:精确实数计算在求两条直线段交点问题中的应用朱东晖 雍俊海 郑国勤 摘 要:求两条直线段的交点问题是计算机图形学、计算几何、几何造型等领域的最基本问题之一。精确实数计算是指以任意精度表示实数,并能进行计算,以任意精度得到结果。给出了一种把基于。LFT 方法的精确实数的表示与计算应用在求两条直线段的交点问题中的算法,该算法能够以任意的精度得到两条直线段的交点。关键词:精确实数计算;线性分式变换;直线段;交点 分类号:TP391 文献标识码:A 文章编号:1001-3695(2005)11-0139-02Intersection of Two Line Segments Using Exact Real ArithmeticZHU Dong-hui YONG Jun-hai ZHENG Guo-qin
基金项目:国家"973"计划资助项目(2004CB719400);国家自然科学基金资助项目(60403047) 作者简介:朱东晖(1974-),男,吉林人,硕士研究生,主要研究方向为计算机软件; 作者简介:雍俊海(1973-),男,福建人,副教授,主要研究方向为计算机图形学、计算机辅助设计、计算机动画与软件工程; 作者简介:郑国勤(1967-),男,浙江人,副教授,主要研究方向为计算机辅助设计. 作者单位:朱东晖(清华大学,软件学院,北京,100084) 雍俊海(清华大学,软件学院,北京,100084) 郑国勤(清华大学,软件学院,北京,100084) 参考文献:[1]刘强,陈玉健,孙家广.论两条直线段的求交[J].计算机学报,1997,20(12):1119-1123. [2]Potts P J. Exact Real Arithmetic Using M(o)bius Transformations[D]. London: Imperial College of Science, Technology and Medicine, 1998. 1-284. [3]Ménissier-Morain V. Arbitrary Precision Real Arithmetic: Design and Algorithms[EB/OL].ftp:∥ftp.inria.fr/INRIA/Projects/cristal/Valerie.Menissier/submission_JSC.ps.gz, 1997. [4]Turing A. On Computable Numbers, with an Application to the Entscheidungs Problem,A Correction[J]. Proceedings of the London Mathematical Society,1937, 43(2): 544-546. [5]Vuillemin J. Exact Real Computer Arithmetic with Continued Fractions[J]. IEEE Transaction Computer, 1990,39(8):1097-1105. [6]孙家广,等.计算机图形学[M].北京:清华大学出版社,1989. [7]Heckmann R. Big Integers and Complexity Issues in Exact Real Arithmetic[J/OL].http://www.elsevier.nl/locate/entcs/volume13.html,1998. 收稿日期:2004年10月15日修稿日期:2004年12月8日出版日期:2005年11月1日
这个问题还能问住这么多人?? 平面解析几何的小问题了; 线段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 )
向量叉积法 VB 版(不知是否好用):Public Type Dot x As Double y As Double End TypePublic Type Line a As Dot b As Dot End TypePublic 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
我忽然发现,很多人并没有认真地看贴。大多数是在拍脑袋。 另外,我所引用的东西,并非我的创意,而是既有的科学成果。例如,向量叉积法是教科书上的方法。canjianchangkong(残剑长空): >of123() 提到 >利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。 >否则,相交。>鄙人覺得,這仍然是必要條件,注意樓主所說,是綫段!>若按照你所言,>—————— A> | B > | > |>A綫段滿足兩端點在B綫段兩側,但兩綫段仍不相交;**不知你注意到没有,上面的算法是两条线交替测试的,两次测试都通过才认为相交。也就是还要测试线段 B 是否在线段 A 两侧。我猜你是没有看代码,或者没有看懂。treesong(treesong) 提出的思路,其实就是此算法。不过如你所说,不能仅仅测一次。wanghui0380(放歌): >我晕 >随便在直线上取两个点,计算出斜率不就成了>前提 >1。直线那就一定是y=ax+b这种的>结论 >1.知道y=ax+b,取得a,不是和尚头上得虱子 >2。y=ax+b,y1=a1x1+b1,你只要判断a,a1,b,b1不就接了 >上面我说得直线 >如果是线段:也不用不了那么复杂嘛 >直接把线段当成直线,斜率不同,计算出交点 >判断是不是在两条线段得交集内不就成了在计算学领域,精确计算直线的交点也不是你所说的“不用不了那么复杂”的课题。计算机所表达的实数精度有限,很可能理论值相同的点在实际计算上无法判断为同一点。这个问题甚至比判断有无交点本身更困难。否则,这个问题不会成为国家科研基金支持的课题。 我的结论,对于貌似简单的问题不要自作聪明。虽然你一定是聪明过人,但你不一定是这个领域的专家。
>利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。 >否则,相交。>鄙人覺得,這仍然是必要條件,注意樓主所說,是綫段!>若按照你所言,>—————— A> | B > | > |>A綫段滿足兩端點在B綫段兩側,但兩綫段仍不相交;(忘了说了:)你所举的例子,就是“当其中一条线段的两个端点在另一条线段的同一侧时,不相交。”的一个例子。线段 B 的两个端点都在线段 A 的同一侧。注意,在逻辑学上,“当其中一条线段的两个端点在另一条线段的同一侧时,不相交。”与你所推论的(虽然你没有明白地说)“当其中一条线段的两个端点不在另一条线段的同一侧时,相交”(显然是错误的)并不等价。推论应该是“当两条线段中任何一条线段的两个端点都不在另一条线段的同一侧时,相交”。 对吧?
'添加2个line 控件 判断的时候直接点击窗口即可 '本程序判断2个line控件是否相交 Option Explicit Private Type POINTS x As Long y As Long End Type Private Sub IfDDx(a As POINTS, b As POINTS, c As POINTS, d As POINTS) Dim t1, t2, t3, t4 t1 = IfDxx(a, c, d) t2 = IfDxx(b, c, d) t3 = IfDxx(c, a, b) t4 = IfDxx(d, a, b) If t1 * t2 <= 0 And t3 * t4 <= 0 Then MsgBox "相交" Else MsgBox "不相交" End If End Sub Private Function IfDxx(p1 As POINTS, pp1 As POINTS, pp2 As POINTS) As Single Dim k As Single, c As Single, sg As Integer k = -(pp1.y - pp2.y) / (pp1.x - pp2.x) c = -pp1.y - k * pp1.x Print k, c, p1.y + k * p1.x + c sg = Sgn(p1.y + k * p1.x + c) IfDxx = sg End Function Private Sub Form_Click() Dim P(3) As POINTS P(0).x = Line1.X1 P(0).y = Line1.Y1 P(1).x = Line1.X2 P(1).y = Line1.Y2 P(2).x = Line2.X1 P(2).y = Line2.Y1 P(3).x = Line2.X2 P(3).y = Line2.Y2 IfDDx P(0), P(1), P(2), P(3) End Sub
请大家给出我,这里的东西吧!
END SUB
请大家给出我,这里的东西吧!
END SUB
k2=(line2.y1-line2.y2)/(line2.x1-line2.x2)如果k1=k2 then 平行 否则 相交(平面中)---
是这样吗?没测试过
则如果(a1-a2)/(b1-b2)=(c1-c2)/(d1-d2)则两直线平行
请大家给出我,这里的东西吧!
END SUB
判断点P(x,y)与有向直线P1(x1,y1)-P2(x2,y2)之间的关系
Public Function fxpb(x1 As Double, y1 As Double, x2 As Double, x As Double, y As Double) As Integer
'判断点P(x,y)与有向直线P1(x1,y1)-P2(x2,y2)之间的关系
'当点在直线上时返回0;当点在直线左侧时返回-1;当点在直线右侧时返回1
Dim xy As Double
xy = (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1)
If Abs(xy) <= 0.000001 Then
fxpb = 0
Else
If xy > 0# Then
fxpb = 1
Else
fxpb = -1
End If
End If
End Function
思路:
(1)求出線段AB和CD所在直線的交點P(xP,yP)。’如果平行,則線段AB,CD不相交。
直線公式,y=kx+b '(把端點帶入方程,求出直線的方程的k,b)
然後根據兩個直線方程求交點P。
(2)判斷P(x,y)是否在其中一條線段內既可。
if (xA-xP)*(xB-xP)>0 then
'相交 點P在線段內
else
'無交點 點P不在線段內
end if
>
> 我要的是准确答案,不是思路,当然准确答案中要列出思路。
人家说的这么清楚了,你还不会写啊:- )
---quoting---
colorslife(霜水茶)
如 k1=(line1.y1-line1.y2)/(line1.x1-line1.x2)
k2=(line2.y1-line2.y2)/(line2.x1-line2.x2)
如果k1=k2 then 平行
---quoting ends---
k2=(line2.y1-line2.y2)/(line2.x1-line2.x2)如果k1=k2 then 平行 否则 相交(平面中)---
是这样吗?没测试过
///*******************************************************我觉得可行
Private Function GetPoint(ByVal x1 As Double, ByVal y1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal x3 As Double, ByVal y3 As Double, ByVal x4 As Double, ByVal y4 As Double, ByRef cx As Double, ByRef cy As Double) As Boolean
Dim A As Double 'y=Ax+B
Dim B As Double
Dim C As Double 'y=Cx+D
Dim D As Double'x=(B-D)/(C-A)
If (x2 = x1) Then
A = 10 ^ 20
Else
A = (y2 - y1) / (x2 - x1)
End If
B = y1 - A * x1
If (x4 = x3) Then
C = 10 ^ 20
Else
C = (y4 - y3) / (x4 - x3)
End If
D = y3 - C * x3
If A = C Then
GetPoint = False
Exit Function
End If
cx = (B - D) / (C - A)
cy = A * cx + B
GetPoint = True
End Function以前写的,需要改一下再加上cx->[x1,x2]、[x3,x4],cy->[y1,y2]、[y3,y4]判断应该就可以了
思路:
(1)求出線段AB和CD所在直線的交點P(xP,yP)。
y=kx+b '(把端點帶入方程,求出直線的方程的k1,k2,b1,b2)
然後根據兩個直線方程求交點P。
if P不存在 則兩綫段平行
else
(2)判斷P(x,y)是否均在兩條綫段上!因爲有可能是其中一條的延長線與另一條綫段相交
if (xA-xP)*(xB-xP)<0&&(xC-xP)*(xD-xP)<0
'兩綫段相交
else
'兩綫段不相交
end if具體代碼不記得了,回去查
typedef struct
{
double x;
double y;
} point_t;double slope(point_t pt_start, point_t pt_end);
/* type definition and prototype ends*/
比较两条线的斜率: line A (A1, A2), 斜率: slope(A1, A2);
line B (B1, B2), 斜率: slope(B1, B2);
分类号:TP391 文献标识码:A
文章编号:1001-3695(2005)11-0139-02Intersection of Two Line Segments Using Exact Real ArithmeticZHU Dong-hui YONG Jun-hai ZHENG Guo-qin
基金项目:国家"973"计划资助项目(2004CB719400);国家自然科学基金资助项目(60403047)
作者简介:朱东晖(1974-),男,吉林人,硕士研究生,主要研究方向为计算机软件;
作者简介:雍俊海(1973-),男,福建人,副教授,主要研究方向为计算机图形学、计算机辅助设计、计算机动画与软件工程;
作者简介:郑国勤(1967-),男,浙江人,副教授,主要研究方向为计算机辅助设计.
作者单位:朱东晖(清华大学,软件学院,北京,100084)
雍俊海(清华大学,软件学院,北京,100084)
郑国勤(清华大学,软件学院,北京,100084) 参考文献:[1]刘强,陈玉健,孙家广.论两条直线段的求交[J].计算机学报,1997,20(12):1119-1123.
[2]Potts P J. Exact Real Arithmetic Using M(o)bius Transformations[D]. London: Imperial College of Science, Technology and Medicine, 1998. 1-284.
[3]Ménissier-Morain V. Arbitrary Precision Real Arithmetic: Design and Algorithms[EB/OL].ftp:∥ftp.inria.fr/INRIA/Projects/cristal/Valerie.Menissier/submission_JSC.ps.gz, 1997.
[4]Turing A. On Computable Numbers, with an Application to the Entscheidungs Problem,A Correction[J]. Proceedings of the London Mathematical Society,1937, 43(2): 544-546.
[5]Vuillemin J. Exact Real Computer Arithmetic with Continued Fractions[J]. IEEE Transaction Computer, 1990,39(8):1097-1105.
[6]孙家广,等.计算机图形学[M].北京:清华大学出版社,1989.
[7]Heckmann R. Big Integers and Complexity Issues in Exact Real Arithmetic[J/OL].http://www.elsevier.nl/locate/entcs/volume13.html,1998.
收稿日期:2004年10月15日修稿日期:2004年12月8日出版日期:2005年11月1日
到这里看原文:
http://www.wanfangdata.com.cn/qikan/periodical.Articles/jsjyyyj/jsjy2005/0511/051150.htm
http://www.programfan.com/club/showbbs.asp?id=84387&page=2
你把问题想得太简单了。你在纸上画一画就知道了:
一线段的一个端点(X1, Y1)在另一线段两端点坐标值之间(X2<X1<X3,Y2<Y1<Y3)仅仅是相交的必要条件,不是充分条件。因此你的方法只能排除那些两线段所在矩形互不相交的情况,不是全部,所以还是不能解决问题。iegrhn(该有的会有的)、scjpsz1860():
你们在理论上都是正确的,但现在的问题是在计算机上如何实现。计算机计算两线段交点已经是国家科研基金资助的研究项目。你该不会建议楼主也进入这个研究方向吧。
*
利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。
否则,相交。
*/
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-02A Fast Algorithm for Line Intersection Testing on 4-geometryWANG 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.
收稿日期:2005年6月5日出版日期:2005年11月5日
平面解析几何的小问题了;
线段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 )
x As Double
y As Double
End TypePublic Type Line
a As Dot
b As Dot
End TypePublic 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
完全不需要做两点运算只需要判断Y轴坐标就可以了判断条件为[(YA0>=YB0)&&(YA1<=YB1)]||[(YA0<=YB0)&&(YA1>=YB1)]画个图就知道了,两条线段,注意是线段相交的条件就在于其在平面坐标轴上是交叉状态,也就是说在两对端点中必须有势差的存在。---势差为0的情况为两条线段重合,也可以认为是相交的特例。如是而已以上判断仅仅针对线段。
2. 求AB,CD所在直线的交点E
2. 如果(EA,EB 斜率之积) 与 (EC,ED 斜率之积)的和<=0,则有交点
利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。
否则,相交。鄙人覺得,這仍然是必要條件,注意樓主所說,是綫段!若按照你所言,—————— A | B
|
|A綫段滿足兩端點在B綫段兩側,但兩綫段仍不相交;思路一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的延長線上,而兩綫段並不相交的情況。這種思路的代碼不會寫,還望高手提供。
随便在直线上取两个点,计算出斜率不就成了前提
1。直线那就一定是y=ax+b这种的结论
1.知道y=ax+b,取得a,不是和尚头上得虱子
2。y=ax+b,y1=a1x1+b1,你只要判断a,a1,b,b1不就接了
定义两个Line对象
使用Line对象的一个方法就可以判断是否与另一个形状对象(任意的形状)相交.
具体什么方法名称我一时想不起来了,你可以在对象的实例后点个点在方法列表中查一下.
要不你查一下MSDN中GDI+的相关内容.
另外,我所引用的东西,并非我的创意,而是既有的科学成果。例如,向量叉积法是教科书上的方法。canjianchangkong(残剑长空):
>of123() 提到
>利用向量的叉积性质,当其中一条线段的两个端点在另一条线段的同一侧时,不相交。
>否则,相交。>鄙人覺得,這仍然是必要條件,注意樓主所說,是綫段!>若按照你所言,>—————— A> | B
> |
> |>A綫段滿足兩端點在B綫段兩側,但兩綫段仍不相交;**不知你注意到没有,上面的算法是两条线交替测试的,两次测试都通过才认为相交。也就是还要测试线段 B 是否在线段 A 两侧。我猜你是没有看代码,或者没有看懂。treesong(treesong) 提出的思路,其实就是此算法。不过如你所说,不能仅仅测一次。wanghui0380(放歌):
>我晕
>随便在直线上取两个点,计算出斜率不就成了>前提
>1。直线那就一定是y=ax+b这种的>结论
>1.知道y=ax+b,取得a,不是和尚头上得虱子
>2。y=ax+b,y1=a1x1+b1,你只要判断a,a1,b,b1不就接了
>上面我说得直线
>如果是线段:也不用不了那么复杂嘛
>直接把线段当成直线,斜率不同,计算出交点
>判断是不是在两条线段得交集内不就成了在计算学领域,精确计算直线的交点也不是你所说的“不用不了那么复杂”的课题。计算机所表达的实数精度有限,很可能理论值相同的点在实际计算上无法判断为同一点。这个问题甚至比判断有无交点本身更困难。否则,这个问题不会成为国家科研基金支持的课题。
我的结论,对于貌似简单的问题不要自作聪明。虽然你一定是聪明过人,但你不一定是这个领域的专家。
>否则,相交。>鄙人覺得,這仍然是必要條件,注意樓主所說,是綫段!>若按照你所言,>—————— A> | B
> |
> |>A綫段滿足兩端點在B綫段兩側,但兩綫段仍不相交;(忘了说了:)你所举的例子,就是“当其中一条线段的两个端点在另一条线段的同一侧时,不相交。”的一个例子。线段 B 的两个端点都在线段 A 的同一侧。注意,在逻辑学上,“当其中一条线段的两个端点在另一条线段的同一侧时,不相交。”与你所推论的(虽然你没有明白地说)“当其中一条线段的两个端点不在另一条线段的同一侧时,相交”(显然是错误的)并不等价。推论应该是“当两条线段中任何一条线段的两个端点都不在另一条线段的同一侧时,相交”。
对吧?
楼主提了一个很高深的问题。见研究文献:---------------------
这算什么高深问题?VB我不会。但是我用Java和Delphi和Javacript都实现过这个函数,代码不超过五十行。
楼主提了一个很高深的问题。见研究文献:---------------------
这算什么高深问题?VB我不会。但是我用Java和Delphi和Javacript都实现过这个函数,代码不超过五十行。
斜率是不是相等?
不相等就相交。
END SUB
2. 求AB,CD所在直线的交点E
3. 如果(EA,EB 斜率之积) 与 (EC,ED 斜率之积)的和<=0,则有交点
L2 = C*(1-b) + D*b算交点 A*(1-a) + B*a = C*(1-b) + D*b如果交点 a b 在[0-1]之间说明有交点
vansoft(Vansoft Workroom) ( ) 信誉:55 2006-04-28 21:41:00 得分: 0
取二条线段的长度,循环其中一条短的所有的点,
判断是否在长的那一条中.只是效率低了点.
--- quoting ends ---
不是效率低,是根本就不可能实现。一段lcm长的线段,你准备从它上面取多少点来测试,3个,5个,10个,20个,100个?
1 先判断是否平行或者重合(用矢积是否为0判断) ,是则没有交点,不是则转下步
2 求交点
比如直线AB与直线CD
a)先求D到AB的垂线矢DT(求AD在AB上的投影矢,矢端就是T点)
b)在直线AB求一条矢量AL,在DT上的投影矢等于DT,则L就是交点
3 判断交点是否在两条直线上,用交点跟两个端点的连线矢量的数积的正负来判断,为负则在,为正不在
4 交点在两直线上,则相交;如果不在其中任意一条直线而在延长线上,则不相交
-----------------
不要迷信什么专家?
我在java SVG编辑器中编写的采用矢量变换计算两直线交点的方法,不解方程,运行已经超过两年了,代码数了数,才40行,昨天还多说了;四年前用delphi编写的电力图元CAD程序中,用的也是同样办法。强烈鄙视那些拿破烂小玩意骗取国家资金的所谓“计算机图形学专家”
呀!真的碰到专家了。
能否将你的代码与兄弟共享?
---------------
做梦也没有想到这也算"国家"973"计划资助项目国家自然科学基金资助项目"。从2002年做图形编程到现在,Javascript、Java和delphi下都做过,连直线和贝塞尔曲线的交点都求过,总觉得平平常常。现在突然发现教授们竟然拿这个申请什么科学基金!偶不会VB,用上述三种语言都可以实现15到16位有效数字,算任意精度吧。如果还嫌不够,可以用java的BigDecimal代替双精度,实现几百位的精度也是没有问题的。
呀!真的碰到专家了。
能否将你的代码与兄弟共享?
----------------
到这里去看吧 !
http://blog.csdn.net/cxz7531/archive/2006/04/29/696991.aspx
然后设一y可使得x1=x2,就得出了:k1*y=k2*y,这样就可以得出y了,然后根据任意一个直线表达式可以得出x的值。当然具体用来解直线方程的函数我没有去想,应该还要化点时间才弄得出来的。
不知道大花猫是否愿意把你那50行代码贡献出来,,,
有这水平,证明你的智商确实比我们(至少比我)高20个点。
---------------------------------
到这里去看吧 !
http://blog.csdn.net/cxz7531/archive/2006/04/29/696991.aspx
是delphi做的,但算法可以推广到别的语言。同样的原理也可以用于求别的几何问题,甚至三维空间中的几何分析问题
'本程序判断2个line控件是否相交
Option Explicit
Private Type POINTS
x As Long
y As Long
End Type
Private Sub IfDDx(a As POINTS, b As POINTS, c As POINTS, d As POINTS)
Dim t1, t2, t3, t4
t1 = IfDxx(a, c, d)
t2 = IfDxx(b, c, d)
t3 = IfDxx(c, a, b)
t4 = IfDxx(d, a, b)
If t1 * t2 <= 0 And t3 * t4 <= 0 Then
MsgBox "相交"
Else
MsgBox "不相交"
End If
End Sub
Private Function IfDxx(p1 As POINTS, pp1 As POINTS, pp2 As POINTS) As Single
Dim k As Single, c As Single, sg As Integer
k = -(pp1.y - pp2.y) / (pp1.x - pp2.x)
c = -pp1.y - k * pp1.x
Print k, c, p1.y + k * p1.x + c
sg = Sgn(p1.y + k * p1.x + c)
IfDxx = sg
End Function
Private Sub Form_Click()
Dim P(3) As POINTS
P(0).x = Line1.X1
P(0).y = Line1.Y1
P(1).x = Line1.X2
P(1).y = Line1.Y2
P(2).x = Line2.X1
P(2).y = Line2.Y1
P(3).x = Line2.X2
P(3).y = Line2.Y2
IfDDx P(0), P(1), P(2), P(3)
End Sub