2017年浙江工业大学大学生程序设计迎新赛预赛 J 裁缝大师【简单几何】

J 裁缝大师

题目描述

坤酱想把一块圆形的布裁成正多边形,于是请你告诉坤酱正多边形的几个顶点应在哪里?
为了方便表示,圆给出在坐标系中,正多边形的第一个顶点固定在该圆在平行于x轴正方向最远的位置上,请按顺时针顺序输出所有的顶点。

输入描述:

输入第一行给出单独一个整数T,表示数据组数接下来T行,
每行顺序给出四个整数x,y,R,N:
表示圆心为(x,y),半径为R,裁出一个正N边形。

−104≤x,y≤104,
0

输出描述:

对于每组数据,输出N行,从第一个顶点开始,按顺时针顺序输出所有N个顶点的坐标。
(由于坤酱工具有限,你只需保留2位小数)
示例1

输入

2
0 0 10 4
100 0 1 3

输出

10.00 0.00
0.00 -10.00
-10.00 0.00
0.00 10.00
101.00 0.00
99.50 -0.87
99.50 0.87

备注:

π可以用4 *atan(1.0)得到。
你需要避免输出-0.00。

题意: 给你一个圆心坐标和半径,要在圆内找到正n边形的坐标,第一个在平行于x轴最远的位置

分析: 很简单的几何题,我们可以圆分成n份,相对应的角度与圆的交点就是对应正n边形的几个顶点,这里的角度要用弧度来表示,比如 90o 要用 π2 表示,这里提示里说了要杜绝-0.00,这种情况,而这种情况就是 cos(π) ,check下就行

参考代码

#include

using namespace std;

#define PI  4*atan(1.0)
#define eps 0.000000001


int main(){
    int T;cin>>T;
    while (T--) {
        double x,y,r,n;cin>>x>>y>>r>>n;
        double it = 2*PI/n;
        printf("%.2f %.2f\n",x+r,y);
        double now = it;
        for(int i = 1;i < n;i++) {
            if(now < PI) {
                printf("%.2f %.2f\n",r*cos(-now) + x,y + r*sin(-now));
            } else {
                printf("%.2f %.2f\n",r*cos(2*PI-now) + x,y + r*sin(2*PI-now));
            }
            now += it;
        }
    }
    return 0;
}
  • 如有错误或遗漏,请私聊下UP,thx

你可能感兴趣的:(几何水题)