`

bupt244

 
阅读更多

source: http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=244

title:     A Letter  to Programmers 

 

/*
坐标变换的公式+矩阵快速幂  
*/
#include <iostream>
#include <cmath>
using namespace std;
const int N = 105;
const double pi = acos(-1.0);
const double eps = 1e-4;
struct point{
	double x, y, z;
	point(double _x=0, double _y=0, double _z=0):x(_x), y(_y), z(_z){};
	void read(){
		scanf("%lf%lf%lf", &x, &y, &z);
	}
};
//三维点的变换矩阵,点做变换的时候是乘在矩阵的右边的,所以,后来的变换矩阵应该乘在
//原有矩阵的左边。
struct  mat{
	static const int N = 4;
	double v[N][N];
	int n;
	mat(){  n =  N; }
	void  setv(double _v[N][N]){
		int i, j;
		for(i = 0;  i < N; i++){
			for(j = 0; j < N; j++){
				v[i][j] = _v[i][j];
			}
		}
	}
	//点绕轴(0,0,0)->(x,y,z)旋转(旋转方向为从 点(x,y,z)往(0,0,0))
	//看是逆时针方向.如果所绕的轴的一个端点不在原点,则可以移到端
	//点再移回来
	void rotate(double x, double y, double z, double ang){
		double cosa = cos(ang), sina = sin(ang), len;
		len = sqrt(x*x+y*y+z*z);
		x/=len; y/=len; z/=len;
		double a[N][N] = {
			cosa+(1-cosa)*x*x, (1-cosa)*x*y-z*sina, (1-cosa)*x*z+y*sina, 0,
			(1-cosa)*x*y+z*sina, cosa+(1-cosa)*y*y, (1-cosa)*y*z-x*sina, 0,
			(1-cosa)*x*z-y*sina, (1-cosa)*y*z+x*sina, cosa+(1-cosa)*z*z, 0,
			0, 0, 0, 1
		};
		setv(a);
	}
	//移动矩阵,点(x0,y0,z0)变为(x0+x,y0+y,z0+z)
	void translate(double x, double y, double  z){
		double a[N][N] = {
			1, 0, 0, x,
			0, 1, 0, y,
			0, 0, 1, z,
			0, 0, 0, 1
		};
		setv(a);
	}
	//伸缩矩阵,点(x0,y0,z0)变为(x0*x,y0*y,z0*y)
	void scale(double x, double y, double z){
		double a[N][N] = {
			x, 0, 0, 0,
			0, y, 0, 0,
			0, 0, z, 0,
			0, 0, 0, 1
		};
		setv(a);
	}
	//对点st应用该矩阵
	point change(point st){
		double ds[N] = {st.x, st.y, st.z, 1}, ans[N-1];
		int i, j;
		//点做矩阵变换的时候是点是乘在矩阵的右边的
		for(i = 0; i < N-1; i++){
			ans[i] = 0;
			for(j = 0; j < N; j++){
				ans[i] += v[i][j] * ds[j];
			}
		}
		return point(ans[0], ans[1], ans[2]);
	}

	//矩阵乘法
	mat operator*(mat tm){
		mat ans;
		int i, j, k;
		for(i = 0; i < n; i++){
			for(j = 0; j < n; j++){
				ans.v[i][j] = 0;
				for(k = 0; k < n; k++){
					ans.v[i][j] += v[i][k] * tm.v[k][j];
				}
			}
		}
		return ans;
	}
	//矩阵幂
	mat operator^(int k){
		mat ans, org = *this;
		ans.scale(1., 1., 1.); //初始化为单位矩阵
		for(; k; k >>= 1, org = org * org){
			if(k&1){
				ans = ans * org;
//				ans = org * ans;
			}
		}
		return ans;
	}
};
char ts[N];  //ts[i]为'm'表示矩阵,为'r'表示重复
mat ms[N];
int  ks[N];

int main() {
//	freopen("in.txt", "r", stdin);

	int n, top, i, k;
	char op[20];
	double tx, ty, tz, d;
	mat m;
	point tp;
	while(~scanf("%d", &n) && n > 0){
		top=-1;
		while(true){
			scanf("%s", op);
			if(strcmp(op, "translate") == 0){
				scanf("%lf%lf%lf", &tx, &ty, &tz);
				ms[++top].translate(tx, ty, tz);
				ts[top] = 'm';
			}else if(strcmp(op, "scale") == 0){
				scanf("%lf%lf%lf", &tx, &ty, &tz);
				ms[++top].scale(tx, ty, tz);
				ts[top] = 'm';
			}else if(strcmp(op, "rotate") == 0){
				scanf("%lf%lf%lf%lf", &tx, &ty, &tz, &d);
				d = (d * pi) / 180.0;
				ms[++top].rotate(tx, ty, tz, d);
				ts[top] = 'm';
			}else if(strcmp(op, "repeat") == 0){
				scanf("%d", &k);
				ks[++top] = k;
				ts[top] = 'r';
			}else if(strcmp(op, "end") == 0){
				m.scale(1, 1, 1);
				while(top >= 0 && ts[top] != 'r'){
					m = m * ms[top];
					top--;
				}
				if(top < 0) break;
				m = m ^ ks[top];
				ms[top] = m;
				ts[top] = 'm';
			}
		}
		for(i = 0; i < n; i++){
			tp.read();
			tp = m.change(tp);
			printf("%.2f %.2f %.2f\n", tp.x + eps, tp.y + eps, tp.z + eps);
		}
		printf("\n");
	}
	return 0;
}
 
分享到:
评论

相关推荐

    2023bupt大创遥感语义分割.rar

    2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023...

    BUPT 打铃器 原音乐

    【标题】"BUPT打铃器 原音乐"指的是北京邮电大学(BUPT)特有的上下课铃声,这个软件或应用旨在帮助学生在家中模拟校园的学习环境。这款打铃器提供了原汁原味的BUPT铃声,让学生即使在远程学习期间也能感受到熟悉的...

    BUPT大二下,计网课程设计,DNS服务器实验.zip

    在本实验中,我们主要关注的是“BUPT大二下,计网课程设计,DNS服务器实验”。这个项目涉及到了计算机网络中的一个重要组件——域名系统(DNS),以及与之相关的编程技术,如C++。DNS是互联网上的一个关键服务,它...

    BUPT软件工程分布式温控系统

    在本项目“BUPT软件工程分布式温控系统”中,我们看到了一个基于Python编程语言实现的系统,结合了PyQT5图形用户界面库和MySQL数据库技术。 1. **Python编程**:Python是一种高级编程语言,以其简洁的语法和强大的...

    BUPT数据库实验大三

    本实验主要针对北京邮电大学(BUPT)计算机学院的大三学生,旨在通过实践加深对数据库理论的理解,提高操作数据库的能力。实验涵盖了从基础到进阶的多个方面,包括实验一至实验六,每个实验都有相应的实验报告和数据...

    BUPT计算机学院大雾,期末试卷,ppt

    【标题】:“BUPT计算机学院大雾,期末试卷,ppt” 这个标题暗示了这是一个与北京邮电大学(BUPT)计算机学院期末考试相关的资源。"大雾"可能是指某种难以理解或复杂的概念,或者可能是这次考试的特点,暗示题目...

    BUPT计算机大三Linux实验1-4

    【标题】"BUPT计算机大三Linux实验1-4"涉及的是北京邮电大学(BUPT)计算机科学与技术专业大三学生的Linux课程,该课程包括了四个阶段的实验实践和相关的教学材料。课程旨在深化学生对Linux操作系统的理解和应用能力...

    BUPT NoSQL数据库

    本章节主要探讨了NoSQL数据库中的三种重要类型:图数据库、文档数据库和列族数据库,并结合北京邮电大学(BUPT)的相关课程作业进行深入学习。 首先,让我们详细了解一下图数据库。图数据库以节点、边和属性三元组...

    BUPT物理实验报告

    在本篇“BUPT物理实验报告”中,涵盖了多个重要的物理学和电子学概念,主要涉及光学、力学和电磁学领域。这些实验不仅锻炼了学生的动手能力,也加深了他们对理论知识的理解。以下是对每个实验主题的详细阐述: 1. ...

    BUPT计算机系统csapp四次实验报告

    《BUPT计算机系统csapp四次实验报告》 在计算机科学领域,实验是理解和掌握理论知识的重要途径。北京邮电大学(BUPT)的计算机系统课程(csapp)旨在通过实践教学,帮助学生深入理解计算机系统的运作原理。这份实验...

    bupt.bmp图像附件

    【标题】:“bupt.bmp图像附件”通常指的是一个包含名为“bupt.bmp”的位图(Bitmap)图像文件的压缩包。位图图像是一种常见的数字图像格式,广泛应用于计算机图形处理、网页设计和个人多媒体项目。 【描述】:描述...

    BUPT_transform.zip_BUPT__BUPT_transform_bupt matlab

    本源码结合了rotate和skew,既可以单独执行rorate或者skew,也可以改变此两种方法的顺序来研究不同转换顺序带来的不同结果

    八皇后等java作业-bupt

    在本压缩包“八皇后等java作业-bupt”中,主要包含了北邮(BUPU)计算机科学与技术专业的学生进行Java编程学习的一些作业。这些作业涵盖了基础的编程概念、多态性应用以及一个经典的算法问题——八皇后问题。下面...

    【BUPT计算机系统基础】CSAPP-lab4-键盘驱动程序的分析与修改.docx

    【BUPT计算机系统基础】CSAPP_lab4_键盘驱动程序的分析与修改.docx 内容包含: 参考版实验报告 提交版实验报告 实验过程截图 VMware Workstation 16 Player libstdc++6-dev_3.4.6-6ubuntu3_i386.deb g++-3.4_3.4.6-6...

    BUPT大二下,数字逻辑课程设计,clock电子钟.rar

    本项目“BUPT大二下,数字逻辑课程设计,clock电子钟.rar”是通过VHDL语言实现的一个功能丰富的电子钟系统,涵盖了时间显示、整点报时、闹钟设定以及当前时间预置等多个实用功能。 首先,我们来探讨VHDL的基本概念...

    BUPT大二上大一下课程资源

    在“BUPT大二上大一下课程资源”这个压缩包中,包含了一系列的学术资料,主要涉及大学本科二年级上学期和下学期的部分核心课程。这些资源对于正在学习或者已经学习过这些课程的学生来说,是宝贵的复习和参考资料。...

    计数器 VHDL代码 BUPT

    用VHDL写的计时器,数字电路与逻辑设计实验 原创

    datalink_BUPT_计网大作业_滑动窗口协议_

    在这个“datalink_BUPT_计网大作业_滑动窗口协议_”的压缩包中,我们可以看到一个名为“datalink.c”的源代码文件,这很可能是北邮大学计算机网络课程的一个实践项目,要求学生实现滑动窗口协议。 滑动窗口协议的...

    计组实验bupt .rar

    【计算机组成原理】是计算机科学与技术领域的重要基础课程,主要研究计算机系统的基本构成和工作原理。这个实验可能涉及到的内容广泛,包括数据表示、运算器设计、存储系统、指令系统、中央处理器(CPU)、总线结构...

    [BUPT]计算导论OJ上机题参考源代码 + 可执行文件整合资源包(计算机学院 - 大一上).zip

    北京邮电大学(简称BUPT)计算机学院为大一新生开设的计算导论与程序设计课程,是一门旨在培养学生基础编程能力和算法思维的重要课程。在学习过程中,学生们会接触到大量的上机编程题目,这些题目通常被称为在线判题...

Global site tag (gtag.js) - Google Analytics