#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const double eps=1e-8;
double h,ans,cake;
 struct point {
double x,y;
 point () {}
 point (double x,double y):x(x),y(y) {}
 void get() {scanf("%lf%lf",&x,&y);}
};
 struct poly {
point p[21];
int n;
 void get() {for(int i=0;i<n;i++)p[i].get();p[n]=p[0];}
}sg;
 int dcmp(double x) {
return (x>eps)-(x<-eps);
}
 double cross(point o,point p,point q) {
return (p.x-o.x)*(q.y-o.y)-(p.y-o.y)*(q.x-o.x);
}
 point lineinter(point a,point b,point c,point d) {
double u=cross(a,b,c),v=cross(b,a,d);
return point((c.x*v+d.x*u)/(u+v),(c.y*v+d.y*u)/(u+v));
}
 double dis(point a,point b) {
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
 void push(point a,point b,point &c,point &d) {
double x=a.y-b.y,y=b.x-a.x,t=h/dis(a,b);
c=point(a.x+x*t,a.y+y*t);
d=point(b.x+x*t,b.y+y*t);
}
 void cut(point a,point b,poly tg,poly &g) {
push(a,b,a,b);
g.n=0;
 for(int i=0;i<tg.n;i++) {
int u=dcmp(cross(a,b,tg.p[i])),v=dcmp(cross(a,b,tg.p[i+1]));
if(u>=0)g.p[g.n++]=tg.p[i];
if(u*v<0) g.p[g.n++]=lineinter(a,b,tg.p[i],tg.p[i+1]);
}
g.p[g.n]=g.p[0];
}
 double area(poly g) {
double sum=0;
for(int i=2;i<g.n;i++)
sum+=cross(g.p[0],g.p[i-1],g.p[i]);
return 0.5*sum;
}
 void dfs(int i,int step,poly g) {
if(step+i<sg.n)dfs(i+1,step,g);
cut(sg.p[i],sg.p[i+1],g,g);
if(step==1)ans=max(ans,cake-area(g));
else dfs(i+1,step-1,g);
}
 int main() {
int k;
 while(scanf("%d%d%lf",&sg.n,&k,&h),sg.n||k||h) {
sg.get();
cake=area(sg);
ans=0;
k=min(k,sg.n);
if(k&&h)dfs(0,k,sg);
printf("%.2lf\n",ans);
}
return 0;
}
|