10065

Can read about orientation here

Idea comes from the slope comparison.

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath>

using namespace std;

struct point{
	double x,y;
};
vector<point>pp;
double area(int n,vector<point> arr)
{
	double ans = 0.0;
	for(int i=0;i<n;i++)
	{
		ans += (arr[i].x*arr[(i+1)%n].y - arr[i].y*arr[(i+1)%n].x);
	}
	return fabs(ans/2.0);
}
int checkCross(point p, point q, point r)
{
    int val = (q.y - p.y) * (r.x - q.x) -
              (q.x - p.x) * (r.y - q.y);

    if (val == 0) return 0;  // colinear
    return (val > 0)? 1: 2; // clock or counterclock wise
}

int convexCalc(int n,vector<point> arr)
{
	point tmp;
	pp.clear();
	int leftMost=0;
	for(int i=1;i<n;i++)
	{
		if(arr[i].x<arr[leftMost].x)
		leftMost=i;
	}
	int left=leftMost,j;
	do
	{
		pp.push_back(arr[left]);
		j = (left+1)%n;
		for(int i=0;i<n;i++)
		{
			if( checkCross(arr[left],arr[i],arr[j])==2 )
			j=i;
		}
		left=j;
	}while(leftMost!=left);
	return pp.size();
}

bool cmp(point a,point b)
{
	if(a.x!=b.x)
	return a.x<b.x;
	return a.y<b.y;
}
int main()
{
	int n,kase=1;
	vector<point>arr;
	point tmp;
	double ans,ans2;
	while(scanf("%d",&n),n)
	{
		arr.clear();
		for(int i=0;i<n;i++)
		{
			scanf("%lf%lf",&tmp.x,&tmp.y);
			arr.push_back(tmp);
		}
		ans = area(n,arr);
		int cnt = convexCalc(n,arr);
		ans2 = area(cnt,pp);
		printf("Tile #%d\n",kase++);
		ans = ((ans2-ans)/ans2)*100;
		printf("Wasted Space = %.2lf %%\n\n",ans);
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *