给定两点以及n,求出含这两点的正n边形的最小面积
反过来想,我们保证这条对角线是正n边形内的最长对角线即可
我的做法是分奇偶考虑,利用公式S = n×r×a/2
其中n为边数,r为边心距,a为边长
对应的是n个小三角形的面积
反正就是各种sin cos变形就好了
因为自己傻逼了。。。又跪了几发。。。
代码如下:
/* ***********************************************
Author : yinwoods
E-Mail : yinwoods@163.com
Created Time : 2014年12月12日 星期五 21时50分20秒
File Name : uva12300.cpp
************************************************ */
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
#define eps 1e-6
#define PI 3.1415926535898
using namespace std;
struct Point {
double x, y;
Point() {}
Point(double x_, double y_) {
x = x_;
y = y_;
}
};
bool equ(double x) {
return (x<eps&&(x>-eps));
}
double dist(Point p1, Point p2) {
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int main() {
Point p1, p2;
int n;
double len, ang, r, a, s;
while(scanf("%lf%lf%lf%lf%d", &p1.x, &p1.y, &p2.x, &p2.y, &n) != EOF) {
if(equ(p1.x) && equ(p1.y) && equ(p2.x) && equ(p2.y) && n==0)
break;
len = dist(p1, p2);
//printf("%lf\n", len);
if(n % 2 == 0) {
ang = (n-2.0)/(2.*n)*PI;
r = len/2.0*sin(ang);
a = len*cos(ang);
s = n*a*r/2.0;
//printf("r = %lf\ta = %lf\n", r, a);
} else {
ang = PI/(2.0*n);
r = len/(cos(ang)*2.0)*cos(2.0*ang);
a = 2.0*len*sin(ang);
s = n*a*r/2.0;
//printf("r = %lf\ta = %lf\n", r, a);
}
printf("%.6lf\n", s);
}
return 0;
}