题目描述
在一个平面坐标系中,有 N N N个点,它们构成了一个正N边形,按逆时针顺序,分别为 p 0 , p 1 . . . , p n − 1 p_0,p_1...,p_{n-1} p0,p1...,pn−1。保证 N N N是偶数,给出 x 0 , y 0 , x N 2 , y N 2 x_0,y_0,x_{\frac N2},y_{\frac N2} x0,y0,x2N,y2N
输入格式
第一行一个整数 N N N第二行分别给出 ( x 0 , y 0 ) (x_0,y_0) (x0,y0), 第三行给出 ( x N 2 , y N 2 ) (x_{\frac N2},y_{\frac N2}) (x2N,y2N).
输出格式
一行,包含两个小数,表示 x 1 , y 1 x_1,y_1 x1,y1。 如果你的输出与标准答案的差值在 1 0 − 5 10^{-5} 10−5以内,则认为正确。
题解
这一题很容易想到和三角函数有关,首先我们要把整个正多边形的内心(即题目给出两点的中点)放在原点上,我们可以作多边形外接圆得出 ( x 1 ′ , y 1 ′ ) (x_1^{'},y_1^{'}) (x1′,y1′)即 ( x 0 ′ , y 0 ′ ) (x_0^{'},y_0^{'}) (x0′,y0′)逆时针旋转 2 π n \frac{2\pi}{n} n2π,我们可以用 ( x 0 ′ , y 0 ′ ) (x_0^{'},y_0^{'}) (x0′,y0′)的反函数 + 2 π n +\frac{2\pi}{n} +n2π算出 ( x 1 ′ , y 1 ′ ) (x_1^{'},y_1^{'}) (x1′,y1′)对应的三角值,即可用三角函数算出 ( x 1 ′ , y 1 ′ ) (x_1^{'},y_1^{'}) (x1′,y1′),再平移会去就行了。
code
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const db Pi=acos(-1);
db far(db x,db y,db xx,db yy){
return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
int main(){
db n,x0,y0,xn,yn;
scanf("%lf%lf%lf%lf%lf",&n,&x0,&y0,&xn,&yn);
db r=far(x0,y0,xn,yn)/2;
db ox=(x0+xn)/2,oy=(y0+yn)/2;//计算原点的原坐标
xn-=ox,yn-=oy,x0-=ox,y0-=oy;//算出新直角坐标系中的对应值
db anle=acos(x0/r);
if(y0<0)anle=2*Pi-anle;//注意acos的值域因为cos(x)=cos(-x)
anle+=2*Pi/n;//再逆时针旋转2*Pi/n
db xx=cos(anle)*r+ox,yy=sin(anle)*r+oy;
printf("%.11lf %.11lf",xx,yy);//题目十分善良,不用做任何的小数处理
system("pause");
return 0;
}//不到30行的代码推了我半个小时