正N边形题解

题目描述

在一个平面坐标系中,有 N N N个点,它们构成了一个正N边形,按逆时针顺序,分别为 p 0 , p 1 . . . , p n − 1 p_0,p_1...,p_{n-1} p0,p1...,pn1。保证 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} 105以内,则认为正确。

题解

这一题很容易想到和三角函数有关,首先我们要把整个正多边形的内心(即题目给出两点的中点)放在原点上,我们可以作多边形外接圆得出 ( 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行的代码推了我半个小时
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值