明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4326|回复: 10

[几何] 几何类中点运算的基本测试

  [复制链接]
发表于 2010-12-12 11:06:19 | 显示全部楼层 |阅读模式
用lisp和VBA的时候,没有几何类,点、向量、矩阵都用表和数组来定义。AutoCAD.NET的Geometry命名空间里有许多几何类,其中最基础的有五个,点(Point3d)、向量(Vector3d)、矩阵(Matrix3d)、平面(Plane)和坐标系(CoordinateSystem3d),这些类具有的丰富成员使得编程更加方便。下面是点对象加减乘除方法的测试。注意第四种乘法运算,说明TransformBy是用左乘矩阵实现的。
  1. 指定任意点:
  2. 新建点:New Point3d = (0,0,0)
  3. 共享属性:Point3d.Origin = (0,0,0)
  4. ----------------------------------
  5. 输入点:ptUcs = (200,100,0)
  6. 加法运算一:ptUcs.Add(New Vector3d(10, 20, 0)) = (210,120,0)(返回Point3d)
  7. 加法运算二:ptUcs + New Vector3d(10, 20, 0) = (210,120,0)(返回Point3d)
  8. 减法运算一:ptUcs.Subtract(New Vector3d(10, 20, 0)) = (190,80,0)(返回Point3d)
  9. 减法运算二:ptUcs - New Vector3d(10, 20, 0) = (190,80,0)(返回Point3d)
  10. 减法运算三:ptUcs - New Point3d(10, 20, 0) = (190,80,0)(返回Vector3d)
  11. 乘法运算一:ptUcs.MultiplyBy(2) = (400,200,0)(返回Point3d)
  12. 乘法运算二:ptUcs * 2 = (400,200,0)(返回Point3d)
  13. 乘法运算三:2 * ptUcs = (400,200,0)(返回Point3d)
  14. 乘法运算四:UcsMatrix * ptUcs = (100,200,0)(返回Point3d)
  15. 除法运算一:ptUcs.DivideBy(2) = (100,50,0)(返回Point3d)
  16. 除法运算二:ptUcs / 2 = (100,50,0)(返回Point3d)

评分

参与人数 1威望 +1 金钱 +6 收起 理由
雪山飞狐_lzh + 1 + 6 精品文章

查看全部评分

发表于 2010-12-12 11:27:21 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-12 16:28 编辑

几何类的使用可以很大程度的简化代码,期待河伯老兄的后续测试,呵呵
补充一点关于TransformBy的
  1.             var pt = new Point3d(10, 10, 0);
  2.             ed.WriteMessage("\nPoint:{0}", pt);
  3.             var mat = Matrix3d.Displacement(new Vector3d(10, 0, 0));
  4.             pt = mat * pt;
  5.             ed.WriteMessage("\nPoint:{0}", pt);
  6.             pt = pt.TransformBy(mat);
  7.             ed.WriteMessage("\nPoint:{0}", pt);
复制代码

结果
Point:(10,10,0)
Point:(20,10,0)
Point:(30,10,0)
发表于 2010-12-12 11:48:43 | 显示全部楼层
Point3d.Origin 似乎应该叫做静态公用属性
关键的是理解图形学上的含义(不过楼主这样做对初学者应该很有帮助)
自己去看类的定义,更能知道一个类有些什么,能做些什么。
发表于 2010-12-12 11:53:48 | 显示全部楼层
期待后续的测试例子...
 楼主| 发表于 2010-12-12 11:54:48 | 显示全部楼层
补充一点关于TransformBy的

吓我一跳,呵呵!
  1.         Dim pt1 As New Point3d(10, 10, 0)
  2.         ed.WriteMessage(vbLf & "Point1:{0}", pt1)
  3.         Dim mat As Matrix3d = Matrix3d.Displacement(New Vector3d(10, 0, 0))
  4.         Dim pt2 = Matrix3d.Displacement(New Vector3d(10, 0, 0)) * pt1
  5.         ed.WriteMessage(vbLf & "Point2:{0}", pt2)
  6.         Dim pt3 As Point3d = pt1.TransformBy(mat)
  7.         ed.WriteMessage(vbLf & "Point3:{0}", pt3)
Point1:(10,10,0)
Point2:(20,10,0)
Point3:(20,10,0)
 楼主| 发表于 2010-12-12 11:59:21 | 显示全部楼层
Point3d.Origin 似乎应该叫做静态公用属性

VB.NET里,微软就是这么叫的。看过一篇文章解释了为什么C#和VB的叫法不同,似乎编译后确实有差异。
发表于 2010-12-12 12:06:41 | 显示全部楼层
请问坐标变换之后Point3d.Origin会改变还是一直是(0,0,0)?
发表于 2010-12-12 16:26:44 | 显示全部楼层
Point3d是只读的,不可改变的
和string有点类似
发表于 2010-12-12 18:07:15 | 显示全部楼层
河伯 发表于 2010-12-12 11:59
VB.NET里,微软就是这么叫的。看过一篇文章解释了为什么C#和VB的叫法不同,似乎编译后确实有差异。

VB和VB.Net是有区别的
基于.Net框架的语言(含C#,VB.Net),里面的任何东西都是和类相关的,任何类型的常量变量也都是存在于类(需要说是某个类的变量或常量)。和以前的模块式公共变量和私有变量是有区别(它们可以单独存在)(当然,公用静态变量和楼主所说的共享属性功能应该是一样的)
发表于 2010-12-12 18:11:33 | 显示全部楼层
lzh741206 发表于 2010-12-12 16:26
Point3d是只读的,不可改变的
和string有点类似

斑竹我要较真了,应该说Point3d.Origin是只读的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 00:45 , Processed in 0.183736 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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