明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2098|回复: 3

[讨论]vba,请大家给个源码,根据一系列点的X坐标大小排序

[复制链接]
发表于 2004-2-2 22:48:00 | 显示全部楼层 |阅读模式
给大家拜年啦!
发表于 2004-2-2 23:01:00 | 显示全部楼层
看看这个帖子,一定对你有所帮助! http://bbs.mjtd.com/forum.php?mod=viewthread&tid=15190
发表于 2004-2-3 12:59:00 | 显示全部楼层
  1. ' 坐标点排序函数
  2. ' 语法:SortPoints(Points, SortMode)
  3. ' Points为坐标点数组
  4. ' SortMode为排序方式:0=X向,1=Y向,2=Z向
  5. ' 返回值为排序后的坐标点数组
  6. Public Function SortPoints(Points As Variant, SortMode As String) As Variant
  7.        Dim NewPoints() As Variant
  8.        ReDim NewPoints(UBound(Points))
  9.        Dim k As Long
  10.        For k = 0 To UBound(NewPoints)
  11.                NewPoints(k) = Points(k)
  12.        Next k
  13.       
  14.        Dim BestPoint As Variant
  15.        Dim Pnt1 As Double
  16.        Dim Pnt2 As Double
  17.        Dim i As Long
  18.        Dim j As Long
  19.        Dim Best_Value As Double
  20.        Dim Best_j As Long
  21.        For i = 0 To UBound(NewPoints) - 1
  22.                Best_Value = NewPoints(i)(SortMode)
  23.                BestPoint = NewPoints(i)
  24.                Best_j = i
  25.                For j = i + 1 To UBound(NewPoints)
  26.                        If NewPoints(j)(SortMode) < Best_Value Then
  27.                                Best_Value = NewPoints(j)(SortMode)
  28.                                BestPoint = NewPoints(j)
  29.                                Best_j = j
  30.                        End If
  31.                Next j
  32.                NewPoints(Best_j) = NewPoints(i)
  33.                NewPoints(i) = BestPoint
  34.        Next i
  35.        SortPoints = NewPoints
  36. End Function' 示例
  37. Sub SortPointsSample()
  38.        Dim Pnts(5) As Variant
  39.        Dim i As Integer
  40.        Dim OldTxt As String
  41.        Dim NewTxt As String
  42.        OldTxt = "未排序坐标:"
  43.        ThisDrawing.Utility.Prompt vbCr & "请按顺序随意点取6个坐标点" & vbCrLf
  44.        For i = 0 To 5
  45.                Pnts(i) = ThisDrawing.Utility.GetPoint(, vbCr & "点取第" & i + 1 & "点坐标点:")
  46.                OldTxt = OldTxt & vbCr & "第" & i + 1 & "点坐标为:" & Pnts(i)(0) & _
  47.                                "   " & Pnts(i)(1) & "     " & Pnts(i)(2)
  48.        Next
  49.        Dim NewPnts As Variant
  50.        NewPnts = SortPoints(Pnts, 0)
  51.        NewTxt = "按X坐标排序的顺序:"
  52.        For i = 0 To 5
  53.                NewTxt = NewTxt & vbCr & "第" & i + 1 & "点坐标为:" & NewPnts(i)(0) & _
  54.                                "   " & NewPnts(i)(1) & "     " & NewPnts(i)(2)
  55.        Next
  56.        MsgBox OldTxt & vbCr & vbCr & NewTxt, , "明经通道VBA示例"
  57. End Sub
发表于 2004-2-3 13:14:00 | 显示全部楼层
我自己写过一个对点进行排序的函数,可以同时对xy坐标进行排序。
  1. Public Sub PtList(points, ByVal HAlign As Boolean, ByVal VAlign As Boolean, _
  2.                                                                                                          priority As Integer)
  3.    '对点集points 进行排序
  4.    'priority = 0 表示先排X坐标,priority = 1 表示先排Y坐标
  5.    'HAlign = True 表示X坐标从小到大,HAlign = False 表示X坐标从大到小
  6.    'VAlign = True 表示Y坐标从小到大,VAlign = False 表示Y坐标从大到小
  7.    
  8.    Dim pt1, pt2 As Variant
  9.    Dim n As Integer
  10.    Dim A, B As Boolean
  11.    n = priority
  12.    If n = 0 Then
  13.        A = HAlign
  14.        B = VAlign
  15.    ElseIf n = 1 Then
  16.        A = VAlign
  17.        B = HAlign
  18.    End If
  19.    '主方向排序
  20.    For i = LBound(points) To UBound(points)
  21.        For j = i To UBound(points)
  22.            pt1 = points(i)
  23.            pt2 = points(j)
  24.            If pt1(n) > pt2(n) Eqv A Then
  25.                points(i) = pt2
  26.                points(j) = pt1
  27.            End If
  28.        Next j
  29.    Next i
  30.    '副方向排序
  31.    For i = LBound(points) To UBound(points)
  32.        For j = i To UBound(points)
  33.            pt1 = points(i)
  34.            pt2 = points(j)
  35.          If pt1(n) = pt2(n) Then
  36.            If pt1(1 - n) > pt2(1 - n) Eqv B Then
  37.                points(i) = pt2
  38.                points(j) = pt1
  39.            End If
  40.          End If
  41.        Next j
  42.    Next i
  43.    
  44. End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-22 05:07 , Processed in 0.149752 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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