hdu4087ALetter to Programmers(三维旋转矩阵)
三维旋转矩阵 + 矩阵加速
这个还要用到仿射变换。
平移
#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(三维旋转矩阵)的更多相关文章
- 三维卷积:全景图像Spherical CNNs(Code)
卷积神经网络(CNN)可以很好的处理二维平面图像的问题.然而,对球面图像进行处理需求日益增加.例如,对无人机.机器人.自动驾驶汽车.分子回归问题.全球天气和气候模型的全方位视觉处理问题. 将球形信号的 ...
- 深入理解图优化与g2o:图优化篇
前言 本节我们将深入介绍视觉slam中的主流优化方法——图优化(graph-based optimization).下一节中,介绍一下非常流行的图优化库:g2o. 关于g2o,我13年写过一个文档,然 ...
- 四轴飞行器1.1 Matlab 姿态显示
四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的 ...
- PostScript学习:另一种缩写为PS的技术
1.前言 PostScript是一种编程语言,直译为"后处理脚本"[相对印刷过程而言],学名为页面描述语言.更为详细的解释见维基百科,以及其翻译版百度百科. 值得一提的是,Post ...
- Three.js 学习笔记(1)--坐标体系和旋转
前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...
- 相机标定问题-Matlab & Py-Opencv
一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op 坐标表示方法(u,v) Unit:Dots(个) 成像坐标系:Oi ...
- SLAM学习笔记 - 世界坐标系到相机坐标系的变换
参考自: http://blog.csdn.net/yangdashi888/article/details/51356385 http://blog.csdn.net/li_007/article/ ...
- 高翔《视觉SLAM十四讲》从理论到实践
目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...
- 《SLAM十四讲》个人学习知识点梳理
0.引言 从六月末到八月初大概一个月时间一直在啃SLAM十四讲[1]这本书,这本书把SLAM中涉及的基本知识点都涵盖了,所以在这里做一个复习,对这本书自己学到的东西做一个梳理. 书本地址:http:/ ...
随机推荐
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
- (三)内存 SDRAM 驱动实验 (杨铸 130 页)(勉强能懂个大概)
SDRAM 芯片讲解: 地址: 行地址 (A0-A12) 列地址 (A0-A8) 片选信号(BA0 BA1)(L-BANK)(因为SDRAM有 4片) 两片SDRAM 连线唯一区别在 UDQM ...
- Android--我的Butterknife黄油刀怎么找不到控件了!!!
1,首先说一下Butterknife这个插件真的挺好用的,不过最近几天在写demo的时候发现总是出现绑定的view是空的,当时着急写代码,也没有深究一下,直接手工findViewbyid了,今天下午写 ...
- vmware workstation unrecoverable error: (vmui)报错解决方法
实验室7月份刚换了电脑,之前一直用vmware来跑linux搞嵌入式开发,无论是宿舍的笔记本,还是之前用的旧台式机,都可以妥妥的跑vmware没有问题,结果换了新电脑之后,装上vmware works ...
- CocoaPods和git
CocoaPods是第三方框架的管理工具 CocoaPods 安装使用步骤: 1. 利用 gem 安装 CocoaPods! 1> gem 服务器在国外,提供了非常丰富的终端应用程序! gem ...
- 今天无意发现jquery的一个以前的误导
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- Android 监听返回键、HOME键
拦截返回键,HOME键,继承BaseActivity即可 import android.app.Activity; import android.content.BroadcastReceiver; ...
- 在SQL Server 2005中连接Oracle,完成查询、插入操作
建立指向Oracle的连接假设Oracle数据库的用户名为test,密码为test,在SQL Server数据库所在服务器上建立的指向Oracle数据库的服务命名为hisorcl.1. 在SQL Se ...
- IntelliJ IDEA 12.0 +Maven 初使用 - WEB项目的建立
新建项目 1.Fiew菜单 - New Project,选择Maven Module项,输入Project name,选择项目所在的路径,选择SDK,其余默认即可,点击Next按钮
- 三分钟学会funsioncharts
由于项目需求需要做一个报表,选择FusionCharts作为工具使用.由于以前没有接触过报表,网上也没有比较详细的fusionCharts教程,所以决定好好研究FusionCharts,同时做一个比较 ...