hdu3036改革春风吹满地(求多边形面积)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2036
开始的算法是,分割,但是wa了,因为凹多边形没办法简单分割:例如下图:
现附上求凸多边形面积的代码(海伦公式):
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; struct point{ int x,y; }a[105]; double dis(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double area(double a,double b,double c) { double p = (a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } int main() { int n; double d[105],b[105]; while(cin>>n) { double Area=0; if(n==0) break; for(int i = 1;i<=n;i++) { cin>>a[i].x>>a[i].y; } for(int i = 2;i<=n;i++) { d[i]=dis(a[1],a[i]);//第一个点到第n个点的距离 } for(int i = 2;i<n;i++) { b[i]=dis(a[i],a[i+1]);//各底边距离 } for(int i = 2;i < n;i++) { Area+=area(b[i],d[i],d[i+1]); } printf("%.1lf\n",Area); } return 0; }
利用叉积求三角形面积:不限制凹凸:
所以三角形ABC面积:
AC代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; int main() { int n; while(cin>>n) { if(n==0) break; int x1,y1,x2,y2,x3,y3; cin>>x1>>y1>>x2>>y2; double s=0; for(int i=3;i<=n;i++) { cin>>x3>>y3; s+=(x1-x2)*(y1-y3)-(y1-y2)*(x1-x3); x2=x3; y2=y3; } printf("%.1lf\n",s/2); } return 0; }
但是还是想不懂为什么凹多边形可以这么算,第一个定点坐标一直没有变,如下图:
我不明白的一点是,三角形ACD面积怎么算的……,两条边中间是空的呀??
有大佬经过的话请指教一下,感谢。