欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    基础对象与算法Word文档下载推荐.docx

    • 资源ID:6566978       资源大小:39.26KB        全文页数:34页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基础对象与算法Word文档下载推荐.docx

    1、;例如X、Y、Z方向的单位矢量A、B、C可以定义如下:VECTOR A(1, 0, 0), B(0, 1, 0), C(0, 0, 1) ;矢量运算的函数如表2.1所示。float VectorMagnitude(VECTOR A);功能:矢量求模输入:A返回:A 的模 |A|void VectorNormalize(VECTOR *A);矢量归一化输出:如果 |A|=0,输出矢量仍为 A;否则输出矢量为 A/(|A|)VECTOR operator + (VECTOR A, VECTOR B);矢量相加A, BA + BVECTOR operator - (VECTOR A, VECTOR

    2、B);矢量相减A BVECTOR operator * (VECTOR A, float s);VECTOR operator * (float s, VECTOR A);矢量缩放A, ss * AVECTOR VectorCross(VECTOR A, VECTOR B);VECTOR operator * (VECTOR A, VECTOR B);矢量叉积A与B的叉积float VectorDot(VECTOR A, VECTOR B);float operator (VECTOR A, VECTOR B);矢量点积A与B的点积表2.1 矢量运算函数2.1.2 矩阵运算 Intra3D 2

    3、.0 C+类库中矩阵运算程序见 Intra3D-DLLIncludeLayer1Algebra Matrix.h和Intra3D-DLLLayer1AlgebraMatrix.cpp。COM库的程序见 Intra3D-COM Layer1Matrix.h和Matrix.cpp。矩阵运算的函数如表2.2所示。void MatrixAdd(float *M, const float *A, const float *B, int i=4, int j=4);矩阵相加矩阵A(i,j) 与 B(i,j)M=A+Bvoid MatrixSub(float *M, const float *A, cons

    4、t float *B, int i=4, int j=4);矩阵相减M=A-Bvoid MatrixMultiply(float *M, const float *M1, const float *M2, int i1, int j1, int i2, int j2);矩阵相乘矩阵M1(i1,j1) 与M2(i2,j2)M (i1,j2) = M1*M2约束:i2=j1,否则不计算 Mvoid MatrixTranspose(float *M, const float *A, int i=4, int j=4);矩阵转置矩阵A(i,j)M(j,i) = A 的转置BOOL MatrixInve

    5、rse(float *A, int n=4);矩阵求逆 A(n, n)A = A 的逆TRUE 表示求逆运算成功;FALSE 表示该逆矩阵不存在,此时A 保持不变。void MatrixIdentity(float *A, int n=4);矩阵归一化 A = A 的归一化矩阵VECTOR VectorTransform(VECTOR V, float M16);矢量的矩阵旋转变换初始矢量 V,变换矩阵M16V 经过 M 变换后为 V, 函数返回 V表2.2 矩阵运算函数2.1.3 四元组运算与旋转变换一、复数概念 记Z为一复数,Z为Z的共轭复数,|Z| 为Z的模,则有: Z = a + bi

    6、 Z= a bi 其中 i * i = -1 。 两个复数 Z1, Z2 相乘可表示为: Z1 = a1 + b1 i Z2 = a2 + b2 i Z1*Z2 =(a1 * a2 - b1 * b2 ) + (a1 * b2 + b1 * a2)i二、四元组概念 四元组是复数的一种扩展。记q为一四元组,q为q的共轭四元组,|q|为四元组的模, 为q的逆(即为1/q),则有: q = w + x i + y j + z k q= w - x i - y j - z k | q | = 1 = q (q1 * q2) * q3 = q1 * (q2 * q3) q1 * q2 q2 * q1 其

    7、中 i * i = -1 j * j = -1k * k = -1 i * j = - j * i = kj * k = - k * j = ik * i = - i * k = j 四元组还可以表示为如下形式: q = w + xi + yj + zk = x y z w = ( s , v ) s = w v = x y z 两个四元组 q1和 q2相乘可表示为: q1 = ( s1, v1 ) q2 = ( s2, v2 ) q1*q2 = ( s1*s2 - v1v2 , s1*v2 + s2*v1 + v1v2)三、用四元组表示旋转变换 设一旋转变换的旋转轴为 u(单位矢量),旋转角

    8、度为。则与此旋转变换等价的四元组q为: q = ( s, v ) s = cos(/2) v = u sin(/2) 如果将空间一点p表示成四元组的形式 P=(0,p),则P点经过q旋转得到点Protated : Protated = q * P * 设有两个四元组 q1, q2分别表示前后两个旋转变换,则有: Protated = q2 * ( q1 * P *) * = (q2 * q1) * P * (*) = (q2 * q1) * P * 可见,两个四元组q1, q2的旋转结果就相当于一个四元组(q2 * q1)表示的旋转变换。这与用矩阵相乘来表示旋转变换非常相似,事实上四元组 q(

    9、w,x,y,z)等价于如下旋转矩阵: w*w + x*x - y*y - z*z 2*x*y + 2*w*z 2*x*z 2*w*y 0 2*x*y 2*w*z w*w x*x+ y*y -z*z 2*y*z + 2*w*x 0 z*x*z +2*w*y 2*y*z 2*w*x w*w x*x y*y +z*z 0 0 0 0 w*w + x*x + y*y +z*z 有关四元组更深入的论述可参考文献Hearn 1997 Downs 1998。四、程序设计 C+类库中四元组运算程序见 Intra3D-DLLIncludeLayer1AlgebraRotation.h 和Intra3D-DLLL

    10、ayer1AlgebraRotation.cpp。COM库中四元组运算程序见Intra3D-COMLayer1 Rotation.h 和Rotation.cpp。 四元组的数据结构定义如下:class QUATERNION float x, y, z, w; QUATERNION(float x=0.0, float y=0.0, float z=1.0f, float w=0.0);四元组运算的函数如表2.3所示。float QuaternionMagnitude(QUATERNION A);四元组求模四元组A|A|void QuaternionInverse(QUATERNION *A);

    11、四元组求逆如果 |A|=0,不改变 A;否则输出为 A 的逆void QuaternionConjugate(QUATERNION *A);四元组求共扼A 的共扼QUATERNION operator * (QUATERNION A, QUATERNION B);四元组相乘四元组A与BA * Bvoid QuaternionToMatrix(float M16, QUATERNION Q);求四元组等价的旋转矩阵四元组QM为与四元组Q等价的旋转矩阵表2.3 四元组运算函数 四元组运算的程序如下:const float DELTA_ROT=1.0E-10; / 允许存在的误差float Quat

    12、ernionMagnitude(QUATERNION A) return float(sqrt(A.x*A.x + A.y*A.y + A.z*A.z +A.w*A.w);void QuaternionNormalize(QUATERNION *A) float magnitude = float(sqrt(A-x*A-x + A-y*A-y + A-z*A-z +A-w*A-w); if(magnitude = DELTA_ROT) A-x = A-x/magnitude;y = A-y/magnitude;z = A-z/magnitude;w = A-w/magnitude; void

    13、QuaternionInverse(QUATERNION *A) float magnitude2 = A-z + A-w; if(magnitude2 x = -A-x/magnitude2;y = -A-y/magnitude2;z = -A-z/magnitude2;w/magnitude2;void QuaternionConjugate(QUATERNION *A)x;y;z;QUATERNION operator * (QUATERNION q1, QUATERNION q2) QUATERNION Q; Q.x =q1.w * q2.x + q1.x * q2.w +q1.y *

    14、 q2.z - q1.z * q2.y; Q.y =q1.w * q2.y + q1.y * q2.w +q1.z * q2.x - q1.x * q2.z; Q.z = q1.w * q2.z + q1.z * q2.w +q1.x * q2.y - q1.y * q2.x; Q.w =q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; return Q;void QuaternionToMatrix(float M16, const QUATERNION quat) float m44; float wx, wy, wz, xx,

    15、yy, yz, xy, xz, zz, x2, y2, z2; / calculate coefficients x2 = quat.x * 2.0f; y2 = quat.y * 2.0f; z2 = quat.z * 2.0f; xx = quat.x * x2; xy = quat.x * y2; xz = quat.x * z2; yy = quat.y * y2; yz = quat.y * z2; zz = quat.z * z2; wx = quat.w * x2; wy = quat.w * y2; wz = quat.w * z2; m00 = 1.0f - (yy + zz

    16、); m01 = xy + wz; m02 = xz - wy; m03 = 0.0f; m10 = xy - wz; m11 = 1.0f - (xx + zz); m12 = yz + wx; m13 = 0.0f; m20 = xz + wy; m21 = yz - wx; m22 = 1.0f - (xx + yy); m23 = 0.0f; m30 = 0; m31 = 0; m32 = 0; m33 = 1; for(int i=0; i4; i+) for(int j=0; j j+) Mi*4+j=mij;由于四元组的(x,y,z,w)变量并不直观,Intra3D 提供更加简明

    17、的旋转结构ROTATION来表示旋转变换。ROTATION的数据结构定义如下:class ROTATION VECTOR axis ; / 旋转轴,为单位矢量 float angle; / 旋转角度,0 - 360 度 ROTATION(float x=0.0, float y=0.0, float z=1.0, float angle=0.0); ROTATION(VECTOR axis, float angle); ROTATION运算是通过四元组运算来实现的,函数如表2.4所示。ROTATION operator * ( ROTATION R1, ROTATION R2);ROTATIO

    18、N 相乘,先执行 R1 旋转,后执行 R2 旋转。R1, R2R1与R2的旋转合成Void RotationToMatrix(float M16, ROTATION R);求与ROTATION结构等价的旋转矩阵RM为与R等价的旋转矩阵VECTOR VectorTransform(VECTOR V, ROTATION R);矢量的旋转变换初始矢量 V, 旋转结构RV 经过 R变换后为 V表2.4 ROTATION运算函数ROTATION运算的程序如下:/ 将 ROTATION 结构表示成 QUATERNIONQUATERNION RotationToQuaternion(const ROTATI

    19、ON R) float theta = R.angle/180.0f*3.14159f; float cosValue = cos(theta/2.0f); float sinValue = sin(theta/2.0f); Q.x = sinValue*R.axis.x; Q.y = sinValue*R.axis.y; Q.z = sinValue*R.axis.z; Q.w = cosValue;/ 将 QUATERNION 结构表示成 ROTATIONROTATION QuaternionToRotation(const QUATERNION Q) ROTATION R; float

    20、halfTheta= acos(Q.w); float sinValue = sin(halfTheta); if(sinValue -DELTA_ROT) & (R1.angle (R2.angle (R.angleDELTA_ROT) ) return V; Q=RotationToQuaternion(R); return VectorTransform(V, Q);2.1.4 鼠标跟踪球算法 用鼠标在窗口中转动一个形体,记窗口的宽度为w,高度为h,形体的转动中心坐标为(cx, cy),鼠标的起点坐标为P1(mx1, my1),终点坐标为P2(mx2, my2)。跟踪球算法的目的就是要计算出旋转轴矢量u,与旋转角度。将P1、P2投影到以(cx, cy)为中心的一个半球面上得到P1与P2,P1与P2在半球面上的矢量表示记为v1与v2。可以近似地认为旋转轴矢量u即为v1与v2的叉积(Cross Product): u = v1 v2旋转角度即为v1与v2的夹角,可用矢量点积(Dot Product)求出: = 180 * acos(v1v2)/ 问题的关键在于求出任一鼠标坐标(mx, my)在半球面上的投影矢量v,该算法的程序如下:


    注意事项

    本文(基础对象与算法Word文档下载推荐.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开