乐筑天下

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

acad的向量/矩阵函数

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-6 21:11:09 | 显示全部楼层 |阅读模式
本人'我正在开发一个小库,用于在vba、I&#039中转换实体等;我已经有了一个开始,但正如我所做的那样'多年来,我对vba的一些语法和正确结构的细节有点生疏
有什么关于如何继续的建议吗
我看到的第一个问题是将数组分配给其他数组,有没有比将每个项目分配给另一个数组中的每个项目更简单的方法;t似乎能够在没有编译错误的情况下完成这样的事情-Dim a1(2)作为Double,a2作为Double;用一些值填充a1
&039;将a1分配给a2=a1和#039<-唐#039;正如您在下面的代码中所看到的,我一直在使用变体传递返回值,然后将各个元素分配给适当的数组,有更好的方法吗
谢谢
  1. '''''''''------- Vector Methods --------------'''''''''''
  2. Public Function VecNorm(vec() As Double) As Double()
  3. 'Normalises the incoming vector.
  4. Dim vecn(2) As Double
  5. Dim unit As Double
  6. unit = Sqr(vec(0) * vec(0) + vec(1) * vec(1) + vec(2) * vec(2))
  7. vecn(0) = vec(0) / unit: vecn(1) = vec(1) / unit: vecn(2) = vec(2) / unit
  8. VecNorm = vecn
  9. End Function
  10. Function VecCross(v1() As Double, v2() As Double) As Variant
  11.     Dim vec(2)
  12.     vec(0) = v1(1) * v2(2) - v2(1) * v1(2)
  13.     vec(1) = v1(2) * v2(0) - v2(2) * v1(0)
  14.     vec(2) = v1(0) * v2(1) - v2(0) * v1(1)
  15.     VecCross = vec
  16. End Function
  17. '''''''''--------- Matrix Methods ------------'''''''''''
  18. Public Function xFormMat(vx() As Double, vy() As Double, vz() As Double) As Variant
  19. 'Uses the incoming vectors to transform the entity being passed in
  20. Dim mat(0 To 3, 0 To 3) As Double
  21. mat(0, 0) = vx(0): mat(0, 1) = vy(0): mat(0, 2) = vz(0): mat(0, 3) = 0#
  22. mat(1, 0) = vx(1): mat(1, 1) = vy(1): mat(1, 2) = vz(1): mat(1, 3) = 0#
  23. mat(2, 0) = vx(2): mat(2, 1) = vy(2): mat(2, 2) = vz(2): mat(2, 3) = 0#
  24. mat(3, 0) = 0#: mat(3, 1) = 0#: mat(3, 2) = 0#: mat(3, 3) = 1#
  25. xFormMat = mat
  26. End Function
  27. Public Function GetMatFromLine(line As AcadLine) As Variant
  28. 'builds a matrix based on the line's sp, ep and normal
  29. Dim mat(0 To 3, 0 To 3) As Double
  30. Dim vx(2) As Double, vy(2) As Double, vz(2) As Double
  31. 'get the lines ep-sp vector to create the z axis:
  32. vz(0) = line.EndPoint(0) - line.StartPoint(0)
  33. vz(1) = line.EndPoint(1) - line.StartPoint(1)
  34. vz(2) = line.EndPoint(2) - line.StartPoint(2)
  35. 'normalise it:
  36. Dim retvec As Variant
  37. retvec = VecNorm(vz)
  38. vz(0) = retvec(0): vz(1) = retvec(1): vz(2) = retvec(2)
  39. 'get the line's normal for the x vector:
  40. vx(0) = line.Normal(0)
  41. vx(1) = line.Normal(1)
  42. vx(2) = line.Normal(2)
  43. 'create the y vector by xproduct of z over x:
  44. retvec = VecCross(vz, vx)
  45. vy(0) = retvec(0): vy(1) = retvec(1): vy(2) = retvec(2)
  46. 'normalise it:
  47. retvec = VecNorm(vy)
  48. vy(0) = retvec(0): vy(1) = retvec(1): vy(2) = retvec(2)
  49. 'plug 'em into the matrix:
  50. mat(0, 0) = vx(0): mat(0, 1) = vy(0): mat(0, 2) = vz(0): mat(0, 3) = 0#
  51. mat(1, 0) = vx(1): mat(1, 1) = vy(1): mat(1, 2) = vz(1): mat(1, 3) = 0#
  52. mat(2, 0) = vx(2): mat(2, 1) = vy(2): mat(2, 2) = vz(2): mat(2, 3) = 0#
  53. mat(3, 0) = 0#: mat(3, 1) = 0#: mat(3, 2) = 0#: mat(3, 3) = 1#
  54. GetMatFromLine = mat
  55. End Function
我还有很多要添加的内容,将发布它们,但在我产生太多垃圾之前,我希望得到一些建议
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-6 21:24:28 | 显示全部楼层
嗨,米克。警告,以下不是表达得最好的帖子I'我曾经写过
如果你使用用户定义类型(UDT)(用花括号表示与结构大致类似),你可以将一个UDT变量设置为相同类型的另一个UDT变量,它将数据(有点像OO深度克隆)从一个复制到另一个,而不是将指针(我在这里滥用语言,因为UDT变量不是指针)赋给另一个(如果它们是对象而不是UDT,就会发生这种情况)
你的应用程序会利用这个漏洞吗
可能是通过矩阵和向量定义的类型。话虽如此,我'说到矩阵/向量数学,我是个白痴,所以我可以'不要说
你想要一个简单的UDT代码示例吗?
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-6 21:52:21 | 显示全部楼层
我在考虑创建一些类,这似乎是合乎逻辑的,但我可以通过一些函数逃脱惩罚,我只需要编写一次,我'我只是懒惰,为什么不呢?我们说的是vb类;我们不是吗?
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-6 21:56:04 | 显示全部楼层

没有。用户定义类型不是类。将C结构视为您所使用的最接近的类似数据类型'我们熟悉
让我举个例子来说明。。。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-12-6 22:11:26 | 显示全部楼层
&燃气轮机&燃气轮机;C结构很酷
不过,我确实还有最后一个问题,比如说我有一个矩阵udt,我仍然需要将它分配给一个数组,以传递给transformBy方法……不过我想我可以在运行时修正一个函数。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-12-6 22:23:00 | 显示全部楼层
又快又脏,希望它能发光
  1. Option Explicit
  2. Type TPoint
  3.     X As Double
  4.     Y As Double
  5.     Z As Double
  6. End Type
  7. Type TLine
  8.     P1 As TPoint
  9.     P2 As TPoint
  10. End Type
  11. Sub Demo ( )
  12.     Dim P1 As TPoint, _
  13.         P2 As TPoint
  14.     With P1
  15.         .X = 20
  16.         .Y = 20
  17.     End With
  18.    
  19.     ''  Set P2 = P1, remembering it's a copy of the data.
  20.     ''  Not the same as setting one object to another.
  21.     ''  If you're a .NET geek think of UDTs as value types
  22.     ''  (as opposed to reference types).
  23.    
  24.     P2 = P1
  25.    
  26.     ''  Show P2's data
  27.     With P2
  28.         Debug.Print "P2's initial data:"
  29.         Debug.Print "P2.X ="; .X; ", P2.Y = "; .Y
  30.         Debug.Print
  31.     End With
  32.    
  33.     ''  prove P2 is not a pointer to P1 by assigning new
  34.     ''  data to P1 and reprinting P2's data
  35.    
  36.     With P1
  37.         .X = 10
  38.         .Y = 10
  39.     End With
  40.     ''  show p2's data again (ha, still 20, 20)
  41.     With P2
  42.         Debug.Print "P2's data after P1 given new values:"
  43.         Debug.Print "P2.X ="; .X; ", P2.Y = "; .Y
  44.         Debug.Print
  45.     End With
  46.    
  47.     ''  now demonstrate a deeper copy
  48.    
  49.     Dim L1 As TLine, _
  50.         L2 As TLine
  51.         
  52.     ''  initialize L1 using previously defined P1 and P2
  53.    
  54.     With L1
  55.         .P1 = P1
  56.         .P2 = P2
  57.     End With
  58.    
  59.     ''  now force L2 to have a copy of L1's data (the deeper copy)
  60.    
  61.     L2 = L1
  62.    
  63.     ''  show L2's data
  64.    
  65.     With L2
  66.         Debug.Print "L2's data:"
  67.         Debug.Print "L2, P1.x = "; .P1.X; " , P1.y = "; .P1.Y
  68.         Debug.Print "L2, P2.x = "; .P2.X; " , P2.y = "; .P2.Y
  69.     End With
  70.    
  71.     ''  ha, cool you say; not too shabby for vb.
  72. End Sub
玩得开心
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-12-6 22:28:12 | 显示全部楼层
谢谢议员,我会在周末过来看看,19号打电话过来;我会告诉你我过得怎么样。再次谢谢。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-12-6 22:31:08 | 显示全部楼层
我的荣幸,米克。看看你的解决方案会是什么样子,我会很感兴趣的。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-12-7 04:23:36 | 显示全部楼层
哇,议员,这很有启发性  
我正要建议:
Dim a1(2)为Double,a2()为Double'a2为动态;用一些值填充a1
&039;将a1分配给a2=a1和#039<-应该可以工作,并且函数VecCross(v1()作为Double,v2()作为doug)作为Double(),但是这个方法没有你发布的方法那么通用。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-12-7 08:16:37 | 显示全部楼层
为了使代码更简洁,请使用这些语法
  1. Sub Test()
  2.     Dim A1(2) As Double
  3.     Dim A2() As Double
  4.     Dim A3() As Double
  5.     Dim Var As Variant
  6.    
  7.    
  8.     A1(0) = 1: A1(1) = 1: A1(2) = 2
  9.     A2() = A1()
  10.    
  11.     Var = A1()
  12.    
  13.     A3() = Var
  14.    
  15.   
  16.    
  17. End Sub
注意:数组必须在没有任何元素的情况下声明,才能将另一个数组分配给;它
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 16:50 , Processed in 0.405347 second(s), 73 queries .

© 2020-2025 乐筑天下

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