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;
}