乐筑天下

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

acad的向量/矩阵函数

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-7 09:11:29 | 显示全部楼层

这是我们在BASIC成为OO Lite之前所拥有的。
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-12-7 09:46:51 | 显示全部楼层
@MP,
mytwocents
我认为你的解决方案有一个反面。大多数Acad函数不接受UDT函数。
例如,将WCS中的点转换为UCS坐标时可能会出现问题,反之亦然。
使用Doublearrays和variants不会有这个问题。
哦,还有一个复制初始化的索引数组的附加功能...艰难的方式。避免不了就用这个。
  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, ByVal numBytes As Long)
  2. Sub Test()
  3. Dim P1(2) As Double
  4. Dim P2(2) As Double
  5. 'P1(0) = 1: P1(1) = 2: P1(2) = 3
  6. CopyArray P1, P2
  7. MsgBox (P2(2))
  8. End Sub
  9. Sub CopyArray(Source() As Double, Target() As Double)
  10.     Dim NumOfBytes As Long
  11.    
  12.     On Error GoTo NoElements
  13.     NumOfBytes = (UBound(Source) + 1) * LenB(Source(0))
  14.     ReDim Target(UBound(Source))                              'no need for a diffrent number of items to be a
  15.                                                             'true copy and save checking if the target is large enough...
  16.    
  17.         
  18.     CopyMemory Target(0), Source(0), NumOfBytes
  19.    
  20. NoElements:
  21. MsgBox "Empty Source array in Sub CopySourceArray() at " & Format$(Now(), "hh:nn ss"), vbCritical + vbOKOnly + vbMsgBoxSetForeground, "Void Array."
  22. On Error GoTo 0
  23. Exit Sub
  24. End Sub

回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-12-7 10:15:00 | 显示全部楼层
嗨,Berend。
同意,AutoCAD通常不接受UDT。
然而,我不会仅仅因为这个原因就直接拒绝它们。像许多封装的解决方案一样,隐藏在幕后的内容可能对调用者完全隐藏。
开发人员必须问他/她自己很多问题,例如...基于内在或Win32 API的技术?是否存在性能影响?是否存在潜在的迁移问题?给定技术的灵活性如何?它是否与问题域和基本数据类型保持良好一致?它是否避免变体(blech)?它是否容易映射到其他语言?等等。
我只是在为思考提供食物。这可能是也可能不是米克写出解决方案的最有效方式。我只是想通过确定一些选项来尽我的一份力量。我感谢你,因为你也在做同样的事情。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-7 10:59:21 | 显示全部楼层
米克的另一个例子,观察--
  1. Option Explicit
  2. Type TPoint
  3.     Coord(0 To 2) As Double
  4. End Type
  5. Sub AnotherDemo ( )
  6.     Dim P1 As TPoint
  7.    
  8.     P1.Coord(0) = 10
  9.     P1.Coord(1) = 20
  10.     Dim P2 As TPoint
  11.    
  12.     P2 = P1
  13.    
  14.     Debug.Print P2.Coord(0)
  15.     Debug.Print P2.Coord(1)
  16. End Sub

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-7 12:35:34 | 显示全部楼层
我经常使用变体来传递双精度,虽然它有点慢,但有时它会派上用场,因为您可以使用ismissing来检测它是否通过。
下面的子显示变体的速度是两倍,尽管
  1. Sub PassTheDoubly()
  2.     Dim P1(2) As Double
  3.     Dim P2(2) As Double
  4.     Dim V As Variant
  5.     Dim i As Long, j As Integer
  6.     Dim T As Single
  7.    
  8.     T = Timer
  9.     P1(0) = 23: P1(1) = 23: P1(2) = 23
  10.     For i = 0 To 1000000
  11.         For j = 0 To 2
  12.             P2(j) = P1(j)
  13.         Next j
  14.     Next i
  15.    
  16.     Debug.Print "double time=" & Timer - T
  17.    
  18.     T = Timer
  19.     For i = 0 To 1000000
  20.       V = P1
  21.     Next i
  22.      Debug.Print "Var time=" & Timer - T
  23.    
  24. End Sub

double time=0.375
Var time=0.875
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 13:03 , Processed in 1.327811 second(s), 60 queries .

© 2020-2025 乐筑天下

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