明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9096|回复: 13

怎样判断一个点在一条直线上(vba)

  [复制链接]
发表于 2005-3-30 20:03 | 显示全部楼层 |阅读模式
rt
发表于 2005-6-11 14:27 | 显示全部楼层
垂距为零
发表于 2005-6-11 17:13 | 显示全部楼层
判断该直线与直线某端点的斜率与直线斜率是否相等。
发表于 2005-8-15 20:06 | 显示全部楼层

 该点到直线两端点的距离和等于直线的长度

发表于 2006-4-23 14:52 | 显示全部楼层

可以用VBA实现:

得到起点:line.startpoint

得到端点:line.endpoint

然后再照三楼的方法,三个点确定两个斜率,相等就在直线上,否则,就返回false值

发表于 2006-4-28 16:57 | 显示全部楼层

三楼的方法可以判断点是否在线段或线段的延长线上;

四楼的方法可以判断点是否在线段上。

如果三楼的判断成立而四楼的判断不成立则点在线段的延长线上。

发表于 2007-4-22 14:02 | 显示全部楼层

四楼ok

发表于 2007-6-10 00:57 | 显示全部楼层
计算误差很烦人,老是要判断
发表于 2007-6-17 12:11 | 显示全部楼层
本帖最后由 作者 于 2007-6-17 13:41:10 编辑

设直线的两端点分别AB, 判断任意点P在直线AB上否?

解:

    以直线的一端点A为起点, 另一端点B 和任意点P为终点的矢量分别设为V0V1. 任意点P
   
点和在直线AB上的话,外积(V0×V1)的大小为0.

即:

  ||V0×V1|| 0 --- 任意点P 在直线AB

    ||V0×V1|| <>0 --- 任意点P不在直线AB

式中:
   
×为矢量的外积运算符.

************************************************

具体计算如下:

设直线的端点坐标为
   A = (A(0), A(1), A(2) )T, B = (B(0), B(1), B(2) )T,
任意点P = (P(0), P(1), P(2) )T

, 矢量

     V0B A, V0的成分为:V0(i) = B(i) – A(i ), i=0,2

     V1P A, V1的成分为: V1(i) = P(i) – A(i ), i=0,2

又设矢量的外积V = V0×V1, V还是矢量.

     V = V0×V1

     V的成分如下,

        V(0)= V0 (1) V1 (2) –  V0 (2) V1 (1)

        V(1)= V0 (2) V1 (0) –  V0 (0) V1 (2)

        V(2)= V0 (0) V1 (1) –  V0 (1) V1 (0)

, ||V0×V1||= sqr(V(0)^2+ V(1)^2+ V(2)^2)

然后用上面的结论即可判断出点P在直线AB上否.

以上计算中只要进行简单的,减,乘,乘方,开方运算即可.

该方法不论是在2维空间还是3维空间,也不论点在线段AB上,还是在其延长线上,都能使用.

发表于 2007-6-17 13:25 | 显示全部楼层
''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''
'''
'''这是一个判断点在直线上否的简单Sample
'''
'''Coded By ChunYue,Zou   2007.06.17
''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
Const CONST_AbsZero = 10 ^ (-4)   '大小由计算精度确定
Public Sub Test()
  Dim objline As AcadLine
  Dim returnPnt As Variant
  Dim A(0 To 2) As Double
  Dim B(0 To 2) As Double
  Dim P(0 To 2) As Double
  Dim V(0 To 2) As Double
  Dim V0(0 To 2) As Double
  Dim V1(0 To 2) As Double
  Dim Norm As Double
 
'''
  '1.指定直线AB
  ThisDrawing.Utility.GetEntity objline, returnPnt, "Select a line:"
  returnPnt = objline.StartPoint
  A(0) = returnPnt(0)
  A(1) = returnPnt(1)
  A(2) = returnPnt(2)
  returnPnt = objline.EndPoint
  B(0) = returnPnt(0)
  B(1) = returnPnt(1)
  B(2) = returnPnt(2)
  '指定一任意点P
  returnPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  P(0) = returnPnt(0)
  P(1) = returnPnt(1)
  P(2) = returnPnt(2)
  '2.计算矢量V0=B-A, V1=P-A
  V0(0) = B(0) - A(0)
  V0(1) = B(1) - A(1)
  V0(2) = B(2) - A(2)
  '
  V1(0) = P(0) - A(0)
  V1(1) = P(1) - A(1)
  V1(2) = P(2) - A(2)
  '3.求外积 V = V0 x V1
  V(0) = V0(1) * V1(2) - V0(2) * V1(1)
  V(1) = V0(2) * V1(0) - V0(0) * V1(2)
  V(2) = V0(0) * V1(1) - V0(1) * V1(0)
  '4.计算V的大小: Norm = ||V|| = ||V0 X V1||
  Norm = Sqr(V(0) ^ 2 + V(1) ^ 2 + V(2) ^ 2)
  '5.判断
  If Norm < CONST_AbsZero Then
    '点P在直线AB上
    MsgBox "点在直线上, Norm=" & Norm
  Else
    '点P不在直线AB上
    MsgBox "点不在直线上, Norm=" & Norm
  End If
End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 04:29 , Processed in 0.275244 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表