欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多边形面积{模板}

程序员文章站 2022-03-09 19:52:26
...

题目`ssl 1213``

Description

中学生杰利陶醉于数学研究.他思考的问题对于专家而言可能太多简单,但作为一个15岁的业余爱好者,他做得非常棒.他太热衷思考数学问题,以至于轻易就学会了试用数学方法来解决碰到的问题.一天,他看到桌上的一张纸.他四岁的妹妹玛利在上央画了一些线.那些线恰好构成了一个凹多边形,如下图:

"棒极了",他想,"这些多边形看起来是规则的.我曾经学过怎样计算三角形、矩形和圆形的面积。我一定能找到计算这些图形的方法。"他确实做到了。首先,他标记多边形顶点的坐标。如图二所示。随后,他毫不费力的求得结果0.75。

当然,他不会满足解决这样简单的问题。“嗯,如果纸上面是任意一个多边形,我们应该怎样计算它的面积呢?”他问自己。可他一直都没有找到计算多边形面积的通用方法。他清楚地明白以他的能力无法找到总是的答案。所以他向你请教。他会很感谢你的好心帮助。

反正就是多边形的面积


解题思路

这道题目跟[洛谷1183] 多边形的面积 {计算几何}的唯一区别仅仅是,需要判断一下不构成四边形的面积的情况:

  1. n<=2
  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); 
}
相关标签: 模板