sicily 6445. Triangle transformation
Description
图行变换是计算机图行 学中经常遇到的问题,在计算机中,一个图像通过一些点和它们之间的关系来表示。在这里为了简化问题,我们仅考虑二维图像中的三角形,且只考虑两种变换—— 旋转变换和平移变换。给出一个三角形三个点的坐标和它绕原点逆时针旋转的角度,以及沿x和y方向上平移的距离,求最后三角形各点的坐标。
Input
输入包括多组测试用例,第一行为一个数T,表示测试用例的个数。
对于每组测试用例包括四行,第一行为三个整数r, h, k,分别表示三角形绕原点逆时针旋转的角度,沿x轴移动的距离,沿y轴移动的距离。
接下来三行,每行两个数,分别表示三角形的三个点A、B、C的x, y坐标(保证输入是合法的)。
Output
对于每组测试用例输出四行。
第一行为Case #:其中#表示测试用例序号。
接下来三行,每行两个数,分别表示变换之后的三角形的三个点A、B、C的x, y坐标,结果保留到小数点后两位。
平移很简单,但是旋转有一点麻烦,可以用高中数学中的公式将直角坐标转换成极坐标,进行旋转后再转换回去。
一开始WA了,自己设计了一些测试用例,发现某些计算结果出现了负零(-0.00),应该是浮点数精度误差的问题,本该是0的计算结果变成了绝对值很小的负数,所以取前两位小数的时候还会显示负号,所以特殊处理了一下,就AC了
View Code
1 #include<stdio.h> 2 #include<math.h> 3 struct dot{ 4 double x; 5 double y; 6 }; 7 typedef struct dot Dot; 8 9 int main() 10 { 11 int t, i, j; 12 Dot p[3]; 13 double r, h, k; 14 double theta, d; 15 scanf("%d", &t); 16 for( i = 1; i <= t; i++ ) 17 { 18 scanf("%lf %lf %lf", &r, &h, &k ); 19 for( j = 0; j < 3; j++ ) 20 { 21 scanf("%lf %lf", &(p[j].x), &(p[j].y) ); 22 } 23 24 printf("Case %d:\n", i); 25 26 for( j = 0; j < 3; j++ ) 27 { 28 theta = atan2( p[j].y, p[j].x )+ r * 3.14159265 / 180; 29 d = sqrt( p[j].x * p[j].x + p[j].y * p[j].y ); 30 p[j].x = d * cos(theta); 31 p[j].y = d * sin(theta); 32 p[j].x += h; 33 p[j].y += k; 34 35 if ( fabs(p[j].x) < 0.000001) 36 p[j].x = 0.0000; 37 if ( fabs(p[j].y) < 0.000001) 38 p[j].y = 0.0000; 39 printf("%.2lf %.2lf\n", p[j].x, p[j].y ); 40 } 41 } 42 return 0; 43 }