参考

三维旋转矩阵 + 矩阵加速

这个还要用到仿射变换。

平移

translate tx ty tz
1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1
缩放
scale kx ky kz
kx 0  0  0
0  ky 0  0
0  0  kz 0
0  0  0  1
绕任意轴(过原点)旋转(注意要把轴向量归一化,不然会在“点在轴上”这个情况下出问题)
rotate x y z d
(1-cos(d))*x*x+cos(d)     (1-cos(d))*x*y-sin(d)*z   (1-cos(d))*x*z+sin(d)*y   0
(1-cos(d))*y*x+sin(d)*z   (1-cos(d))*y*y+cos(d)     (1-cos(d))*y*z-sin(d)*x   0
(1-cos(d))*z*x-sin(d)*y   (1-cos(d))*z*y+sin(d)*x   (1-cos(d))*z*z+cos(d)     0
                 0                                     0                                      0                       1
 
类似于一种构造矩阵的方式,每一种操作都相当于乘一次矩阵,具体第三个怎么推出来的没看懂。。。
 
矩阵乘法不支持交换律,一定要看好顺序。。debug了一天。。
据说会有-0.00这种答案不通过的坑,不过下面的代码加了eps..
 
  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stdlib.h>
  6. #include<vector>
  7. #include<cmath>
  8. #include<queue>
  9. #include<set>
  10. using namespace std;
  11. #define N 1010
  12. #define LL long long
  13. #define INF 0xfffffff
  14. #define forn(i,n) for(int i=0; i<(int)(n); i++)
  15. const double eps = 1e-;
  16. const double pi = acos(-1.0);
  17. const double inf = ~0u>>;
  18.  
  19. struct point3
  20. {
  21. double x,y,z;
  22. } p[N];
  23. struct Mat
  24. {
  25. double mat[][];
  26. };
  27. int n,m;
  28. char str[];
  29. Mat operator * (Mat a,Mat b)
  30. {
  31. Mat c;
  32. memset(c.mat,,sizeof(c.mat));
  33. int i,j,k;
  34. for(i = ; i < n ; i++)
  35. for(j = ; j < n ; j++)
  36. for(k = ; k < n ; k++)
  37. c.mat[i][j] +=a.mat[i][k]*b.mat[k][j];
  38. return c;
  39. }
  40. Mat operator ^(Mat a,int k)
  41. {
  42. Mat c;
  43.  
  44. int i,j;
  45. for(i = ; i < n ; i++)
  46. for(j = ; j < n ; j++)
  47. c.mat[i][j] = (i==j);
  48. for(; k ; k >>= )
  49. {
  50. if(k&) c = c*a;
  51. a = a*a;
  52. }
  53. return c;
  54. }
  55. Mat solve(int k)
  56. {
  57.  
  58. Mat cc;
  59. double a[];
  60. int i;
  61. memset(cc.mat,,sizeof(cc.mat));
  62. for(i = ; i < ; i++) cc.mat[i][i] = ;
  63. while(~scanf("%s",str))
  64. {
  65. if(str[]=='e')
  66. {
  67. break;
  68. }
  69. Mat c;
  70. memset(c.mat,,sizeof(c.mat));
  71. for(i = ; i < ; i++) c.mat[i][i] = ;
  72. if(str[]=='t')
  73. {
  74. forn(i,) scanf("%lf", &a[i]);
  75. forn(i,) c.mat[i][]=a[i];
  76. }
  77. else if(str[]=='s')
  78. {
  79. for(i = ; i < ; i++)
  80. scanf("%lf",&a[i]);
  81. for(i = ; i < ; i++)
  82. c.mat[i][i] = a[i];
  83. }
  84. else if(str[]=='r'&&str[]=='o')
  85. {
  86. for(i = ; i < ; i++) scanf("%lf",&a[i]);
  87. a[] = a[]/*pi;
  88. double mag=sqrt(a[]*a[]+a[]*a[]+a[]*a[]);
  89. a[]/=mag;
  90. a[]/=mag;
  91. a[]/=mag;
  92. c.mat[][] = (-cos(a[]))*a[]*a[]+cos(a[]);
  93. c.mat[][] = (-cos(a[]))*a[]*a[]-sin(a[])*a[];
  94. c.mat[][] = (-cos(a[]))*a[]*a[]+sin(a[])*a[];
  95. c.mat[][] = (-cos(a[]))*a[]*a[]+sin(a[])*a[];
  96. c.mat[][] = (-cos(a[]))*a[]*a[]+cos(a[]);
  97. c.mat[][] = (-cos(a[]))*a[]*a[]-sin(a[])*a[];
  98. c.mat[][] = (-cos(a[]))*a[]*a[]-sin(a[])*a[];
  99. c.mat[][] = (-cos(a[]))*a[]*a[]+sin(a[])*a[];
  100. c.mat[][] = (-cos(a[]))*a[]*a[]+cos(a[]);
  101. }
  102. else if(str[]=='r')
  103. {
  104. int kk ;
  105. scanf("%d",&kk);
  106. c = solve(kk);
  107. }
  108. cc = c*cc;
  109. }
  110. return cc^k;
  111. }
  112. int dcmp(double x)
  113. {
  114. if(fabs(x)<eps) return ;
  115. return x<?-:;
  116. }
  117. int main()
  118. {
  119. int i,j;
  120. n = ;
  121. while(scanf("%d",&m)&&m)
  122. {
  123. Mat c;
  124. memset(c.mat,,sizeof(c.mat));
  125. for(i = ; i < n; i++) c.mat[i][i] = ;
  126. c = solve()*c;
  127. for(i = ; i <= m; i++)
  128. {
  129. Mat x,y;
  130. memset(y.mat,,sizeof(y.mat));
  131. for(j = ; j < ; j++)
  132. scanf("%lf",&y.mat[j][]);
  133. y.mat[][] = ;
  134. x = c*y;
  135. p[i].x = x.mat[][],p[i].y = x.mat[][],p[i].z = x.mat[][];
  136. }
  137. for(i = ; i <= m; i++)
  138. {
  139. printf("%.2f %.2f %.2f\n",p[i].x+eps,p[i].y+eps,p[i].z+eps);
  140. }
  141. puts("");
  142. }
  143. return ;
  144. }

hdu4087ALetter to Programmers(三维旋转矩阵)的更多相关文章

  1. 三维卷积:全景图像Spherical CNNs(Code)

    卷积神经网络(CNN)可以很好的处理二维平面图像的问题.然而,对球面图像进行处理需求日益增加.例如,对无人机.机器人.自动驾驶汽车.分子回归问题.全球天气和气候模型的全方位视觉处理问题. 将球形信号的 ...

  2. 深入理解图优化与g2o:图优化篇

    前言 本节我们将深入介绍视觉slam中的主流优化方法——图优化(graph-based optimization).下一节中,介绍一下非常流行的图优化库:g2o. 关于g2o,我13年写过一个文档,然 ...

  3. 四轴飞行器1.1 Matlab 姿态显示

    四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的 ...

  4. PostScript学习:另一种缩写为PS的技术

    1.前言 PostScript是一种编程语言,直译为"后处理脚本"[相对印刷过程而言],学名为页面描述语言.更为详细的解释见维基百科,以及其翻译版百度百科. 值得一提的是,Post ...

  5. Three.js 学习笔记(1)--坐标体系和旋转

    前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...

  6. 相机标定问题-Matlab & Py-Opencv

    一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op    坐标表示方法(u,v)                 Unit:Dots(个) 成像坐标系:Oi      ...

  7. SLAM学习笔记 - 世界坐标系到相机坐标系的变换

    参考自: http://blog.csdn.net/yangdashi888/article/details/51356385 http://blog.csdn.net/li_007/article/ ...

  8. 高翔《视觉SLAM十四讲》从理论到实践

    目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...

  9. 《SLAM十四讲》个人学习知识点梳理

    0.引言 从六月末到八月初大概一个月时间一直在啃SLAM十四讲[1]这本书,这本书把SLAM中涉及的基本知识点都涵盖了,所以在这里做一个复习,对这本书自己学到的东西做一个梳理. 书本地址:http:/ ...

随机推荐

  1. WIN10 多用户登录

    WIN10 多用户登录 参考下面链接 http://www.mysysadmintips.com/windows/clients/545-multiple-rdp-remote-desktop-ses ...

  2. 基于SSM的分页

    现在基本每一个项目都有用到分页,SSM也是当前企业用到的比较频繁的框架,这里我就总结一下基于SSM的分页: 一.首先我们要准备一个分页的工具类 /** * 分页 */ public class Pag ...

  3. 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  4. 关于IE11版本下JS中时间判断的问题

    最近在做代码的优化及浏览器的兼容问题.遇到了谷歌.火狐.360兼容模式.IE(8以上)版本对时间判断大小的问题 . 在谷歌.火狐.360.IE11以下IE8以上版本下 var d1="201 ...

  5. 在Eclipse下搭建Android开发环境教程

    我们昨天向各位介绍了<在NetBeans上搭建Android SDK环境>,前不久也介绍过<在MyEclipse 8.6上搭建Android开发环境>, 都受到了读者的欢迎.但 ...

  6. Fortran 基础语法(一)

    GE是大于等于号(>=),GT是大于号(>),LE是小于等于号(<=),LT是小于号(<) IF基本用法   If(逻辑判断式) then …… End if If(逻辑判断式 ...

  7. TOAD和PLSQL 默认日期显示、rowid显示、TNSNAME的修改

    先说下要解决的问题: select rowid,acct_id,state_date from acct; 修改后,1)sql指明rowid,可以显示出来 2)时间格式显示为YYYYMMDD HH24 ...

  8. EF简单的添加修改删除基本语法

    using ( androidhiveEntities db = new androidhiveEntities() )                {                    #re ...

  9. 设置button键隐藏文字text

     新手的第一天,从最简单的view开始做起.首先先来做个最简单的button携带不可见文本,想要的时候,get它就行了. 编程的都知道,get .set方法,就不多介绍了. 创建一个类,MyButto ...

  10. laravel框架总结(十一) -- 集合

      创建集合: collect 辅助函数会利用传入的数组生成一个新的 Illuminate\Support\Collection 实例. $collection = collect([1, 2, 3] ...