向量相关(Vector2d/Vector3d)
<p>先贴段转帖自XD的文章,原帖找不到了,呵呵</p><p>是ObjectArx的,但netApi中使用的方法类似</p>
<div style="FONT-SIZE: 16px" id="blogDetailDiv">下面的例子介绍对于点、矢量、距阵最基本的函数和操作,这些例子使用三维对象,但绝大多数函数和操作都适用于二维对象。 <br/>对于点和矢量来说,默认的构造函数把所有的坐标都初始化为0。它们也能像下面这样在创建时初始化各个坐标: <br/>AcGePoint3d p1(2.0,5.0,-7.5), p2, p3(1.0,2.0,3.0); <br/>AcGeVector3d v1(3.0,4.0,5.0), v2(0.0,1.0,-1.0), v3; <br/>点和矢量类还提供+、+=、-、-=操作。有了这些操作,我们可以像使用内部变量类型如int和double一样使用它们。下面的例子是点和矢量的加减操作: <br/>p2 = p1 + v1; // p2 是 p1 与 v1的和 <br/>p1 += v1; // 把 v1 加给 p1 <br/>p3 -= v1; // 从 p3中减去v1 <br/>v3 = v1 + v2; // v3 是 v1 与 v2的和 <br/>v1 += v2; // 把v2加给 v1 <br/>v3 = v1 - v2; // 设置v3 为 v1与 v2的差 <br/>两个点没有加法运算,但一个点可以转换成矢量,然后就可以加到另一个点上去了: <br/>p1 += p2.asVector(); <br/>下面的例子表明如何获得一个反方向的矢量: <br/>v2 = -v1; // 设置v2是v1的反方向矢量 <br/>v1.negate(); // 这个操作等同于 v1 = -v1 <br/>下面的例子表明缩放一个矢量的不同方法: <br/>v1 *= 2.0; // v1的长度被放大两倍 <br/>v3 = v1 / 2.0; // v3的长度是 v1长度的一半 <br/>v1.normalize(); // 使v1变成单位矢量 <br/>点和矢量类还有一些获得距离或长度的函数: <br/>double len = v2.length(); // v2的长度 <br/>len = p1.distanceTo(p2); // 从 p1 到 p2的距离 <br/>T下面这个函数对于求两个三维矢量之间的角度非常有用,该函数返回v1和v2之间的角度,这个角度是绕v3轴逆时针旋转得到的,v3被假定为垂直于v1和v2所确定的平面: <br/>angle = v1.angleTo(v2,v3); <br/>下面这些函数返回布尔值(TRUE或者FALSE),一般用在if语句中: <br/>if (v1.isZeroLength()) <br/>if (v1.isParallelTo(v2)) <br/>if (v1.isPerpendicularTo(v2)) <br/>矢量类的基本矢量操作函数: <br/>len = v1.dotProduct(v2); <br/>v3 = v1.crossProduct(v2); <br/>距阵的默认构造函数初始化一个距阵为单位距阵: <br/>AcGeMatrix3d mat1, mat2, mat3; <br/>下面的操作把p3绕由p1和v1确定的直线旋转90度: <br/>mat1.setToRotation ( kPi/2.0, v1, p1 ); <br/>p3 = mat1 * p2; <!--v:3.2--></div> 我也跟着说个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 单位向量即长度为1的向量
Vector3d vec = new Vector3d(100, 100, 0);
//获取单位向量 即角度与原向量相同 长度为1的向量
vec = vec.GetNormal(); 非常不错啊,谢谢楼主分享啊。这么好的工具。 <p>一、向量的概念</p>
<p>简单的看下面的代码:</p>
<p>Point3d p1 = new Point3d(0,0,0);</p>
<p>Point3d p2 = new Point3d(1,1,0);</p>
<p>Vector3d vec = p2 - p1;</p>
<p>//vec即从p1指向p2的向量</p>
<p><font face="Verdana">vec = vec.RotateBy(Math.PI / 2, Vector3d.ZAxis);</font></p>
<p>//将向量vec绕Z轴逆时针旋转90度</p>
<p>Point3d p3 = p1 + vec;</p>
<p>//猜猜看这里的p3表示什么?</p> <p>二、向量的角度</p>
<p>可以使用的几个函数:</p><pre class="Element100"><font face="Verdana">public double AngleOnPlane(<br/> PlanarEntity plane<br/>);</font></pre>
<p>返回向量在某一平面内的角度</p>
<p>参数可以用new Plane()简单的替换,表示世界坐标系中的角度</p>
<p>UCS或OCS下需要自行构建或获取</p>
<p>调用例子:</p>
<p>double angle = vec.AngleOnPlane(new Plane());</p><pre class="Element100"><font color="#000000"><font face="Verdana">public double GetAngleTo(<br/> Vector3d vector<br/>);</font></font></pre>
<p>获取两向量间的角度,在区间内</p>
<p> </p><pre class="Element100"><font face="Verdana">public double GetAngleTo(<br/> Vector3d vector, <br/> Vector3d referenceVector<br/>);</font></pre><pre class="Element100">以<strong>referenceVector</strong>为观察方向,相对于<strong>vector</strong><font color="#000000">的角度,在区间内</font></pre><pre class="Element100"><p><font color="#000000">调用例子:</font></p><p><font color="#000000">double angle = vec.GetAngleTo(Vector3d.XAxis, -Vector3d.ZAxis);</font></p></pre> <p>Point3d p3 = p1 + vec;</p>
<p>//猜猜看这里的p3表示什么?</p>
<p> </p>
<p>P3表示P1距离Vec向量处的一个点</p> <p><font face="Verdana">可否讲解些关于,在3D时的向量操作呢?</font></p>
<p><font face="Verdana">谢谢!<br/></font></p> <p>在3D时的向量操作呢?</p>
<p>举些例子看看</p> 顶<b>lzh741206的无私奉献。继续期待你的佳作</b> 收藏. 虽然我菜到了很多都看不懂,但支持飞狐楼主 <p>简洁易懂</p>
<p>支持!</p>