马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
http://379910987.blog.163.com/blog/static/33523797201104104416325/
AutoCAD.NET中的点、向量和矩阵(一)
在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结构体的方法和属性,如下表: 属性或方法 | | | | | | | | | | | 返回一个二维点,该点的X和Y值是该点X和Y值同时除以以一个实数值后的结果 | | | | | | | | | | 和DivideBy相反,返回一个二维点,该点的X和Y值是该点X和Y值同时乘以一个实数值后的结果 | | 该方法传入两个参数,第一个double型参数代表角度,第二个Point2d型参数代表旋转中心点,将该点绕中心点旋转给定角度 | | 该方法传入两个参数,第一个double型参数代表缩放比例,第二个Point2d型参数代表基准点,将该点相对基准点缩放给定比例 | | | | 返回一个double[]数组,该点的X值下标为0,Y值下标为1 | | | | 该方法传递一个Matrix2d类型的变量(图形变换矩阵),对该点实施变换 |
GetAsVector()方法很有意思,居然可以讲一个点作为向量,其实,在计算机内部,电和向量的存储方式是完全一样的,只是解读的方式不同而已。另外,点还重载了运算符+、-、/、!=、==等运算符,但行为并不是我们通常想的那样,这里详细说说。 运算符“+”有一点特别,加法并没有两个点的相加,因为只并不具有几何意义,点是和一个二维向量相加,返回结果是另外一个点,这里先提前使用一下向量,例子如下: Point2d p1 = new Point2d(100, 50); Vector2d v = new Vector2d(100, 100); Point2d p2 = p1 + v; //p2=(200,250) |
示意图如下:
同样的,如果是一个点减去一个向量,效果类似。 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的向量 |
运算符“==”和“ !=”比较简单,即判断对应坐标是否相等来决定返回值是true还是false。
|