乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 236|回复: 12

向量相关(Vector2d/Vector3d)

[复制链接]

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-6-5 12:36:00 | 显示全部楼层 |阅读模式
先贴段转帖自XD的文章,原帖找不到了,呵呵
是ObjectArx的,但netApi中使用的方法类似
下面的例子介绍对于点、矢量、距阵最基本的函数和操作,这些例子使用三维对象,但绝大多数函数和操作都适用于二维对象。
对于点和矢量来说,默认的构造函数把所有的坐标都初始化为0。它们也能像下面这样在创建时初始化各个坐标:
AcGePoint3d    p1(2.0,5.0,-7.5), p2, p3(1.0,2.0,3.0);
AcGeVector3d   v1(3.0,4.0,5.0), v2(0.0,1.0,-1.0), v3;
点和矢量类还提供+、+=、-、-=操作。有了这些操作,我们可以像使用内部变量类型如int和double一样使用它们。下面的例子是点和矢量的加减操作:
p2 = p1 + v1;       // p2 是 p1 与 v1的和
p1 += v1;           // 把 v1 加给 p1
p3 -= v1;           // 从 p3中减去v1
v3 = v1 + v2;       // v3 是 v1 与 v2的和
v1 += v2;           //  把v2加给 v1
v3 = v1 - v2;       // 设置v3 为 v1与 v2的差
两个点没有加法运算,但一个点可以转换成矢量,然后就可以加到另一个点上去了:
p1 += p2.asVector();
下面的例子表明如何获得一个反方向的矢量:
v2 = -v1;           // 设置v2是v1的反方向矢量
v1.negate();        // 这个操作等同于 v1 = -v1
下面的例子表明缩放一个矢量的不同方法:
v1 *= 2.0;          // v1的长度被放大两倍
v3 = v1 / 2.0;      // v3的长度是 v1长度的一半
v1.normalize();     // 使v1变成单位矢量
点和矢量类还有一些获得距离或长度的函数:
double len = v2.length();  //  v2的长度
len = p1.distanceTo(p2);   // 从 p1 到 p2的距离
T下面这个函数对于求两个三维矢量之间的角度非常有用,该函数返回v1和v2之间的角度,这个角度是绕v3轴逆时针旋转得到的,v3被假定为垂直于v1和v2所确定的平面:
angle = v1.angleTo(v2,v3);
下面这些函数返回布尔值(TRUE或者FALSE),一般用在if语句中:
if (v1.isZeroLength())   
if (v1.isParallelTo(v2))
if (v1.isPerpendicularTo(v2))
矢量类的基本矢量操作函数:
len = v1.dotProduct(v2);
v3 = v1.crossProduct(v2);
距阵的默认构造函数初始化一个距阵为单位距阵:
AcGeMatrix3d   mat1, mat2, mat3;
下面的操作把p3绕由p1和v1确定的直线旋转90度:
mat1.setToRotation ( kPi/2.0, v1, p1 );
p3 = mat1 * p2;
回复

使用道具 举报

10

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2012-12-26 22:03:00 | 显示全部楼层
我也跟着说个3D向量的知识点。3d很有意思,跟一个同事一起发现的,比如两个三D点pt1,pt2连线的中点是谁? (pt1 + pt2)/2 这个没什么质疑的,三等分点呢? (pt1+pt2)/3 呵呵这样你就大错特错了。应该是 (pt1-pt2)/3 +pt2  以及(pt2 -pt1)/3 + pt1  这个用向量的思想理解很简单,就是一个点移动向量的 1/3. 中点只是一个特例 (pt1-pt2)/2 + pt1
回复

使用道具 举报

0

主题

37

帖子

2

银币

初来乍到

Rank: 1

铜币
37
发表于 2016-10-22 22:53:00 | 显示全部楼层
单位向量即长度为1的向量
            Vector3d vec = new Vector3d(100, 100, 0);
            //获取单位向量 即角度与原向量相同 长度为1的向量
            vec = vec.GetNormal();
回复

使用道具 举报

0

主题

87

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
87
发表于 2016-11-2 09:02:00 | 显示全部楼层
非常不错啊,谢谢楼主分享啊。这么好的工具。
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-6-5 12:49:00 | 显示全部楼层
一、向量的概念
简单的看下面的代码:
Point3d p1 = new Point3d(0,0,0);
Point3d p2 = new Point3d(1,1,0);
Vector3d vec = p2 - p1;
//vec即从p1指向p2的向量
vec = vec.RotateBy(Math.PI / 2, Vector3d.ZAxis);
//将向量vec绕Z轴逆时针旋转90度
Point3d p3 = p1 + vec;
//猜猜看这里的p3表示什么?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-6-5 13:11:00 | 显示全部楼层
二、向量的角度
可以使用的几个函数:
public double AngleOnPlane(
    PlanarEntity plane
);
返回向量在某一平面内的角度
参数可以用new Plane()简单的替换,表示世界坐标系中的角度
UCS或OCS下需要自行构建或获取
调用例子:
double angle = vec.AngleOnPlane(new Plane());
public double GetAngleTo(
    Vector3d vector
);
获取两向量间的角度,在区间[0,PI]内

public double GetAngleTo(
    Vector3d vector,
    Vector3d referenceVector
);以referenceVector为观察方向,相对于vector的角度,在区间[0,2 * PI]内调用例子:
double angle = vec.GetAngleTo(Vector3d.XAxis, -Vector3d.ZAxis);
回复

使用道具 举报

3

主题

20

帖子

4

银币

初来乍到

Rank: 1

铜币
32
发表于 2010-6-5 14:09:00 | 显示全部楼层
Point3d p3 = p1 + vec;
//猜猜看这里的p3表示什么?

P3表示P1距离Vec向量处的一个点
回复

使用道具 举报

87

主题

225

帖子

8

银币

中流砥柱

Rank: 25

铜币
573
发表于 2010-6-6 21:44:00 | 显示全部楼层
可否讲解些关于,在3D时的向量操作呢?
谢谢!
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-6-6 22:04:00 | 显示全部楼层
在3D时的向量操作呢?
举些例子看看
回复

使用道具 举报

5

主题

23

帖子

2

银币

初来乍到

Rank: 1

铜币
43
发表于 2010-6-7 15:21:00 | 显示全部楼层
顶lzh741206的无私奉献。继续期待你的佳作
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 06:47 , Processed in 0.451692 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表