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 }
原文地址:https://www.cnblogs.com/joyeecheung/p/2867652.html