参考

三维旋转矩阵 + 矩阵加速

这个还要用到仿射变换。

平移

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..
 
 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 1010
#define LL long long
#define INF 0xfffffff
#define forn(i,n) for(int i=0; i<(int)(n); i++)
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>; struct point3
{
double x,y,z;
} p[N];
struct Mat
{
double mat[][];
};
int n,m;
char str[];
Mat operator * (Mat a,Mat b)
{
Mat c;
memset(c.mat,,sizeof(c.mat));
int i,j,k;
for(i = ; i < n ; i++)
for(j = ; j < n ; j++)
for(k = ; k < n ; k++)
c.mat[i][j] +=a.mat[i][k]*b.mat[k][j];
return c;
}
Mat operator ^(Mat a,int k)
{
Mat c; int i,j;
for(i = ; i < n ; i++)
for(j = ; j < n ; j++)
c.mat[i][j] = (i==j);
for(; k ; k >>= )
{
if(k&) c = c*a;
a = a*a;
}
return c;
}
Mat solve(int k)
{ Mat cc;
double a[];
int i;
memset(cc.mat,,sizeof(cc.mat));
for(i = ; i < ; i++) cc.mat[i][i] = ;
while(~scanf("%s",str))
{
if(str[]=='e')
{
break;
}
Mat c;
memset(c.mat,,sizeof(c.mat));
for(i = ; i < ; i++) c.mat[i][i] = ;
if(str[]=='t')
{
forn(i,) scanf("%lf", &a[i]);
forn(i,) c.mat[i][]=a[i];
}
else if(str[]=='s')
{
for(i = ; i < ; i++)
scanf("%lf",&a[i]);
for(i = ; i < ; i++)
c.mat[i][i] = a[i];
}
else if(str[]=='r'&&str[]=='o')
{
for(i = ; i < ; i++) scanf("%lf",&a[i]);
a[] = a[]/*pi;
double mag=sqrt(a[]*a[]+a[]*a[]+a[]*a[]);
a[]/=mag;
a[]/=mag;
a[]/=mag;
c.mat[][] = (-cos(a[]))*a[]*a[]+cos(a[]);
c.mat[][] = (-cos(a[]))*a[]*a[]-sin(a[])*a[];
c.mat[][] = (-cos(a[]))*a[]*a[]+sin(a[])*a[];
c.mat[][] = (-cos(a[]))*a[]*a[]+sin(a[])*a[];
c.mat[][] = (-cos(a[]))*a[]*a[]+cos(a[]);
c.mat[][] = (-cos(a[]))*a[]*a[]-sin(a[])*a[];
c.mat[][] = (-cos(a[]))*a[]*a[]-sin(a[])*a[];
c.mat[][] = (-cos(a[]))*a[]*a[]+sin(a[])*a[];
c.mat[][] = (-cos(a[]))*a[]*a[]+cos(a[]);
}
else if(str[]=='r')
{
int kk ;
scanf("%d",&kk);
c = solve(kk);
}
cc = c*cc;
}
return cc^k;
}
int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
}
int main()
{
int i,j;
n = ;
while(scanf("%d",&m)&&m)
{
Mat c;
memset(c.mat,,sizeof(c.mat));
for(i = ; i < n; i++) c.mat[i][i] = ;
c = solve()*c;
for(i = ; i <= m; i++)
{
Mat x,y;
memset(y.mat,,sizeof(y.mat));
for(j = ; j < ; j++)
scanf("%lf",&y.mat[j][]);
y.mat[][] = ;
x = c*y;
p[i].x = x.mat[][],p[i].y = x.mat[][],p[i].z = x.mat[][];
}
for(i = ; i <= m; i++)
{
printf("%.2f %.2f %.2f\n",p[i].x+eps,p[i].y+eps,p[i].z+eps);
}
puts("");
}
return ;
}

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. java线程(2016-4-7)

    Thread.yield()的调用是对线程调度器(Java线程机制的一部分,可以将CPU从一个线程转移到另一个线程)的一种建议,它在声明:"我已经执行完生命周期中最重要的部分了,此刻正是切换 ...

  2. WORD学习之制作座位表

    1.点击插入-表格-插入表格,将表格的列数设置为6,行数为10,再点击“确定”按钮

  3. MXNet学习~第一个例子~跑MNIST

    反正基本上是给自己看的,直接贴写过注释后的代码,可能有的地方理解不对,你多担待,看到了也提出来(基本上对未来的自己说的),三层跑到了97%,毕竟是第一个例子,主要就是用来理解MXNet怎么使用. #导 ...

  4. FORM中需要反复选择LOV

    注意:1.字段长度问题 2.提示显示样式:第一条记录 3.那些不现实的返回项,或者是只读的返回项可以  将从列表中验证 改为 否    比如一个LOV 返回2个值 但是其实只用选择前一个就可以带出后一 ...

  5. 家教O2O维护“老师”的逼格,算不尊重市场吗

    既然做O2O,本身就是把这当服务业的.出钱的人才是老大.老师受到尊重是因为你传授的东西他人认可,而不该是因为“老师”两个字.另外,成年人会去请家教的,往往是自己有一些长处的.你只是一方面的老师,人家可 ...

  6. 【实践】js实现简易的四则运算计算器

    最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...

  7. C语言三维数组分解

    很多人在学习C的时候,感觉三维数组很难想象,而且不理解深度是什么?做了一个图,帮大家分解一下                                                       ...

  8. apiCloud图片选择、处理、上传模块

    将 apiCloud 开发app的图片上传流程,完整封装成了一个页面,页面处理一些必备的处理库外和css外 ,还需要依赖jquery 库,不过可以不管,页面默认使用cnd引用. 页面使用接口如下:pa ...

  9. linux sed

    sed 命令 sed -i 's/3306/3308/g' my.cnf mysql # 同时替换两个文件

  10. JAVA泛型详解2 转载

    转载地址:http://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845938.html 普通泛型 class Point<T>{ // ...