題目給出兩個圓和乙個多邊形
問是否能讓兩個圓在多邊形內。
並且覆蓋的面積最大
圓的半徑為r,我們則讓多邊形的每條邊都往內部退r距離。
然後求半平面交得出的點集中,最遠的兩個點則是兩圓的圓心即可
#include #include #include #include #include #include #include #include #include #include #include #define maxn 111111
#define maxm 211111
#define pi acos(-1.0)
#define eps 1e-8
#define inf 1000000001
using namespace std;
int dblcmp(double d)
struct point
point(double _x, double _y):
x(_x), y(_y){};
void input()
double dot(point p)
double distance(point p)
point sub(point p)
double det(point p)
bool operator == (point a)const
bool operator < (point a)const
}p[maxn];
struct line
line(point _a,point _b)
bool parallel(line v)
point crosspoint(line v)
bool operator == (line v)const
};struct halfplane:public line
//表示向量 a->b逆時針(左側)的半平面
halfplane(point _a, point _b)
halfplane(line v)
void calcangle()
bool operator <(const halfplane &b)const };
struct polygon
}void getarea()
area = fabs(area) / 2;
}}convex;
struct halfplanes
void unique()
n = m;
} bool halfplaneinsert()
while (st < ed && dblcmp(hp[que[st]].b.sub(hp[que[st]].a).det(p[ed].sub(hp[que[st]].a))) < 0) ed--;
while (st < ed && dblcmp(hp[que[ed]].b.sub(hp[que[ed]].a).det(p[st + 1].sub(hp[que[ed]].a))) < 0) st++;
if (st + 1 >= ed)return false;
return true;
} void getconvex(polygon &con) }
}h;int t;
int n;
line getmove(point a, point b, double mid)
double r;
int main()
h.halfplaneinsert();
h.getconvex(convex);
int id1 = 0, id2 = 0;
double mx = 0;
for(int i = 0; i < convex.n; i++)
for(int j = i + 1; j < convex.n; j++)
printf("%f %f %f %f\n", convex.p[id1].x, convex.p[id1].y, convex.p[id2].x, convex.p[id2].y);
}return 0;
}
半平面交 POJ 3384 Feng Shui
先把每條邊壓縮r的距離,求出半平面交,然後半平面交的最遠點對就是答案了。要注意最後的點數只有乙個時的情況,此時兩個圓重合。但是半平面交求出的平面是不含直線上的點,所以這時半平面交求出的點集為空。我的處理方法是壓縮每一條邊的時候少壓縮一點距離,這樣子求出的點不會是空集,注意把握好精度就可以了。incl...
POJ 3384 Feng Shui 半平面交
by cxlove 題目 給出乙個凸多邊形的房間,根據風水要求,把兩個圓形地毯鋪在房間裡,不能摺疊,不能切割,可以重疊。問最多能覆蓋多大空間,輸出兩個地毯的圓心座標。多組解輸出其中乙個 題目保證至少可以放入乙個圓,上一題中判斷過在乙個多邊形內是否能放入乙個半徑為r的圓。同樣將多邊形的邊內移r之後,半...
POJ 3384 Feng Shui 半平面交
風水。是一門藝術。我在想要不要看看 周易 葬經 什麼的,等老了還能出去給人算算命,看看陰宅陽宅什麼的,混口飯吃。嘿嘿,扯遠了。題意 給乙個凸多邊形,然後在裡面放兩個半徑為r的圓。問怎麼放能使覆蓋的面積最大 spj 思路 把多邊形的每一條邊向 內 移r的距離,交得乙個新多邊形。在多邊形上找兩個盡量圓的...