ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

hdu 3320 openGL(空间变换+矩阵变换)

http://acm.hdu.edu.cn/showproblem.php?pid=3320

题意:
      给定(x,y,z) 然后3个变换。求最后的结果。
      初始的(x,y,z)最后给出,变换的顺序由后往前。

我采取的是从后往前做的。还可以使用矩阵运算,从前往后,右乘哦。      参考:http://fayaa.com/code/view/9510/

还有就是数据的读入 sscanf()是个好东西呀,哈哈。

总结:
      数学很重要啊!


#include<stdio.h>
#include
<string.h>
#include
<math.h>
struct tra{
    
char cm;
    
double w;
    
double x,y,z;
} p[
104];
char ch[125];
int main()
{
    
int t;
    
int n;
    
int i,j,k;
    scanf(
"%d",&t);
    getchar();
    
while (t--)
    {
        gets(ch);
        n
=0;
        
while (gets(ch)&&ch[2]!='E')
        {
            n
++;
            
char s[125];
            memset(s,
0,sizeof(s));
            
if (ch[2]=='R')
            {
                p[n].cm
=ch[2];
                i
=0;
                
while (ch[i]!='(')  i++;
                k
=i+1;
                
while (ch[i]!=')')  i++;
                j
=i-1;
                
for (i=k;i<=j;i++)
                    s[i
-k]=ch[i];
            
//    puts(s);
                sscanf(s,"%lf,%lf,%lf,%lf",&p[n].w,&p[n].x,&p[n].y,&p[n].z);
            }
            
else
            {
                i
=0;
                
while (ch[i]!='(')  i++;
                k
=i+1;
                
while (ch[i]!=')')  i++;
                j
=i-1;
                
for (i=k;i<=j;i++)
                    s[i
-k]=ch[i];
          
//      puts(s);
                p[n].cm=ch[2];
                sscanf(s,
"%lf,%lf,%lf",&p[n].x,&p[n].y,&p[n].z);
            }
        }
  
//      for (i=n;i>=1;i--)
   
//         printf("%c %lf %lf %lf %lf\n",p[i].cm,p[i].w,p[i].x,p[i].y,p[i].z);

        
double x,y,z;
 
//       x=p[n].z,y=p[n].y,z=p[n].z;
        for (i=n;i>=1;i--)
        {
            
char c=p[i].cm;
            
if (c=='V')
                x
=p[i].x,y=p[i].y,z=p[i].z;
            
else
                
if (c=='S')
                    x 
*=p[i].x,y *=p[i].y,z *=p[i].z;
                
else
                    
if (c=='T')
                        x 
+=p[i].x,y +=p[i].y,z +=p[i].z;
                    
else
                    {
                        
double si=sin(p[i].w),co=cos(p[i].w);
                        
double m=sqrt(p[i].x*p[i].x+p[i].y*p[i].y+p[i].z*p[i].z);
                        
double x1,y1,z1;
                        
double x2,y2,z2;
                        x1
=p[i].x/m;y1=p[i].y/m;z1=p[i].z/m;
                        x2
=(x1 * x1 * (1 - co) + co)*x+ (x1 * y1 * (1 - co) - z1 * si)*y+ (x1 * z1 * (1 - co) + y1 * si)*z;
                        y2
=(y1 * x1 * (1 - co) + z1 * si)*x+ (y1 * y1 * (1 - co) + co)*y+ (y1 * z1 * (1 - co) - x1 * si)*z;
                        z2
=(x1 * z1 * (1 - co) - y1 * si)*x+ (y1 * z1 * (1 - co) + x1 * si)*y+ (z1 * z1 * (1 - co) + co)*z;
                        x
=x2;y=y2;z=z2;
                    }
        }
        printf(
"%.1lf %.1lf %.1lf\n",x,y,z);
    }
    
return 0;
}



      

posted on 2012-07-15 13:09 wangs 阅读(235) 评论(0)  编辑 收藏 引用 所属分类: ACM-计算几何


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理