hdu 3320 计算几何(三维图形几何变换)

openGL

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 170    Accepted Submission(s): 77

Problem Description

Jiaoshou selected a course about “openGL” this semester. He was quite interested in modelview, which is a part of “openGL”. Just using three functions, it could make the model to move, rotate and largen or lessen. But he was puzzled with the theory of the modelview. He didn’t know a vertex after several transformations where it will be.

Now, He tells you the position of the vertex and the transformations. Please help Jiaoshou find the position of the vertex after several transformations.

Input

The input will start with a line giving the number of test cases, T.
Each case will always begin with “glBegin(GL_POINTS);”.Then the case will be followed by 5 kinds of function.
1. glTranslatef(x,y,z);
  This function will translate the vertex(x’,y’,z’) to vertex(x+x’,y+y’,z+z’).
2. glRotatef(angle,x,y,z);
  This function will turn angle radians counterclockwise around the axis (0,0,0)->(x,y,z).
3. glScalef(x,y,z);
  This function wiil translate the vertex(x’,y’,z’) to vertex(x*x’,y*y’,z*z’).
4. glVertex3f(x,y,z);
  This function will draw an initial vertex at the position(x,y,z). It will only appear once in one case just before “glEnd();”. In openGL, the transformation matrices are right multiplied by vertex matrix. So you should do the transformations in the reverse order. 
5. glEnd();
  This function tells you the end of the case.
In this problem angle,x,y,z are real numbers and range from -50.0 to 50.0. And the number of functions in each case will not exceed 100.

Output

For each case, please output the position of the vertex after several transformations x,y,z in one line rounded to 1 digits after the decimal point , separated with a single space. We guarantee that x,y,z are not very large.

Sample Input

1

glBegin(GL_POINTS);

glScalef(2.0,0.5,3.0);

glTranslatef(0.0,1.0,0.0);

glVertex3f(1.0,1.0,1.0);

glEnd();

Sample Output

2.0 1.0 3.0

Hint

In this sample, we first let the vertex do “glTranslatef(x,y,z);” this function, then do “glScalef(x,y,z)”.

Author

Water Problem SecKill Expert

Source

HDU “Valentines Day” Open Programming Contest 2010-02-14

题目大意:给一个点的坐标,对它进行多种变换(平移变化、比例变换、绕任意轴旋转变换),输出它的最终坐标。不过它给出各变换的操作顺序是反过来的。 

解题思路:构造各变换的变化矩阵,用矩阵乘法乘起来就是最终坐标。不会构造变化矩阵的详情请看下面:

三维几何变换

1. 三位平移变换是使立体在空间平移一段距离,其形状和大小保持不变。变化矩阵为

                 

2. 三维局部比例变换,关于原点的比例变换的变换矩阵为

3. 三维立体绕通过原点的任意轴旋转角的变换。

设ON为过坐标原点的一根任意轴,它对坐标轴的前方向余弦分别为

中间过程就不多说了详情请看计算机图形学教程(第2版)P176-P184,它的变换矩阵为

      

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 using namespace std;
 6
 7 int cnt;
 8 char operat[105][105];
 9 double ang,x,y,z,xx,yy,zz;
10
11 struct Matrix
12 {
13     double m[4][4];
14 };
15
16 Matrix mult(Matrix a,Matrix b)//矩阵乘法
17 {
18     Matrix c;
19     for(int i=0;i<4;i++)
20     {
21         for(int j=0;j<4;j++)
22         {
23             c.m[i][j]=0.0;
24             for(int k=0;k<4;k++)
25                 c.m[i][j]+=a.m[i][k]*b.m[k][j];
26         }
27     }
28     return c;
29 }
30
31 Matrix Translate(int i)//平移变换
32 {
33     sscanf(operat[i],"glTranslatef(%lf,%lf,%lf);",&x,&y,&z);
34     Matrix tmp={1,0,0,0,0,1,0,0,0,0,1,0,x,y,z,1};
35     return tmp;
36 }
37 Matrix RatioTranslate(int i)//局部比例变换
38 {
39     sscanf(operat[i],"glScalef(%lf,%lf,%lf);",&x,&y,&z);
40     Matrix tmp={x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1};
41     return tmp;
42 }
43
44 Matrix RotateTranslate(int i)//绕通过原点的任意轴旋转变换
45 {
46     sscanf(operat[i],"glRotatef(%lf,%lf,%lf,%lf);",&ang,&x,&y,&z);
47     double t=sqrt(x*x+y*y+z*z);
48     double n1=x/t;//cos(a),a是与x轴的夹角
49     double n2=y/t;//cos(b),b是与y轴的夹角
50     double n3=z/t;//cos(c),c是与z轴的夹角
51     double S=sin(ang),C=cos(ang);
52     Matrix tmp={n1*n1+(1-n1*n1)*C,n1*n2*(1-C)+n3*S,n1*n3*(1-C)-n2*S,0,
53     n1*n2*(1-C)-n3*S,n2*n2+(1-n2*n2)*C,n2*n3*(1-C)+n1*S,0,
54     n1*n3*(1-C)+n2*S,n2*n3*(1-C)-n1*S,n3*n3+(1-n3*n3)*C,0,
55     0,0,0,1};
56     return tmp;
57 }
58
59 Matrix solve()
60 {
61     Matrix ret={1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1};
62     sscanf(operat[cnt-2], "glVertex3f(%lf,%lf,%lf);",&xx,&yy,&zz);
63     for(int i=cnt-3;i>0;i--)
64     {
65         if(operat[i][2]==‘T‘)
66             ret=mult(ret,Translate(i));
67         else if(operat[i][2]==‘S‘)
68             ret=mult(ret,RatioTranslate(i));
69         else if(operat[i][2]==‘R‘)
70             ret=mult(ret,RotateTranslate(i));
71     }
72     return ret;
73 }
74
75 int main()
76 {
77     int t;
78     scanf("%d",&t);
79     getchar();
80     while(t--)
81     {
82         cnt=0;
83         while(1)
84         {
85             gets(operat[cnt++]);
86             if(operat[cnt-1][2]==‘E‘)
87                 break;
88         }
89         Matrix ans=solve();
90         printf("%.1lf %.1lf %.1lf\n",xx*ans.m[0][0]+yy*ans.m[1][0]+zz*ans.m[2][0]+ans.m[3][0],
91             xx*ans.m[0][1]+yy*ans.m[1][1]+zz*ans.m[2][1]+ans.m[3][1],
92             xx*ans.m[0][2]+yy*ans.m[1][2]+zz*ans.m[2][2]+ans.m[3][2]);
93     }
94     return 0;
95 }
时间: 2024-11-02 13:02:51

hdu 3320 计算几何(三维图形几何变换)的相关文章

[Matlab绘图][三维图形

绘制三维图形的基本函数 最基本的三维绘图函数为plot3: plot3与plot用法十分相似,调用格式: plot(x1,y1,z1,选项1,x2,y2,z2,选项2,...,xn,yn,zn,选项n) 当x,y,z是同维向量时,则x,y,z,对应元素构成一条三维曲线: 当x,y,z是同维矩阵时,则以x,y,z对应列元素绘制三维曲线,曲线条数等于矩阵列数. 例: 程序如下: t=0:pi/50:2*pi; x=8*cos(t); y=4*sqrt(2)*sin(t); z=-4*sqrt(2)*

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

二维坐标轴中绘三维图形

代码部分 CRect rect; GetClientRect(rect);  pDC->SetMapMode(MM_ANISOTROPIC);  pDC->SetWindowExt(rect.Width(), rect.Height());  pDC->SetViewportExt(rect.Width(), -rect.Height());  pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2); CRect rect1(CPo

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

【WPF】用三角形网格构建三维图形

虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image 控件,Shape 类型等,或者我们常用的一些控件,都可以放进三维空间中,用这种方式构建模型可能更为实用,也好弄(至少不借助专门的建模工具的前提下). 2.完全利用坐标建模.实际上是用 N 个三角形来组合成三维模型. 虽然你会看到基类型 Visual3D 派生出了好几个类型,但总体上说也就划分为上述

三维图形概述

原文 三维图形概述 通过 Windows Presentation Foundation (WPF) 中的三维功能,开发人员可以使用标记代码和程序代码对三维图形进行绘制.转换和动画处理. 开发人员可以合并二维和三维图形以创建丰富的控件,提供复杂的数据图解,或者增强用户对应用程序界面的体验.WPF 中的三维支持并非旨在提供功能齐全的游戏开发平台.本主题概述了 WPF 图形系统中的三维功能. 本主题包括下列各节. 二维容器中的三维 三维坐标空间 照相机和投影 模型和网格基元 向模型应用 Materi

WPF三维图形

wpf 三维图形基础生成三维图形的基本思想是能得到一个物体的三维立体模型(model).由于我们的屏幕只有二维,因而我们定义了一个用于给物体拍照的照相机(Camera).拍到的照片其实是物体到一个平坦表面的投影.这个投影由3D渲染引擎渲染成位图.引擎通过计算所有光源对3D空间中物体的投影面反射的光量,来决定位图中每个像素点的颜色.物体的每一个表面都有一种材质(material)和一个画刷(brush).材质定义了一个具体角度的光的反射量,而画刷定义了表面的颜色.画刷可以是一种单纯的颜色,也可以是

matlab中画三维图形

这里主要讲述两个方法用matlab画三维图形: 1.mesh函数 先看一个简单的例子: 1 x = 1:1:3; 2 y = 1:1:4; 3 [X, Y] = meshgrid(x, y); 4 Z = zeros(4,3); 5 Z = [ 1 2 3; 6 2 3 4; 7 3 4 5; 8 4 5 6] 9 mesh(X, Y, Z); 这是个简单的用mesh函数画的三维图,结果是: 这里需要注意一点: 矩阵Z的行列,Z的行是Y坐标系的值(meshgrid的右边位置的数y),Z的列是X坐

怎么在CAD中绘制三维图形

在CAD中绘制CAD图纸的时候,建筑设计师们在使用的过程中,不仅要使用到平面图形,还要绘制三维图形,因为三维图形绘制出来的效果更加的接近实物,那问题就来了,怎么在CAD中绘制三维图形?那不会的小伙伴们就可以来看看,下面小编就来教教大家具体的操作方法,希望对你们有用. 第一步:首先,在电脑中打开浏览器,搜索迅捷CAD编辑器,然后在搜索的结果中鼠标点击进入官网,进入之后根据系统提示的下载安装CAD编辑器到电脑中,并将该软件进行启动. 第二步:接下来,将安装完成的CAD编辑器移动鼠标到该软件所在的位置