#include <algorithm>
#include <cstdio>
#include <cmath>
#include <stack>
#include <vector>
using namespace std;
#define EPS 1e-9
#define PI acos(-1.0)
double DEG_to_RAD(double d) {
return d * PI / 180.0;
}
double RAD_to_DEG(double r) {
return r * 180.0 / PI;
}
struct point {
double x, y; // we use double for most examples in this source code
point() {
}
;
point(double _x, double _y) {
x = _x, y = _y;
}
bool operator <(point p) const { // declare as const otherwise won't compile
if (fabs(x - p.x) > EPS)
return x < p.x;
return y < p.y;
}
bool operator ==(point p) const {
return fabs(x - p.x) < EPS && fabs(x - p.y) < EPS;
}
};
struct vec {
double x, y; // similar to point
vec(double _x, double _y) {
x = _x, y = _y;
}
};
vec toVector(point p1, point p2) { // convert 2 points to vector
return vec(p2.x - p1.x, p2.y - p1.y);
}
double dist(point p1, point p2) { // get Euclidean distance of two points
return hypot(p1.x - p2.x, p1.y - p2.y);
} // as shown earlier
// returns the area, which is half the determinant
// works for both convex and concave polygons
double area(const vector<point> &P) {
double result = 0.0, x1, y1, x2, y2;
for (int i = 0; i < (int) P.size() - 1; i++) {
x1 = P[i].x;
x2 = P[i + 1].x;
y1 = P[i].y;
y2 = P[i + 1].y;
result += (x1 * y2 - x2 * y1);
}
return fabs(result) / 2.0;
}
double dot(vec a, vec b) {
return (a.x * b.x + a.y * b.y);
}
double norm_sq(vec v) {
return v.x * v.x + v.y * v.y;
}
double angle(point a, point o, point b) { // returns angle aob in rad
vec oa = toVector(o, a), ob = toVector(o, b);
return acos(dot(oa, ob) / sqrt(norm_sq(oa) * norm_sq(ob)));
}
double cross(vec a, vec b) {
return a.x * b.y - a.y * b.x;
}
// note: to accept collinear points, we have to change the `> 0'
// returns true if point r is on the left side of line pq
bool ccw(point p, point q, point r) {
return cross(toVector(p, q), toVector(p, r)) > 0;
}
// returns true if point r is on the same line as the line pq
bool collinear(point p, point q, point r) {
return fabs(cross(toVector(p, q), toVector(p, r))) < EPS;
}
// returns true if point p is in either convex/concave polygon P
bool inPolygon(point p, const vector<point> &P) {
if ((int) P.size() == 0)
return false;
double sum = 0; // assume first vertex = last vertex
for (int i = 0; i < (int) P.size() - 1; i++) {
if (ccw(p, P[i], P[i + 1]))
sum += angle(P[i], p, P[i + 1]); // left turn/ccw
else
sum -= angle(P[i], p, P[i + 1]);
} // right turn/cw
return fabs(fabs(sum) - 2 * PI) < EPS;
}
// line segment p-q intersect with line A-B.
point lineIntersectSeg(point p, point q, point A, point B) {
double a = B.y - A.y;
double b = A.x - B.x;
double c = B.x * A.y - A.x * B.y;
double u = fabs(a * p.x + b * p.y + c);
double v = fabs(a * q.x + b * q.y + c);
return point((p.x * v + q.x * u) / (u + v), (p.y * v + q.y * u) / (u + v));
}
// cuts polygon Q along the line formed by point a -> point b
// (note: the last point must be the same as the first point)
vector<point> cutPolygon(point a, point b, const vector<point> &Q) {
vector<point> P;
for (int i = 0; i < (int) Q.size(); i++) {
double left1 = cross(toVector(a, b), toVector(a, Q[i])), left2 = 0;
if (i != (int) Q.size() - 1)
left2 = cross(toVector(a, b), toVector(a, Q[i + 1]));
if (left1 > -EPS)
P.push_back(Q[i]); // Q[i] is on the left of ab
if (left1 * left2 < -EPS) // edge (Q[i], Q[i+1]) crosses line ab
P.push_back(lineIntersectSeg(Q[i], Q[i + 1], a, b));
}
if (!P.empty()
&& (fabs(P.back().x - P.front().x) > EPS
|| fabs(P.back().y - P.front().y) > EPS))
P.push_back(P.front()); // make P's first point = P's last point
return P;
}
int main() {
int N, W, H, x, y, count = 1;
vector<point> P;
while (scanf("%d %d %d %d %d", &N, &W, &H, &x, &y) != EOF) {
P.clear();
P.push_back(point(0, 0));
P.push_back(point(W, 0));
P.push_back(point(W, H));
P.push_back(point(0, H));
P.push_back(point(0, 0));
point fountain(x, y);
point p1, p2;
for (int i = 0; i < N; i++) {
scanf("%lf %lf %lf %lf", &p1.x, &p1.y, &p2.x, &p2.y);
if (ccw(p1, p2, fountain))
P = cutPolygon(p1, p2, P);
else
P = cutPolygon(p2, p1, P);
}
printf("Case #%d: %.3lf\n", count++, area(P));
}
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEVQUyAxZS05CiNkZWZpbmUgUEkgYWNvcygtMS4wKQoKZG91YmxlIERFR190b19SQUQoZG91YmxlIGQpIHsKCXJldHVybiBkICogUEkgLyAxODAuMDsKfQoKZG91YmxlIFJBRF90b19ERUcoZG91YmxlIHIpIHsKCXJldHVybiByICogMTgwLjAgLyBQSTsKfQoKc3RydWN0IHBvaW50IHsKCWRvdWJsZSB4LCB5OyAvLyB3ZSB1c2UgZG91YmxlIGZvciBtb3N0IGV4YW1wbGVzIGluIHRoaXMgc291cmNlIGNvZGUKCXBvaW50KCkgewoJfQoJOwoJcG9pbnQoZG91YmxlIF94LCBkb3VibGUgX3kpIHsKCQl4ID0gX3gsIHkgPSBfeTsKCX0KCWJvb2wgb3BlcmF0b3IgPChwb2ludCBwKSBjb25zdCB7IC8vIGRlY2xhcmUgYXMgY29uc3Qgb3RoZXJ3aXNlIHdvbid0IGNvbXBpbGUKCQlpZiAoZmFicyh4IC0gcC54KSA+IEVQUykKCQkJcmV0dXJuIHggPCBwLng7CgkJcmV0dXJuIHkgPCBwLnk7Cgl9Cglib29sIG9wZXJhdG9yID09KHBvaW50IHApIGNvbnN0IHsKCQlyZXR1cm4gZmFicyh4IC0gcC54KSA8IEVQUyAmJiBmYWJzKHggLSBwLnkpIDwgRVBTOwoJfQp9OwoKc3RydWN0IHZlYyB7Cglkb3VibGUgeCwgeTsgLy8gc2ltaWxhciB0byBwb2ludAoJdmVjKGRvdWJsZSBfeCwgZG91YmxlIF95KSB7CgkJeCA9IF94LCB5ID0gX3k7Cgl9Cn07Cgp2ZWMgdG9WZWN0b3IocG9pbnQgcDEsIHBvaW50IHAyKSB7IC8vIGNvbnZlcnQgMiBwb2ludHMgdG8gdmVjdG9yCglyZXR1cm4gdmVjKHAyLnggLSBwMS54LCBwMi55IC0gcDEueSk7Cn0KCmRvdWJsZSBkaXN0KHBvaW50IHAxLCBwb2ludCBwMikgeyAvLyBnZXQgRXVjbGlkZWFuIGRpc3RhbmNlIG9mIHR3byBwb2ludHMKCXJldHVybiBoeXBvdChwMS54IC0gcDIueCwgcDEueSAtIHAyLnkpOwp9IC8vIGFzIHNob3duIGVhcmxpZXIKCi8vIHJldHVybnMgdGhlIGFyZWEsIHdoaWNoIGlzIGhhbGYgdGhlIGRldGVybWluYW50Ci8vIHdvcmtzIGZvciBib3RoIGNvbnZleCBhbmQgY29uY2F2ZSBwb2x5Z29ucwpkb3VibGUgYXJlYShjb25zdCB2ZWN0b3I8cG9pbnQ+ICZQKSB7Cglkb3VibGUgcmVzdWx0ID0gMC4wLCB4MSwgeTEsIHgyLCB5MjsKCWZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgUC5zaXplKCkgLSAxOyBpKyspIHsKCQl4MSA9IFBbaV0ueDsKCQl4MiA9IFBbaSArIDFdLng7CgkJeTEgPSBQW2ldLnk7CgkJeTIgPSBQW2kgKyAxXS55OwoJCXJlc3VsdCArPSAoeDEgKiB5MiAtIHgyICogeTEpOwoJfQoJcmV0dXJuIGZhYnMocmVzdWx0KSAvIDIuMDsKfQoKZG91YmxlIGRvdCh2ZWMgYSwgdmVjIGIpIHsKCXJldHVybiAoYS54ICogYi54ICsgYS55ICogYi55KTsKfQoKZG91YmxlIG5vcm1fc3EodmVjIHYpIHsKCXJldHVybiB2LnggKiB2LnggKyB2LnkgKiB2Lnk7Cn0KCmRvdWJsZSBhbmdsZShwb2ludCBhLCBwb2ludCBvLCBwb2ludCBiKSB7IC8vIHJldHVybnMgYW5nbGUgYW9iIGluIHJhZAoJdmVjIG9hID0gdG9WZWN0b3IobywgYSksIG9iID0gdG9WZWN0b3IobywgYik7CglyZXR1cm4gYWNvcyhkb3Qob2EsIG9iKSAvIHNxcnQobm9ybV9zcShvYSkgKiBub3JtX3NxKG9iKSkpOwp9Cgpkb3VibGUgY3Jvc3ModmVjIGEsIHZlYyBiKSB7CglyZXR1cm4gYS54ICogYi55IC0gYS55ICogYi54Owp9CgovLyBub3RlOiB0byBhY2NlcHQgY29sbGluZWFyIHBvaW50cywgd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIGA+IDAnCi8vIHJldHVybnMgdHJ1ZSBpZiBwb2ludCByIGlzIG9uIHRoZSBsZWZ0IHNpZGUgb2YgbGluZSBwcQpib29sIGNjdyhwb2ludCBwLCBwb2ludCBxLCBwb2ludCByKSB7CglyZXR1cm4gY3Jvc3ModG9WZWN0b3IocCwgcSksIHRvVmVjdG9yKHAsIHIpKSA+IDA7Cn0KCi8vIHJldHVybnMgdHJ1ZSBpZiBwb2ludCByIGlzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGxpbmUgcHEKYm9vbCBjb2xsaW5lYXIocG9pbnQgcCwgcG9pbnQgcSwgcG9pbnQgcikgewoJcmV0dXJuIGZhYnMoY3Jvc3ModG9WZWN0b3IocCwgcSksIHRvVmVjdG9yKHAsIHIpKSkgPCBFUFM7Cn0KCi8vIHJldHVybnMgdHJ1ZSBpZiBwb2ludCBwIGlzIGluIGVpdGhlciBjb252ZXgvY29uY2F2ZSBwb2x5Z29uIFAKYm9vbCBpblBvbHlnb24ocG9pbnQgcCwgY29uc3QgdmVjdG9yPHBvaW50PiAmUCkgewoJaWYgKChpbnQpIFAuc2l6ZSgpID09IDApCgkJcmV0dXJuIGZhbHNlOwoJZG91YmxlIHN1bSA9IDA7IC8vIGFzc3VtZSBmaXJzdCB2ZXJ0ZXggPSBsYXN0IHZlcnRleAoJZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KSBQLnNpemUoKSAtIDE7IGkrKykgewoJCWlmIChjY3cocCwgUFtpXSwgUFtpICsgMV0pKQoJCQlzdW0gKz0gYW5nbGUoUFtpXSwgcCwgUFtpICsgMV0pOyAgIC8vIGxlZnQgdHVybi9jY3cKCQllbHNlCgkJCXN1bSAtPSBhbmdsZShQW2ldLCBwLCBQW2kgKyAxXSk7Cgl9IC8vIHJpZ2h0IHR1cm4vY3cKCXJldHVybiBmYWJzKGZhYnMoc3VtKSAtIDIgKiBQSSkgPCBFUFM7Cn0KCi8vIGxpbmUgc2VnbWVudCBwLXEgaW50ZXJzZWN0IHdpdGggbGluZSBBLUIuCnBvaW50IGxpbmVJbnRlcnNlY3RTZWcocG9pbnQgcCwgcG9pbnQgcSwgcG9pbnQgQSwgcG9pbnQgQikgewoJZG91YmxlIGEgPSBCLnkgLSBBLnk7Cglkb3VibGUgYiA9IEEueCAtIEIueDsKCWRvdWJsZSBjID0gQi54ICogQS55IC0gQS54ICogQi55OwoJZG91YmxlIHUgPSBmYWJzKGEgKiBwLnggKyBiICogcC55ICsgYyk7Cglkb3VibGUgdiA9IGZhYnMoYSAqIHEueCArIGIgKiBxLnkgKyBjKTsKCXJldHVybiBwb2ludCgocC54ICogdiArIHEueCAqIHUpIC8gKHUgKyB2KSwgKHAueSAqIHYgKyBxLnkgKiB1KSAvICh1ICsgdikpOwp9CgovLyBjdXRzIHBvbHlnb24gUSBhbG9uZyB0aGUgbGluZSBmb3JtZWQgYnkgcG9pbnQgYSAtPiBwb2ludCBiCi8vIChub3RlOiB0aGUgbGFzdCBwb2ludCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBwb2ludCkKdmVjdG9yPHBvaW50PiBjdXRQb2x5Z29uKHBvaW50IGEsIHBvaW50IGIsIGNvbnN0IHZlY3Rvcjxwb2ludD4gJlEpIHsKCXZlY3Rvcjxwb2ludD4gUDsKCWZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgUS5zaXplKCk7IGkrKykgewoJCWRvdWJsZSBsZWZ0MSA9IGNyb3NzKHRvVmVjdG9yKGEsIGIpLCB0b1ZlY3RvcihhLCBRW2ldKSksIGxlZnQyID0gMDsKCQlpZiAoaSAhPSAoaW50KSBRLnNpemUoKSAtIDEpCgkJCWxlZnQyID0gY3Jvc3ModG9WZWN0b3IoYSwgYiksIHRvVmVjdG9yKGEsIFFbaSArIDFdKSk7CgkJaWYgKGxlZnQxID4gLUVQUykKCQkJUC5wdXNoX2JhY2soUVtpXSk7IC8vIFFbaV0gaXMgb24gdGhlIGxlZnQgb2YgYWIKCQlpZiAobGVmdDEgKiBsZWZ0MiA8IC1FUFMpIC8vIGVkZ2UgKFFbaV0sIFFbaSsxXSkgY3Jvc3NlcyBsaW5lIGFiCgkJCVAucHVzaF9iYWNrKGxpbmVJbnRlcnNlY3RTZWcoUVtpXSwgUVtpICsgMV0sIGEsIGIpKTsKCX0KCWlmICghUC5lbXB0eSgpCgkJCSYmIChmYWJzKFAuYmFjaygpLnggLSBQLmZyb250KCkueCkgPiBFUFMKCQkJCQl8fCBmYWJzKFAuYmFjaygpLnkgLSBQLmZyb250KCkueSkgPiBFUFMpKQoJCVAucHVzaF9iYWNrKFAuZnJvbnQoKSk7IC8vIG1ha2UgUCdzIGZpcnN0IHBvaW50ID0gUCdzIGxhc3QgcG9pbnQKCXJldHVybiBQOwp9CgppbnQgbWFpbigpIHsKCWludCBOLCBXLCBILCB4LCB5LCBjb3VudCA9IDE7Cgl2ZWN0b3I8cG9pbnQ+IFA7CgoJd2hpbGUgKHNjYW5mKCIlZCAlZCAlZCAlZCAlZCIsICZOLCAmVywgJkgsICZ4LCAmeSkgIT0gRU9GKSB7CgkJUC5jbGVhcigpOwoJCVAucHVzaF9iYWNrKHBvaW50KDAsIDApKTsKCQlQLnB1c2hfYmFjayhwb2ludChXLCAwKSk7CgkJUC5wdXNoX2JhY2socG9pbnQoVywgSCkpOwoJCVAucHVzaF9iYWNrKHBvaW50KDAsIEgpKTsKCQlQLnB1c2hfYmFjayhwb2ludCgwLCAwKSk7CgkJcG9pbnQgZm91bnRhaW4oeCwgeSk7CgoJCXBvaW50IHAxLCBwMjsKCQlmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewoJCQlzY2FuZigiJWxmICVsZiAlbGYgJWxmIiwgJnAxLngsICZwMS55LCAmcDIueCwgJnAyLnkpOwoJCQlpZiAoY2N3KHAxLCBwMiwgZm91bnRhaW4pKQoJCQkJUCA9IGN1dFBvbHlnb24ocDEsIHAyLCBQKTsKCQkJZWxzZQoJCQkJUCA9IGN1dFBvbHlnb24ocDIsIHAxLCBQKTsKCQl9CgoJCXByaW50ZigiQ2FzZSAjJWQ6ICUuM2xmXG4iLCBjb3VudCsrLCBhcmVhKFApKTsKCX0KCXJldHVybiAwOwp9