注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

AutoCAD.NET中的点、向量和矩阵(一)  

2011-01-04 10:51:33|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       AutoCAD内部,点和向量是最基本也是最基础的几何单元,许多定位、移动等都是基于这两种基本单元实现的,而矩阵则主要实现对实体的各种变换。和许多人想像的并不一样,的确,AutoCAD完全支持了.NET Framework的架构,即AutoCAD也可以是完全面向对象的,但是点和向量在AutoCAD中并不是以类的形式存在的,而是以结构体的方式存在。在这里先做一个概念上的说明:C#.NET中结构和类确实有一些区别,但是并没有传统的C++中那么大,C#中的结构体也可以有自己的构造方法、成员方法和数据成员,不过具体的差别还是体现在以下几个方面:

1.       类是引用类型,在堆上分配地址,结构是值类型,在堆栈上分配地址。

2.       类是可继承的(被声明为sealed的除外),结构体既不能从别的结构体继承而来,也不能派生出新的结构体。

3.       类的默认访问性是私有的(private),而结构体中则是公有的(public),结构体可以不使用new初始化

       通常认为结构可以看作是轻量级的类,在性能上要好一点,所以AutoCAD中定义为结构体还是有他的道理的。

先说说二维的点和向量。

一、二维点和向量

       二维点在AutoCAD的体系结构中位于命名空间Autodesk.AutoCAD.Geometry下,需要文件acdbmgd.dll支持,层次结构如下:

AutoCAD.NET中的点、向量和矩阵(一) - Castor - 趁年轻,多折腾~~

       该结构体具有三个构造方法,分别是用实数,数组和非托管点(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()

返回一个二维点,该点的XY值是该点XY值同时除以以一个实数值后的结果

GetAsVector()

将点作为一个向量返回

GetDistanceTo()

返回该点和一个给定点之间的距离

GetVectorTo()

返回该点到另一个点的相对向量

Mirror()

返回该点关于给定直线(Line2d)的对称点

MultiplyBy()

DivideBy相反,返回一个二维点,该点的XY值是该点XY值同时乘以一个实数值后的结果

RotateBy()

该方法传入两个参数,第一个double型参数代表角度,第二个Point2d型参数代表旋转中心点,将该点绕中心点旋转给定角度

ScaleBy()

该方法传入两个参数,第一个double型参数代表缩放比例,第二个Point2d型参数代表基准点,将该点相对基准点缩放给定比例

Subtract()

Add相反,与一个平面向量相减,并返回向量终点

ToArray()

返回一个double[]数组,该点的X值下标为0Y值下标为1

ToString()

返回包含该点信息的字符串

TransformBy()

该方法传递一个Matrix2d类型的变量(图形变换矩阵),对该点实施变换

       GetAsVector()方法很有意思,居然可以讲一个点作为向量,其实,在计算机内部,电和向量的存储方式是完全一样的,只是解读的方式不同而已。另外,点还重载了运算符+-/!===等运算符,但行为并不是我们通常想的那样,这里详细说说。

       运算符“+”有一点特别,加法并没有两个点的相加,因为只并不具有几何意义,点是和一个二维向量相加,返回结果是另外一个点,这里先提前使用一下向量,例子如下:

Point2d p1 = new Point2d(100, 50);

Vector2d v = new Vector2d(100, 100);

Point2d p2 = p1 + v; //p2=(200,250)

示意图如下:

AutoCAD.NET中的点、向量和矩阵(一) - Castor - 趁年轻,多折腾~~

 

同样的,如果是一个点减去一个向量,效果类似。

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。

 

  评论这张
 
阅读(1450)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016