HDOJ题目地址:传送门
3 0 0 1 0 0 1 4 1 0 0 1 -1 0 0 -1 0
0.5 2.0
计算几何,求多边形的面积
只要记住这个公式:
如果逆时针给出点坐标,值为正,
如果顺时针给出点坐标,值为负。
当i=n-1 i+1就是n所代表的点就是第一个点。
#include <iostream> #include <cstring> #include <cstdio> #include <math.h> using namespace std; struct Node{ int x,y; }c[105]; int main(){ int n,i; double result; while(scanf("%d",&n)&&n!=0){ for(i=0;i<n;i++){ cin>>c[i].x>>c[i].y; } c[n].x=c[0].x; c[n].y=c[0].y; result=0; for(i=0;i<n;i++) result+=0.5*(c[i].x*c[i+1].y-c[i].y*c[i+1].x); printf("%.1lf\n",result); } return 0; }
这种分解成三角形的方法要复杂一点,要判断多边形的凹凸,选择一个凹点作为基点,如图,
这个代码是没有判断凹凸的代码,所以是错的
#include <iostream> #include <cstring> #include <cstdio> #include <math.h> using namespace std; int x[101]; int y[101]; int main(){ int n,i; double k,b,result,d; while(scanf("%d",&n)&&n!=0){ result=0.0; //将所有点录入 for(i=1;i<=n;i++){ scanf("%d%d",&x[i],&y[i]); } for(i=2;i<n;i++){ k=(y[i+1]-y[i])/(x[i+1]-x[i]); b=y[i]-k*x[i]; d=k*x[1]-y[1]+b; if(d<0){ d=-d; } d=d/sqrt(k*k+1); result+=d*(sqrt((y[i+1]-y[i])*(y[i+1]-y[i])+(x[i+1]-x[i])*(x[i+1]-x[i])))/2; } printf("%.1lf\n",result); } return 0; }