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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 682|回复: 0
打印 上一主题 下一主题

[资料] 向量相关(Vector2d/Vector3d)

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12406

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 15:26:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

下面的例子介绍对于点、矢量、距阵最基本的函数和操作,这些例子使用三维对象,但绝大多数函数和操作都适用于二维对象。
  对于点和矢量来说,默认的构造函数把所有的坐标都初始化为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的距离
  下面这个函数对于求两个三维矢量之间的角度非常有用,该函数返回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;

-------------------------
一、向量的概念
简单的看下面的代码:
                                      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表示什么?
二、向量的角度
可以使用的几个函数:
                                      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);

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-27 06:16

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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