• 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 }
  • 相关阅读:
    移动端开发适配总结
    gulp进阶构建项目由浅入深
    css3 实现逐帧动画
    jQuery1.9.1源码分析--数据缓存Data模块
    nodejs开发指南读后感
    css3动画由浅入深总结
    浅谈javascript函数节流
    go语言基础之copy的使用
    go语言基础之append扩容特点
    go语言基础之append函数的使用
  • 原文地址:https://www.cnblogs.com/joyeecheung/p/2867652.html
Copyright © 2020-2023  润新知