急求一段VB代码:空间两直线的距离或交点

mengshuai1982 2008-05-16 02:46:03
诸位高手:
两条空间直线,
如果相交就输出交点坐标,
如果不相交就输出两条直线的距离。
VB代码,非常感谢!!!
急急急!
...全文
538 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vbman2003 2008-05-17
  • 打赏
  • 举报
回复
恩,看错题意了....
立体几何?早还给老师了......
mengshuai1982 2008-05-17
  • 打赏
  • 举报
回复
to vbman2003: 谢谢!可惜,阁下这个是平面的。
vbman2003 2008-05-17
  • 打赏
  • 举报
回复
前不久写过一个判断二直线是否相交的代码,你改一下就应该可以得到你要的结果:


Option Explicit

Private Type Point
X As Double
Y As Double
End Type

Private Type Lines
P1 As Point
P2 As Point
End Type

Const CROSS As Long = 0 '两直线相交
Const COLINE As Long = 1 '两直线重合
Const PARALLEL As Long = 2 '两直线平行

'判断与计算交点
Private Function GetPoint(L1 As Lines, L2 As Lines, P As Point) As Long
Dim A1 As Double, B1 As Double, C1 As Double
Dim A2 As Double, B2 As Double, C2 As Double
Dim D As Double, R As Double

A1 = L1.P2.Y - L1.P1.Y
B1 = L1.P1.X - L1.P2.X
C1 = L1.P2.X * L1.P1.Y - L1.P1.X * L1.P2.Y

A2 = L2.P2.Y - L2.P1.Y
B2 = L2.P1.X - L2.P2.X
C2 = L2.P2.X * L2.P1.Y - L2.P1.X * L2.P2.Y

D = A1 * B2 - A2 * B1
If D = 0 Then
If (B1 * C2 <> B2 * C1) Or (A1 * C2 <> A2 * C1) Then
GetPoint = PARALLEL '平行
Else
GetPoint = COLINE '重合
End If
Else
'返回交点
P.X = (A1 * C2 - A2 * C1) / D
P.Y = (C1 * B2 - C2 * B1) / D
Print P.X; P.Y
GetPoint = CROSS '相交
End If
End Function

Private Function GetLine( _
ByVal X1 As Double, _
ByVal Y1 As Double, _
ByVal X2 As Double, _
ByVal Y2 As Double _
) As Lines
Dim L As Lines
With L
.P1.X = X1
.P1.Y = Y1
.P2.X = X2
.P2.Y = Y2
Line (.P1.X, .P1.Y)-(.P2.X, .P2.Y)
End With
GetLine = L
End Function

'测试:
Private Sub Command1_Click()
Dim L1 As Lines, L2 As Lines
Dim P As Point
Dim n As Long

Me.Scale (-50, 30)-(50, -30)

Me.Cls
L1 = GetLine(-20, 20, 40, -40)
L2 = GetLine(-10, 10, 20, -20)
n = GetPoint(L1, L2, P)
MsgBox Choose(n + 1, "相交", "重合", "平行")

Me.Cls
L1 = GetLine(-10, 10, 20, -30)
L2 = GetLine(-10, 10, 20, -20)
n = GetPoint(L1, L2, P)
MsgBox Choose(n + 1, "相交", "重合", "平行")

Me.Cls
L1 = GetLine(-10, 20, 20, -10)
L2 = GetLine(-10, 10, 20, -20)
n = GetPoint(L1, L2, P)
MsgBox Choose(n + 1, "相交", "重合", "平行")

End Sub

mengshuai1982 2008-05-17
  • 打赏
  • 举报
回复
非常感谢Chen8013!我再找找矩阵运算的函数:)
舉杯邀明月 2008-05-17
  • 打赏
  • 举报
回复
恐怕不能说“道理一样”吧!
要是真能说“道理一样”,哪只能稍微复杂一点儿而已,可实际上不是“复杂一点儿”,而是复杂很多了很多、很多倍!
vbman2003 2008-05-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Chen8013 的回复:]
引用 8 楼 vbman2003 的回复:
恩,看错题意了....
立体几何?早还给老师了......


三维比二维只多一维,但是处理起来复杂一两个数量级....

^_^
[/Quote]
是啊,不过道理一样
老了,不想再去复习数学了....呵呵
舉杯邀明月 2008-05-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vbman2003 的回复:]
恩,看错题意了....
立体几何?早还给老师了......
[/Quote]

三维比二维只多一维,但是处理起来复杂一两个数量级....

^_^
舉杯邀明月 2008-05-16
  • 打赏
  • 举报
回复
说一下思路吧:

1. 第一条L1直线上取两个点:Pn1、Pn2。
2. 第二条L2直线上取两个点:Pn3、Pn4。
3. Pn1、Pn2转换成向量V1,Pn3、Pn4转换成向量V2。
4. 把向量V2平移为V2',且与V1共起点。
5. 计算V1、V2'组成的平面Pa。
6. 计算点Pn3或Pn4到平面Pa的距离Dv。
  如果Dv不为0,则L1、L2不相交,距离为|Dv|;
  如果Dv为0,则L1、L2相交。若在第4.中的平移向量为Vm,Vm与V1的夹角为A,Vm与V2'的夹角为B,则|Vx|/SinA = |Vm|/SinB。按Pn1及Vx就可求出L1和L2的交点Px。

  上面提到的向量都是4X4的矩阵。在DirectX 3D中,矩阵运算都有现成的函数。但在VB中,第5.我不知道如何运算 -_-b

mengshuai1982 2008-05-16
  • 打赏
  • 举报
回复
Chen8013仁兄:思路也可以说一说啊
mengshuai1982 2008-05-16
  • 打赏
  • 举报
回复
谢谢,继续关注。。。
舉杯邀明月 2008-05-16
  • 打赏
  • 举报
回复
思路倒是有,代码不是很好写........
要用矩阵运算。

Up.....

809

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧