乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 105|回复: 7

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

[复制链接]

2

主题

77

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2003-12-14 11:14:00 | 显示全部楼层 |阅读模式
问题的提出:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=13701
代码:
[code]
Option Explicit
Const CLEARCMD = vbCr & "        " & vbCr
Dim Pi As Double
Public Sub LinePointArray()
    Dim PointArray() As Double, PointIndex() As Integer, CurPIndex As Integer
    Dim i As Integer, N As Integer
    Dim TempPoint As Variant, Temp As Variant, TempIndex As Integer
    Dim StartPoint(0 To 2) As Double
    Dim TempAngle As Double
    Dim ii As Integer
    Dim BasePoint(0 To 2) As Double, SecendPoint(0 To 2) As Double
    Dim P1(0 To 2) As Double, P2(0 To 2) As Double
    Dim BaseAngle As Double, Direction As Integer
   
    Pi = Atn(1) * 4
    On Error Resume Next
    'Open "D:\Test.txt" For Output As #1
    Do
        ReDim Preserve PointArray(0 To 2, N)
        TempPoint = ThisDrawing.Utility.GetPoint(, CLEARCMD & "请选择点(" & N & "):")
        If Err Then
            Err.Clear
            N = N - 1
            If N = PointArray(0, i) Then
            Temp = PointArray(0, i)
            TempIndex = i
        End If
    Next i
    StartPoint(0) = PointArray(0, TempIndex)
    StartPoint(1) = PointArray(1, TempIndex)
    BasePoint(0) = StartPoint(0)
    BasePoint(1) = StartPoint(1)
    CurPIndex = TempIndex
    ReDim PointIndex(0)
    PointIndex(0) = TempIndex
    Direction = 1
    BaseAngle = 270
    TempAngle = 360
    For i = 1 To N
        For ii = 0 To N
            If (ii = PointIndex(0) And CurPIndex  PointIndex(0)) Or (ii  CurPIndex And (Not IsIn(ii, PointIndex))) Then
                SecendPoint(0) = PointArray(0, ii)
                SecendPoint(1) = PointArray(1, ii)
                Temp = GetAngle(BasePoint, SecendPoint, BaseAngle, Direction)
                'Print #1, CurPIndex & "," & ii & ":" & Temp
                If Temp  BasePoint(1) Then
            Angle = 90
        Else
            Angle = -90
        End If
    Else
        Angle = (Atn((SecendPoint(1) - BasePoint(1)) / (SecendPoint(0) - BasePoint(0)))) * 180 / Pi
    End If
    If SecendPoint(0) > BasePoint(0) Then
        Angle = 360 + Angle                    '1,4
    Else
        Angle = 180 + Angle                    '2,3
    End If
    GetAngle = (Angle - BaseAngle) * Direction
    If GetAngle

epdtdc0oqxs.jpg

epdtdc0oqxs.jpg

回复

使用道具 举报

41

主题

657

帖子

9

银币

中流砥柱

Rank: 25

铜币
821
发表于 2003-12-14 18:08:00 | 显示全部楼层
试用了一下,图中的点是要展进去的吗?怎么运行程序以后要一个一个的选择点呢?
回复

使用道具 举报

41

主题

657

帖子

9

银币

中流砥柱

Rank: 25

铜币
821
发表于 2003-12-14 18:16:00 | 显示全部楼层
图中的点可否环型连接?由外向内,顺时针或逆时针均可,这样的话就可以首尾相接而且不交叉!如图:

uwmh3jh1eh2.jpg

uwmh3jh1eh2.jpg

回复

使用道具 举报

2

主题

77

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

41

主题

657

帖子

9

银币

中流砥柱

Rank: 25

铜币
821
发表于 2003-12-15 18:22:00 | 显示全部楼层

是这样,明白了!我想问一下,你的程序运行要选择点是怎么回事?不选择的话没有办法将图中的点连接起来吗?对于图中的点有什么要求没有?
回复

使用道具 举报

2

主题

77

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2003-12-15 18:27:00 | 显示全部楼层
点阵的连线,自然要先确定点阵的数据.(这里是根据操作者选择的点进行连接)
对选择的点没有要求.数量和位置由操作者拾取.
回复

使用道具 举报

41

主题

657

帖子

9

银币

中流砥柱

Rank: 25

铜币
821
发表于 2003-12-15 18:36:00 | 显示全部楼层
明白了!!谢谢!
回复

使用道具 举报

21

主题

166

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
250
发表于 2003-12-15 23:25:00 | 显示全部楼层
这好象没有唯一的解!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-29 17:10 , Processed in 1.601106 second(s), 78 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表