找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2184|回复: 3

[分享] AutoCAD.NET中的点、向量和矩阵(一)

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-21 16:39:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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支持,层次结构如下:
0.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[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)

示意图如下:
1.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。

评分

参与人数 1D豆 +3 收起 理由
ScmTools + 3 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-6-15 14:12:24 | 显示全部楼层
讲解的很详细!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 0 反对 1

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2013-12-21 20:39:51 | 显示全部楼层
站下沙发  不错 又向.net进军的冲动!支持楼主:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-12-22 14:54:46 | 显示全部楼层
建议Net新手多看看{:soso_e108:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 21:35 , Processed in 0.245113 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表