专栏文章

题解:AT_abc197_d [ABC197D] Opposite

AT_abc197_d题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipv2wy4
此快照首次捕获于
2025/12/03 18:25
3 个月前
此快照最后确认于
2025/12/03 18:25
3 个月前
查看原文

题解:AT_abc197_d [ABC197D] Opposite

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

1. 题目理解

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

2. 解题思路

NN 边形的所有顶点均匀分布在以中心为圆心的圆上。因此,我们可以通过旋转的方式来求出其他顶点的坐标。给定一个点 (x,y)(x, y),绕原点旋转角度 θ\theta 后的新坐标 (x,y)(x', y') 可以通过以下公式计算:
x=xcosθysinθx' = x \cos \theta - y \sin \theta y=xsinθ+ycosθy' = x \sin \theta + y \cos \theta
由于正 NN 边形的中心是 p0p_0pN2p_{\frac{N}{2}} 的中点,我们可以先求出中心点的坐标:
centerx=x0+xN22\text{center}_x = \frac{x_0 + x_{\frac{N}{2}}}{2} centery=y0+yN22\text{center}_y = \frac{y_0 + y_{\frac{N}{2}}}{2}
NN 边形的每个顶点之间的旋转角度为 θ=2πN\theta = \frac{2\pi}{N}。将 p0p_0 绕中心点旋转 θ\theta 角度,得到 p1p_1 的坐标,这道题就做完啦。

3. 代码实现

CPP
#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)O(1) 水掉哦~

评论

0 条评论,欢迎与作者交流。

正在加载评论...