AtCoder Beginner Contest 197 D - Opposite
1.题目
题目描述:
一个正n边形,给定正n边形的两个顶点(x0,y0),(xn/2,yn/2),求出(x1,y1)坐标
2.思路
刚拿到这题毫无头绪,想了好久也没想出来。在一个大佬的博客上发现了一个公式(绕点公式)。
有了这个公式,这题就很简单了。怎么说呢,就相当于我可以把(x1,y1)看作是由(x0,y0)绕中心选择过来的。
那旋转角度怎么求呢?因为是正n边形,所以它的外接圆圆心与正n边形中心重合,正好n条边也可以把圆分成n份,每一份圆心角则为2Π/n。而从(x0,y0)到(x1,y1)只占了一份,则旋转角为2Π/n。
旋转中心则是给出的两个点的中点。有了旋转角,(x0,y0)和旋转点,那(x1,y1)可直接套公式则可求出。
3.参考代码
#include<bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
double xx0, yy0, xx1, yy1, xx2, yy2;
int n;
void solve()
{
double jiao = 2 * PI / n;
double sinn, coss;
sinn = sin(jiao);
coss = cos(jiao);
double xx = (xx0 + xx1) / 2;
double yy = (yy0 + yy1) / 2;
xx2 = (xx0 - xx) * coss - (yy0 - yy) * sinn + xx;
yy2 = (xx0 - xx) * sinn + (yy0 - yy) * coss + yy;
printf("%.11lf %.11lf\n", xx2, yy2);
}
int main()
{
scanf("%d", &n);
scanf("%lf%lf%lf%lf", &xx0, &yy0, &xx1, &yy1);
solve();
}