明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2368|回复: 7

[VBA]关于点阵非交叉连线问题的算法及实现(非穷举法).

[复制链接]
发表于 2003-12-14 11:14:00 | 显示全部楼层 |阅读模式
问题的提出:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=13701

代码:
  1. Option Explicit

  2. Const CLEARCMD = vbCr & "        " & vbCr
  3. Dim Pi As Double

  4. Public Sub LinePointArray()
  5.     Dim PointArray() As Double, PointIndex() As Integer, CurPIndex As Integer
  6.     Dim i As Integer, N As Integer
  7.     Dim TempPoint As Variant, Temp As Variant, TempIndex As Integer
  8.     Dim StartPoint(0 To 2) As Double
  9.     Dim TempAngle As Double
  10.     Dim ii As Integer
  11.     Dim BasePoint(0 To 2) As Double, SecendPoint(0 To 2) As Double
  12.     Dim P1(0 To 2) As Double, P2(0 To 2) As Double
  13.     Dim BaseAngle As Double, Direction As Integer
  14.    
  15.     Pi = Atn(1) * 4
  16.     On Error Resume Next
  17.     'Open "D:\Test.txt" For Output As #1
  18.     Do
  19.         ReDim Preserve PointArray(0 To 2, N)
  20.         TempPoint = ThisDrawing.Utility.GetPoint(, CLEARCMD & "请选择点(" & N & "):")
  21.         If Err Then
  22.             Err.Clear
  23.             N = N - 1
  24.             If N <= 0 Then Exit Sub
  25.             Exit Do
  26.         End If
  27.         PointArray(0, N) = TempPoint(0)
  28.         PointArray(1, N) = TempPoint(1)
  29.         ThisDrawing.ModelSpace.AddText N, TempPoint, 5
  30.         'Print #1, "点" & N & ":" & TempPoint(0) & "," & TempPoint(1)
  31.         N = N + 1
  32.     Loop
  33.    
  34.     On Error GoTo 0
  35.     Temp = PointArray(0, 0)
  36.     For i = 1 To N
  37.         If Temp >= PointArray(0, i) Then
  38.             Temp = PointArray(0, i)
  39.             TempIndex = i
  40.         End If
  41.     Next i
  42.     StartPoint(0) = PointArray(0, TempIndex)
  43.     StartPoint(1) = PointArray(1, TempIndex)
  44.     BasePoint(0) = StartPoint(0)
  45.     BasePoint(1) = StartPoint(1)
  46.     CurPIndex = TempIndex
  47.     ReDim PointIndex(0)
  48.     PointIndex(0) = TempIndex
  49.     Direction = 1
  50.     BaseAngle = 270
  51.     TempAngle = 360
  52.     For i = 1 To N
  53.         For ii = 0 To N
  54.             If (ii = PointIndex(0) And CurPIndex <> PointIndex(0)) Or (ii <> CurPIndex And (Not IsIn(ii, PointIndex))) Then
  55.                 SecendPoint(0) = PointArray(0, ii)
  56.                 SecendPoint(1) = PointArray(1, ii)
  57.                 Temp = GetAngle(BasePoint, SecendPoint, BaseAngle, Direction)
  58.                 'Print #1, CurPIndex & "," & ii & ":" & Temp
  59.                 If Temp <= TempAngle Then
  60.                     TempAngle = Temp
  61.                     TempIndex = ii
  62.                 End If
  63.             End If
  64.         Next ii
  65.         If TempIndex = PointIndex(0) Then
  66.             Direction = (-1) * Direction
  67.             i = i - 1
  68.             TempAngle = 360
  69.         Else
  70.             P1(0) = PointArray(0, PointIndex(UBound(PointIndex)))
  71.             P1(1) = PointArray(1, PointIndex(UBound(PointIndex)))
  72.             ReDim Preserve PointIndex(UBound(PointIndex) + 1)
  73.             PointIndex(UBound(PointIndex)) = TempIndex
  74.             P2(0) = PointArray(0, PointIndex(UBound(PointIndex)))
  75.             P2(1) = PointArray(1, PointIndex(UBound(PointIndex)))
  76.             BaseAngle = GetAngle(BasePoint, P2)
  77.             CurPIndex = TempIndex
  78.             BasePoint(0) = PointArray(0, CurPIndex)
  79.             BasePoint(1) = PointArray(1, CurPIndex)
  80.             TempAngle = 360
  81.             ThisDrawing.ModelSpace.AddLine P1, P2
  82.             ThisDrawing.Application.Update
  83.         End If
  84.     Next i
  85.     P1(0) = PointArray(0, CurPIndex)
  86.     P1(1) = PointArray(1, CurPIndex)
  87.     ThisDrawing.ModelSpace.AddLine P1, StartPoint
  88.     'Close #1
  89. End Sub

  90. Private Function IsIn(Element As Integer, DataArray) As Boolean
  91.     Dim i As Integer
  92.     For i = 0 To UBound(DataArray)
  93.         If Element = DataArray(i) Then
  94.             IsIn = True
  95.             Exit Function
  96.         End If
  97.     Next i
  98.     IsIn = False
  99. End Function

  100. Private Function GetAngle(BasePoint, SecendPoint, Optional BaseAngle As Double = 0, Optional Direction As Integer = 1) As Double
  101.     Dim Angle As Double
  102.     If SecendPoint(0) = BasePoint(0) Then
  103.         If SecendPoint(1) > BasePoint(1) Then
  104.             Angle = 90
  105.         Else
  106.             Angle = -90
  107.         End If
  108.     Else
  109.         Angle = (Atn((SecendPoint(1) - BasePoint(1)) / (SecendPoint(0) - BasePoint(0)))) * 180 / Pi
  110.     End If
  111.     If SecendPoint(0) > BasePoint(0) Then
  112.         Angle = 360 + Angle                    '1,4
  113.     Else
  114.         Angle = 180 + Angle                    '2,3
  115.     End If
  116.     GetAngle = (Angle - BaseAngle) * Direction
  117.     If GetAngle < 0 Then GetAngle = GetAngle + 360
  118. End Function


例图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +2 金钱 +10 贡献 +10 激情 +5 收起 理由
mccad + 2 + 10 + 10 + 5 【好评】好程序

查看全部评分

发表于 2003-12-14 18:08:00 | 显示全部楼层
试用了一下,图中的点是要展进去的吗?怎么运行程序以后要一个一个的选择点呢?
发表于 2003-12-14 18:16:00 | 显示全部楼层
图中的点可否环型连接?由外向内,顺时针或逆时针均可,这样的话就可以首尾相接而且不交叉!如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2003-12-15 10:33:00 | 显示全部楼层
本程序要做的是 :1首尾相连;2点与点之间的连接;3不能交叉
所以3楼所示的图形是不符合的.(首尾连接必交叉)
发表于 2003-12-15 18:22:00 | 显示全部楼层
zeng29发表于2003-12-15 10:33:00本程序要做的是 :1首尾相连;2点与点之间的连接;3不能交叉
所以3楼所示的图形是不符合的.(首尾连接必交叉)


是这样,明白了!我想问一下,你的程序运行要选择点是怎么回事?不选择的话没有办法将图中的点连接起来吗?对于图中的点有什么要求没有?
 楼主| 发表于 2003-12-15 18:27:00 | 显示全部楼层
点阵的连线,自然要先确定点阵的数据.(这里是根据操作者选择的点进行连接)
对选择的点没有要求.数量和位置由操作者拾取.
发表于 2003-12-15 18:36:00 | 显示全部楼层
明白了!!谢谢!
发表于 2003-12-15 23:25:00 | 显示全部楼层
这好象没有唯一的解!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 12:48 , Processed in 0.187086 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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