EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-8 15:19:43

[资料] 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支持,层次结构如下:
http://img539.ph.126.net/McQmypcUdTHfQslvG8AGug==/2633198407129345563.jpg

该结构体具有三个构造方法,分别是用实数,数组和非托管点(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;
*((double*) (&this.data + 8)) = xy;
}

//第三种方法

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)

示意图如下:
http://img615.ph.126.net/Q1Tu4UH9JsF8KDLI47MNwQ==/1929229490376533111.jpg
同样的,如果是一个点减去一个向量,效果类似。
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。

转自:http://379910987.blog.163.com/


页: [1]
查看完整版本: [资料] AutoCAD.NET中的点、向量和矩阵