|
在AutoCAD内部,点和向量是最基本也是最基础的几何单元,许多定位、移动等都是基于这两种基本单元实现的,而矩阵则主要实现对实体的各种变换。和许多人想像的并不一样,的确,AutoCAD完全支持了.NET Framework的架构,即AutoCAD也可以是完全面向对象的,但是点和向量在AutoCAD中并不是以类的形式存在的,而是以结构体的方式存在。在这里先做一个概念上的说明:C#.NET中结构和类确实有一些区别,但是并没有传统的C++中那么大,C#中的结构体也可以有自己的构造方法、成员方法和数据成员,不过具体的差别还是体现在以下几个方面:
1.类是引用类型,在堆上分配地址,结构是值类型,在堆栈上分配地址。
2.类是可继承的(被声明为sealed的除外),结构体既不能从别的结构体继承而来,也不能派生出新的结构体。
3.类的默认访问性是私有的(private),而结构体中则是公有的(public),结构体可以不使用new初始化
通常认为结构可以看作是轻量级的类,在性能上要好一点,所以AutoCAD中定义为结构体还是有他的道理的。
先说说二维的点和向量。
一、二维点和向量
二维点在AutoCAD的体系结构中位于命名空间Autodesk.AutoCAD.Geometry下,需要文件acdbmgd.dll支持,层次结构如下:
该结构体具有三个构造方法,分别是用实数,数组和非托管点(ObjectArx)创建,三种方法分别如下:
- //第一种方法
- public unsafe Point2d(double x, double y)
- {
- *((double*) &this.data) = x;
- *((double*) (&this.data + 8)) = y;
- }
- //第二种方法
- public unsafe Point2d(double[] xy)
- {
- *((double*) &this.data) = xy[0];
- *((double*) (&this.data + 8)) = xy[1];
- }
- //第三种方法
- internal Point2d(IntPtr unmanagedPointer)
- {
- int num = (int) unmanagedPointer.ToPointer();
- memcpy(this, num, 0x10);
- }
复制代码 由于double类似在C#中所占的是8个字节,所以采用偏移地址(&this.data + 8)作为y坐标的值。
Point2d结构体的方法和属性,如下表:
属性或方法
| 说明
| Origin
| 返回坐标原点(0,0)点
| X
| 返回该点横坐标
| Y
| 返回该点纵坐标
| Add()
| 和一个平面向量相加,并返回向量终点
| DivideBy()
| 返回一个二维点,该点的X和Y值是该点X和Y值同时除以以一个实数值后的结果
| GetAsVector()
| 将点作为一个向量返回
| GetDistanceTo()
| 返回该点和一个给定点之间的距离
| GetVectorTo()
| 返回该点到另一个点的相对向量
| Mirror()
| 返回该点关于给定直线(Line2d)的对称点
| MultiplyBy()
| 和DivideBy相反,返回一个二维点,该点的X和Y值是该点X和Y值同时乘以一个实数值后的结果
| RotateBy()
| 该方法传入两个参数,第一个double型参数代表角度,第二个Point2d型参数代表旋转中心点,将该点绕中心点旋转给定角度
| ScaleBy()
| 该方法传入两个参数,第一个double型参数代表缩放比例,第二个Point2d型参数代表基准点,将该点相对基准点缩放给定比例
| Subtract()
| 和Add相反,与一个平面向量相减,并返回向量终点
| ToArray()
| 返回一个double[]数组,该点的X值下标为0,Y值下标为1
| ToString()
| 返回包含该点信息的字符串
| TransformBy()
| 该方法传递一个Matrix2d类型的变量(图形变换矩阵),对该点实施变换
|
GetAsVector()方法很有意思,居然可以讲一个点作为向量,其实,在计算机内部,电和向量的存储方式是完全一样的,只是解读的方式不同而已。另外,点还重载了运算符+、-、/、!=、==等运算符,但行为并不是我们通常想的那样,这里详细说说。
运算符“+”有一点特别,加法并没有两个点的相加,因为只并不具有几何意义,点是和一个二维向量相加,返回结果是另外一个点,这里先提前使用一下向量,例子如下:
- Point2d p1 = new Point2d(100, 50);
- Vector2d v = new Vector2d(100, 100);
- Point2d p2 = p1 + v; //p2=(200,250)
复制代码[/table]示意图如下:
|
| 同样的,如果是一个点减去一个向量,效果类似。
| - Point2d p1 = new Point2d(100, 50);
- Vector2d v = new Vector2d(100, 100);
- Point2d p2 = p1 - v; //p2=(0,-50)
复制代码 但是,运算符“-”还有另外一个重载方式,即两个点的相减,这被认为是求两个点之间的向量:
|
|
|
- Point2d p1 = new Point2d(100, 50);
- Point2d p2 = new Point2d(120, 80);
- Vector2d v = p1 - p2;//返回p1相对于p2的向量
复制代码 [table=98%,rgb(217, 217, 217)] |
运算符“==”和“ !=”比较简单,即判断对应坐标是否相等来决定返回值是true还是false。
转自:http://379910987.blog.163.com/
|
|