AtCoder Beginner Contest 197 D - Opposite

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值