Pagini recente » Cod sursa (job #500324) | Cod sursa (job #1074381) | Cod sursa (job #2978450) | Cod sursa (job #230225) | Cod sursa (job #1559011)
#include<cstdio>
#include<algorithm>
#include<cmath>
#define eps 1.e-10
using namespace std;
struct sp
{
double x,y;
} ve[100005];
double ccw(sp a,sp b,sp c)
{
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool cmp(sp b,sp c)
{
if(ccw(ve[1],b,c)>=eps)
return 1;
return 0;
}
double dist(sp p1,sp p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double arie(sp p1,sp p2,sp p3)
{
double a,b,c,p;
a=dist(p1,p2);
b=dist(p2,p3);
c=dist(p1,p3);
p=(a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
int main()
{
freopen("aria.in","r",stdin);
freopen("aria.out","w",stdout);
int n,i,j;
double sum=0,xp=0,yp=0;
sp o;
o.x=0;
o.y=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf%lf",&ve[i].x,&ve[i].y);
/* j=1;
for(i=1;i<=n;i++)
if(ve[i].x<ve[j].x || (ve[i].x==ve[j].x && ve[i].y<ve[j].y))
j=i;
swap(ve[1],ve[j]);
sort(ve+2,ve+n+1,cmp);*/
n++;
ve[n]=ve[1];
for(i=1;i<n;i++)
{
if(ccw(ve[i],ve[i+1],o)>=eps)
sum=sum+arie(ve[i],ve[i+1],o);
else
sum=sum-arie(ve[i],ve[i+1],o);
}
if(sum<=-eps)
sum=sum*-1;
printf("%.5lf\n",sum);
return 0;
}