河伯 发表于 2010-12-12 11:06:19

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

用lisp和VBA的时候,没有几何类,点、向量、矩阵都用表和数组来定义。AutoCAD.NET的Geometry命名空间里有许多几何类,其中最基础的有五个,点(Point3d)、向量(Vector3d)、矩阵(Matrix3d)、平面(Plane)和坐标系(CoordinateSystem3d),这些类具有的丰富成员使得编程更加方便。下面是点对象加减乘除方法的测试。注意第四种乘法运算,说明TransformBy是用左乘矩阵实现的。指定任意点:
新建点:New Point3d = (0,0,0)
共享属性:Point3d.Origin = (0,0,0)
----------------------------------
输入点:ptUcs = (200,100,0)
加法运算一:ptUcs.Add(New Vector3d(10, 20, 0)) = (210,120,0)(返回Point3d)
加法运算二:ptUcs + New Vector3d(10, 20, 0) = (210,120,0)(返回Point3d)
减法运算一:ptUcs.Subtract(New Vector3d(10, 20, 0)) = (190,80,0)(返回Point3d)
减法运算二:ptUcs - New Vector3d(10, 20, 0) = (190,80,0)(返回Point3d)
减法运算三:ptUcs - New Point3d(10, 20, 0) = (190,80,0)(返回Vector3d)
乘法运算一:ptUcs.MultiplyBy(2) = (400,200,0)(返回Point3d)
乘法运算二:ptUcs * 2 = (400,200,0)(返回Point3d)
乘法运算三:2 * ptUcs = (400,200,0)(返回Point3d)
乘法运算四:UcsMatrix * ptUcs = (100,200,0)(返回Point3d)
除法运算一:ptUcs.DivideBy(2) = (100,50,0)(返回Point3d)
除法运算二:ptUcs / 2 = (100,50,0)(返回Point3d)

雪山飞狐_lzh 发表于 2010-12-12 11:27:21

本帖最后由 lzh741206 于 2010-12-12 16:28 编辑

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

sieben 发表于 2010-12-12 11:48:43

Point3d.Origin 似乎应该叫做静态公用属性
关键的是理解图形学上的含义(不过楼主这样做对初学者应该很有帮助)
自己去看类的定义,更能知道一个类有些什么,能做些什么。

chpmould 发表于 2010-12-12 11:53:48

期待后续的测试例子...

河伯 发表于 2010-12-12 11:54:48

补充一点关于TransformBy的

吓我一跳,呵呵!      Dim pt1 As New Point3d(10, 10, 0)
      ed.WriteMessage(vbLf & "Point1:{0}", pt1)
      Dim mat As Matrix3d = Matrix3d.Displacement(New Vector3d(10, 0, 0))
      Dim pt2 = Matrix3d.Displacement(New Vector3d(10, 0, 0)) * pt1
      ed.WriteMessage(vbLf & "Point2:{0}", pt2)
      Dim pt3 As Point3d = pt1.TransformBy(mat)
      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的叫法不同,似乎编译后确实有差异。

cdinten 发表于 2010-12-12 12:06:41

请问坐标变换之后Point3d.Origin会改变还是一直是(0,0,0)?

雪山飞狐_lzh 发表于 2010-12-12 16:26:44

Point3d是只读的,不可改变的
和string有点类似

sieben 发表于 2010-12-12 18:07:15

河伯 发表于 2010-12-12 11:59 static/image/common/back.gif
VB.NET里,微软就是这么叫的。看过一篇文章解释了为什么C#和VB的叫法不同,似乎编译后确实有差异。

VB和VB.Net是有区别的
基于.Net框架的语言(含C#,VB.Net),里面的任何东西都是和类相关的,任何类型的常量变量也都是存在于类(需要说是某个类的变量或常量)。和以前的模块式公共变量和私有变量是有区别(它们可以单独存在)(当然,公用静态变量和楼主所说的共享属性功能应该是一样的)

sieben 发表于 2010-12-12 18:11:33

lzh741206 发表于 2010-12-12 16:26 static/image/common/back.gif
Point3d是只读的,不可改变的
和string有点类似

斑竹我要较真了,应该说Point3d.Origin是只读的。
页: [1] 2
查看完整版本: 几何类中点运算的基本测试