多边形面积{模板}
程序员文章站
2022-03-09 19:52:26
...
题目`ssl 1213``
Description
中学生杰利陶醉于数学研究.他思考的问题对于专家而言可能太多简单,但作为一个15岁的业余爱好者,他做得非常棒.他太热衷思考数学问题,以至于轻易就学会了试用数学方法来解决碰到的问题.一天,他看到桌上的一张纸.他四岁的妹妹玛利在上央画了一些线.那些线恰好构成了一个凹多边形,如下图:
"棒极了",他想,"这些多边形看起来是规则的.我曾经学过怎样计算三角形、矩形和圆形的面积。我一定能找到计算这些图形的方法。"他确实做到了。首先,他标记多边形顶点的坐标。如图二所示。随后,他毫不费力的求得结果0.75。
当然,他不会满足解决这样简单的问题。“嗯,如果纸上面是任意一个多边形,我们应该怎样计算它的面积呢?”他问自己。可他一直都没有找到计算多边形面积的通用方法。他清楚地明白以他的能力无法找到总是的答案。所以他向你请教。他会很感谢你的好心帮助。
反正就是多边形的面积
解题思路
这道题目跟[洛谷1183] 多边形的面积 {计算几何}的唯一区别仅仅是,需要判断一下不构成四边形的面积的情况:
- n<=2
- 两条不相邻的边是否相交
代码
#include<cstdio>
#define rep(i,x,y) for (register int i=x;i<=y;++i)
#define db double
using namespace std;
int n; db ans,x[1010],y[1010];
inline db Cproduct(db a1,db b1,db a2,db b2,db xx,db yy){
return (a1-xx)*(b2-yy)-(b1-yy)*(a2-xx);
}
inline db banana(db a1,db a2,db b1,db b2,db c1,db c2,db d1,db d2){
return (Cproduct(b1,b2,c1,c2,a1,a2)*Cproduct(b1,b2,d1,d2,a1,a2)<0&&Cproduct(d1,d2,b1,b2,c1,c2)*Cproduct(d1,d2,a1,a2,c1,c2)<0);
}
int main()
{
scanf("%d",&n); if (n<=2) return 0&printf("Impossible");
rep(i,1,n) scanf("%lf%lf",&x[i],&y[i]);
rep(i,2,n) rep(j,1,n-1)
if ((i!=j)&&(i!=j+1)&&banana(x[i-1],y[i-1],x[i],y[i],x[j],y[j],x[j+1],y[j+1])) return 0&printf("Impossible");
rep(i,3,n) ans+=Cproduct(x[i],y[i],x[i-1],y[i-1],x[1],y[1])*0.5;
return 0&printf("%.2lf",ans>=0?ans:-ans);
}
上一篇: 优质输出,才是内容电商的第一生产力
下一篇: 如何杀掉运行中的病毒