题解:AT_abc197_d [ABC197D] Opposite

· · 题解

题解:AT_abc197_d [ABC197D] Opposite

看到一堆向量的题解,过来水一篇三角函数的。

1. 题目理解

题目给定一个正 N 边形(N 为偶数),并且给出了两个顶点的坐标: p_0 = (x_0, y_0) p_{\frac{N}{2}} = (x_{\frac{N}{2}}, y_{\frac{N}{2}}) 。要求我们求出下一个顶点 p_1 = (x_1, y_1) 的坐标。

2. 解题思路

N 边形的所有顶点均匀分布在以中心为圆心的圆上。因此,我们可以通过旋转的方式来求出其他顶点的坐标。给定一个点 (x, y) ,绕原点旋转角度 \theta 后的新坐标 (x', y') 可以通过以下公式计算:

x' = x \cos \theta - y \sin \theta y' = x \sin \theta + y \cos \theta

由于正 N 边形的中心是 p_0 p_{\frac{N}{2}} 的中点,我们可以先求出中心点的坐标:

\text{center}_x = \frac{x_0 + x_{\frac{N}{2}}}{2} \text{center}_y = \frac{y_0 + y_{\frac{N}{2}}}{2}

N 边形的每个顶点之间的旋转角度为 \theta = \frac{2\pi}{N} 。将 p_0 绕中心点旋转 \theta 角度,得到 p_1 的坐标,这道题就做完啦。

3. 代码实现

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    double x0, y0, xn2, yn2;
    cin >> n >> x0 >> y0 >> xn2 >> yn2;
    double cenx = (x0 + xn2) / 2.0;
    double ceny = (y0 + yn2) / 2.0;
    double theta = 2 * M_PI / n;
    double x = x0 - cenx;
    double y = y0 - ceny;
    double x1 = x * cos(theta) - y * sin(theta);
    double y1 = x * sin(theta) + y * cos(theta);
    x1 += cenx;
    y1 += ceny;
    cout << fixed << setprecision(11) << x1 << " " << y1 << "\n";
    return 0;
}

直接 O(1) 水掉哦~