三维坐标点绕任意轴旋转的新坐标计算

任意轴可以用一个起点一个方向向量来表示。那么绕任意轴旋转就可以先将此轴移到通过原点,然后再旋转,再将旋转完的新坐标做反向平移。
则问题化为 计算绕通过原点的向量旋转任意角度后的新点。假设单位向量为(rx,ry,rz),那么旋转矩阵如下:
图片来源:http://blogold.chinaunix.net/u2/62895/showart_685396.html
写成函数如下:
void Rotate_Point3D(float theta, float nx, float ny, float nz, float (&ptIn)[3], float (&ptOut)[3])
{
 float len = sqrtf(nx * nx + ny * ny + nz * nz); //单位化
 nx /= len;        ny /= len;            nz /= len;   
 ptOut[0] =  ptIn[0] * (cosf(theta) + nx * nx * (1 - cosf(theta))) +    //transform by matrix
  ptIn[1] * (nx * ny * (1 - cosf(theta)) - nz * sinf(theta)) + 
  ptIn[2] * (nx * nz * (1 - cosf(theta) + ny * sinf(theta)));
 ptOut[1] = ptIn[0] * (nx * ny * (1 - cosf(theta)) + nz * sinf(theta)) +  
  ptIn[1] * (ny * ny * (1 - cosf(theta)) + cosf(theta)) + 
  ptIn[2] * (ny * nz * (1 - cosf(theta)) - nx * sinf(theta));
 ptOut[2] = ptIn[0] * (nx * nz * (1 - cosf(theta) - ny * sinf(theta))) + 
  ptIn[1] * (ny * nz * (1 -cosf(theta)) + nx * sinf(theta)) + 
  ptIn[2] * (nz * nz * (1 - cosf(theta)) + cosf(theta));
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
第三章作业 1. (6分)名词解释:扫描转换、增量算法、反走样。 扫描转换:基本图形的光栅化就是在像素点阵中确定最佳逼近和理想图形的像素点集, 并用指定颜色显示这些像素点集的过程。当光栅化和按扫描线顺序绘制图形的过程集合 在一起时,也称为扫描转移。 增量算法:在一个迭代算法中,如果每一步X,Y值是用前一步的值加上一个增量来获得 的,那么,这个算法就称为增量算法。 反走样:用于减轻走样的技术称为反走样或者称为抗锯齿。 2. (10分)计算起点坐标为(0,0),终点坐标(12,9)直线的中点算法的每一步坐标值 以及中点偏差判别式d的值,填入表3-1中,并用黑色绘制图3- 29中的直线段的扫描转换像素。 图3-29 像素点阵 "x "y "d "x "y "d " "0 "0 "-0.25 "7 "5 "-0.5 " "1 "1 "0 "8 "6 "-0.25 " "2 "1 "-0.75 "9 "6 "0 " "3 "2 "-0.5 "10 "7 "-0.75 " "4 "3 "-0.25 "11 "8 "-0.5 " "5 "3 "0 "12 "9 "-0.25 " "6 "4 "-0.75 " " " " 表3-1 和d的值 第四章作业 1. (10分)名词解释:四邻接点、八邻接点、四连通域、八连通域、种子填充算法。 四邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右这四个像素,称 为四邻接点。 八邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右以及左上、左下 、右上、右下这八个像素,称为八邻接点。 四连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右这 四个邻接点可以遍历区域内部的所有像素,该多边形区域称为四连通域。 八连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右以 及左上、左下、右上、右下这八个邻接点可以遍历区域内部的所有像素,该多边形区域 称为八连通域。 种子填充算法:从区域内任意一个种子像素开始,由内向外将填充色扩散到整个多边形 区域的填充过程。 2. (10分)试写出图4-43所示多边形的边表和扫描线y=4的有效边表。 图4-43 多边形 解:表 4时的表 3. (10分)图中已知种子O,试根据简单四连通种子填充算法按左、上、右、下入栈的顺 序给出象素点填充的次序。 " " " " " " " " "3 "O "4 "5 " " " "2 "1 " "6 " " " " " " " " " 第五章作业 1. (10分)名词解释:坐标变换、、、窗口、视区、窗视变换、裁剪、 坐标变更:是坐标系发生变换,但物体位置不发生改变,然后在坐标系下表示所有物 体上的顶点。 :( )世界坐标系,描述现实世界中场景的固定坐标系。 :( )用户坐标系,描述物体几何模型的坐标系。有时也称为局域坐标系( ,)。用户坐标系也是实数域坐标系、 窗口:在观察坐标系中定义的确定显示内容的矩形区域称为窗口。 视区:在屏幕坐标系中定义的输出图形的矩形区域称为视区。 窗视变换:图形输出需要进行窗口到视区的变换,只有在窗口内的图形才能在视区中输 出,并且输出的形状要根据视区的大小进行调整,这称为窗视变换。 裁剪:在二维观察中,需要在观察坐标系下根据窗口大小对世界坐标系中的二维图形进 行裁剪,只将位于窗口内的图形变换到视区输出。 2. (10分)如图5- 51所示,求P0(4,1)、P1(7,3)、P2(7,7)、P3(1,4)构成的四边形绕 Q(5,4)逆时针旋转45°的变换矩阵和变换后图形的顶点坐标。 图5-51 四边形旋转 解:变换的过程包括: 1. 平移:将P点平移至原点,变换矩形为: 2. 旋转:图形绕原点(P点)旋转45度,变换矩形为: 3. 反平移:将P点移回原处,变换矩阵为: 变换矩阵为: 变换过程为: 3. (14分)用编码裁剪算法裁剪线段P0(0,2),P1(3,3),裁剪窗口为1,6,1,5,如图5 -54所示。要求写出: (1)窗口边界划分的9个区间的编码原则。 (2)线段端点的编码。 (3)裁剪的主要步骤。 (4)裁剪后窗口内直线段的端点坐标。 图5-54 直线段裁剪 解:1)首先对直线段的端点进行编码,即对直线段的任一端点(x,y),根据其坐标所 在的区域,赋予一个四位的二进制码D3D2D1D0 若x<,则D0=1,否则D0=0; 若x>,则D1=1,否则D1=0; 若y<,则D2=1,否则D2=0; 若y>,则D3=1,否则D3=0. 2)线段端点的编码:1=0001 2=0000 3)裁剪的主要步骤: (1)输入直线的两端点坐标:P0(0,2),P1(3,3),以及窗口的四边界坐标:1,6, 1,5 (2)对p0,p1进行编码:点p0的编码为1=000
计算机图形学》课程设计报告 "学生: " "学 号: " " " " " " " " " " " " "学 院: " " "班 级: " " "题 目: "简单图形的绘制 " " " " 指导教师: 职称: 2015年7月1日 目 录 目 录 I 一、选题背景 1 二、算法设计 2 2.1 绘制直线、圆、椭圆、抛物线 2 2.1.1 绘制直线 2 2.1.2 绘制圆 2 2.1.3 绘制椭圆 2 2.1.4 绘制抛物线 2 2.2 三维几何变换 2 三、程序及功能说明 5 3.1 绘制直线、圆、椭圆、抛物线…… 5 3.1.1 绘制直线 5 3.1.2 绘制圆 5 3.1.3 绘制椭圆 5 3.1.4 绘制抛物线 6 3.2 图形的平移 6 3.3 图形的旋转 6 3.4 图形的缩放 7 四、结果分析 7 4.1 绘制直线、圆、椭圆、抛物线 7 4.1.1 直线 7 4.1.2 圆 8 4.1.3 椭圆 8 4.1.4 抛物线 8 4.2 图形的平移 9 4.3 图形的旋转 10 4.4 图形的缩放 11 五、总 结 13 六、课程设计心得体会 14 参考文献 15 源程序 16 一、选题背景 二、算法设计 2.1 绘制直线、圆、椭圆、抛物线 2.1.1 绘制直线 通过两个点的坐标来绘制直线。计算机图形学中二维图形在显示输出之前需要扫描转 换,生成直线的算法一般有DDA算法和中点算法。 2.1.2 绘制圆 通过运用圆的参数方程来绘制圆的图形,其中,(a,b)为圆心,r为半径 ,运用参数方程,只需要确定半径的长度和圆心的位置,即可绘制出圆。 2.1.3 绘制椭圆 通过运用椭圆的参数方程来绘制椭圆的图形,其中,是已知的变量,a, b分别为长半,短半,当确定a和b后,通过参数方程即可得到这个椭圆的方程。 2.1.4 绘制抛物线 根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经 过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成 一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。 2.2 三维几何变换 三维几何变换是二维几何变换的推广。二维几何变换在齐次坐标空间中可用33的变 换矩阵表示,类似的,三维几何变换在齐次坐标空间中可用44的变换矩阵表示。三 维空间中的点的齐次坐标定义为,其中,为不等与零的任意常数, ,,。亦即点对应4维齐次坐标空间的一条直线: (2.2.1) 通常为了简单起见,取为的齐次坐标。 (1)平移变换 平移变换将点在三个坐标方向上分别移动距离,得到的一点, 它们之间的关系表示为:,其中 。 三维平移变换在其次坐标下的矩阵表示为: (2.2.2) (2)放缩变换 三维放缩变换在齐次坐标下的矩阵表示: (2.2.3) 此变换的参照点为坐标原点,我们可以按下面步骤建立关于空间任一参照点的 缩放变换: (1)平移使落于原点,变换为; (2)进行放缩变换; (3)平移回到原先的位置,变换为。 从而关于参照点的缩放变换为 (2.2.4) (3)旋转变换 给定一点,首先将点和坐标表示成极坐标,即,其中 。将点绕旋转角后,得到。易知: (2.2.5) 上式矩阵形式为: (2.2.6) 从而绕旋转角的变换在齐次坐标下的矩阵表示为: (2.2.7) 类似的,绕旋转的变换矩阵分别为: (2.2.8) (2.2.9) 如果要绕空间任意旋转角,可按如下步骤实现: (1)以为原点,为建立坐标系; (2)求出从坐标系到坐标系的变换; (3)将图形对象变换到坐标系中; (4)在坐标系中绕旋转角,变换为; (5)将图形对象变换为原坐标系中,变换为。 这样绕旋转角的变换为: (2.2.10) 三、程序及功能说明 3.1 绘制直线、圆、椭圆、抛物线…… 3.1.1 绘制直线 plot(A,B) 通过运用matlab中的plot函数画出两点之间的直线图像。其中A,B为直线上的两个点 的坐标,通过两点绘制直线。 3.1.2 绘制圆 function circle(A,R) alpha=0:pi/50:2*pi; %角度[0,2*pi] %R=2;%半径 x=R*cos(alpha)+A(1); y=R*sin(alpha)+A(2); plot(x,y,'-') axis equal 首先先对角度alpha分割成小区间,且求出相应的cos和sin值,再根据输入的半径和 圆心坐标A,带入公式求得圆上的点的坐标,再绘制出图像。 3.1.3 绘制椭圆 function tuocircle(a,b) t=0:pi/20:2*pi; x=a*cos(t); y=b*sin(t); plot(x,y) 首先先对角度t分割成小区间得出相应的cos和sin值,根据再根据
第三章作业 1. 〔6分〕名词解释:扫描转换、增量算法、反走样。 扫描转换:根本图形的光栅化就是在像素点阵中确定最正确逼近与理想图形的像素点集 ,并用指定颜色显示这些像素点集的过程。当光栅化与按扫描线顺序绘制图形的过程集 合在一起时,也称为扫描转移。 增量算法:在一个迭代算法中,如果每一步X,Y值是用前一步的值加上一个增量来获得 的,那么,这个算法就称为增量算法。 反走样:用于减轻走样的技术称为反走样或者称为抗锯齿。 2. 〔10分〕计算起点坐标为〔0,0〕,终点坐标〔12,9〕直线的中点Bresenham算法的每一 步坐标值以及中点偏差判别式d的值,填入表3-1中,并用黑色绘制图3- 29中的直线段的扫描转换像素。 图3-29 像素点阵 "x "y "d "x "y "d " "0 "0 "-0.25 "7 "5 "-0.5 " "1 "1 "0 "8 "6 "-0.25 " "2 "1 "-0.75 "9 "6 "0 " "3 "2 "-0.5 "10 "7 "-0.75 " "4 "3 "-0.25 "11 "8 "-0.5 " "5 "3 "0 "12 "9 "-0.25 " "6 "4 "-0.75 " " " " 表3-1 x,y和d的值 第四章作业 1. 〔10分〕名词解释:四邻接点、八邻接点、四连通域、八连通域、种子填充算法。 四邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右这四个像素,称 为四邻接点。 八邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右以及左上、左下 、右上、右下这八个像素,称为八邻接点。 四连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右这 四个邻接点可以遍历区域内部的所有像素,该多边形区域称为四连通域。 八连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右以 及左上、左下、右上、右下这八个邻接点可以遍历区域内部的所有像素,该多边形区域 称为八连通域。 种子填充算法:从区域内任意一个种子像素开场,由内向外将填充色扩散到整个多边形 区域的填充过程。 2. 〔10分〕试写出图4-43所示多边形的边表和扫描线y=4的有效边表。 图4-43 多边形 解:ET表 Y=4时的AET表 3. 〔10分〕图中种子O,试根据简单四连通种子填充算法按左、上、右、下入栈的顺序给 出象素点填充的次序。 " " " " " " " " "3 "O "4 "5 " " " "2 "1 " "6 " " " " " " " " " 第五章作业 1. 〔10分〕名词解释:坐标变换、WCS、UCS、窗口、视区、窗视变换、裁剪、 坐标变更:是坐标系发生变换,但物体位置不发生改变,然后在坐标系下表示所有物 体上的顶点。 WCS:〔word coordinate system〕世界坐标系,描述现实世界中场景的固定坐标系。 UCS:〔user coordinate system〕用户坐标系,描述物体几何模型的坐标系。有时也称为局域坐标系〔local coordinate system,LCS〕。用户坐标系也是实数域坐标系、 窗口:在观察坐标系中定义确实定显示内容的矩形区域称为窗口。 视区:在屏幕坐标系中定义的输出图形的矩形区域称为视区。 窗视变换:图形输出需要进展窗口到视区的变换,只有在窗口内的图形才能在视区中输 出,并且输出的形状要根据视区的大小进展调整,这称为窗视变换。 裁剪:在二维观察中,需要在观察坐标系下根据窗口大小对世界坐标系中的二维图形进 展裁剪,只将位于窗口内的图形变换到视区输出。 2. 〔10分〕如图5- 51所示,求P0(4,1)、P1〔7,3〕、P2〔7,7〕、P3〔1,4〕构成的四边形绕 Q(5,4)逆时针旋转45°的变换矩阵和变换后图形的顶点坐标。 图5-51 四边形旋转 解:变换的过程包括: 1. 平移:将P点平移至原点,变换矩形为: 2. 旋转:图形绕原点〔P点〕旋转45度,变换矩形为: 3. 反平移:将P点移回原处,变换矩阵为: 变换矩阵为: 变换过程为: 3. 〔14分〕用编码裁剪算法裁剪线段P0(0,2),P1(3,3),裁剪窗口为wxl=1,wxr=6,wy b=1,wyt=5,如图5-54所示。要求写出: 〔1〕窗口边界划分的9个区间的编码原那么。 〔2〕线段端点的编码。 〔3〕裁剪的主要步骤。 〔4〕裁剪后窗口内直线段的端点坐标。 图5-54 直线段裁剪 解:1〕首先对直线段的端点进展编码,即对直线段的任一端点〔x,y〕,根据其坐标所 在的区域,赋予一个四位的二进制码D3D2D1D0 假设x<wxl,那么D0=1,否那么D0=0; 假设x>wxr,那么D1=1,否那么D1=0; 假设y<wyb,那么D2=1,否那么D2=
在MATLAB中实现三维坐标任意旋转需要使用旋转矩阵来进行计算。以下是一个简单的步骤: 1. 定义旋转旋转角度:首先需要确定旋转向量,这个向量应该是一个单位向量,并且需要确定旋转的角度。 2. 构建旋转矩阵:根据给定的旋转旋转角度,可以用 Rodrigues' rotation formula 计算旋转矩阵。例如,对于绕向量 axis = [x, y, z] 旋转 angle 度的情况,旋转矩阵可以用下式给出: ``` cos_angle = cosd(angle); sin_angle = sind(angle); rotation_matrix = [cos_angle + axis(1)^2 * (1 - cos_angle), axis(1) * axis(2) * (1 - cos_angle) - axis(3) * sin_angle, axis(1) * axis(3) * (1 - cos_angle) + axis(2) * sin_angle; axis(2) * axis(1) * (1 - cos_angle) + axis(3) * sin_angle, cos_angle + axis(2)^2 * (1 - cos_angle), axis(2) * axis(3) * (1 - cos_angle) - axis(1) * sin_angle; axis(3) * axis(1) * (1 - cos_angle) - axis(2) * sin_angle, axis(3) * axis(2) * (1 - cos_angle) + axis(1) * sin_angle, cos_angle + axis(3)^2 * (1 - cos_angle)]; ``` 3. 对三维坐标进行旋转:利用计算得到的旋转矩阵,可以将每个三维坐标点通过矩阵乘法进行旋转。假设三维坐标点为 point = [x, y, z],则旋转后的坐标可以通过下式给出: ``` new_point = rotation_matrix * transpose(point); ``` 其中,transpose(point) 将三维坐标点 point 转置为列向量。 使用以上步骤,就可以在MATLAB中实现对三维坐标任意旋转了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值