鏈結
將邊長向內推進r,明顯這樣把第乙個圓的圓心放在新的邊長是肯定是最優的,與原本邊相切,然後再找新多邊上的最遠的兩點即為兩圓心。
1 #include 2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #includeview code10using
namespace
std;
11#define n 2010
12#define ll long long
13#define inf 0xfffffff
14const
double eps = 1e-8;15
const
double pi = acos(-1.0
);16
const
double inf = ~0u>>2;17
const
int maxn=1550;18
intm;
19double
r;20
int ccnt,curcnt;//
此時ccnt為最終切割得到的多邊形的頂點數、暫存頂點個數
21struct
point
2225
};26
typedef point pointt;
27 pointt operator -(point a,point b)
2831 point points[maxn],p[maxn],q[maxn];//
讀入的多邊形的頂點(順時針)、p為存放最終切割得到的多邊形頂點的陣列、暫存核的頂點
32void getline(point x,point y,double &a,double &b,double &c) //
兩點x、y確定一條直線a、b、c為其係數
3338
void
initial()
3945 point intersect(point x,point y,double a,double b,double c) //
求x、y形成的直線與已知直線a、b、c、的交點
4654
void cut(double a,double b ,double
c)55
68if(a*p[i+1].x + b*p[i+1].y + c > 0) //
原理同上
6972}73
}74for(int i = 1; i <= curcnt; ++i)p[i] = q[i];//
將q中暫存的核的頂點轉移到p中
75 p[curcnt+1] = q[1
];76 p[0] =p[curcnt];
77 ccnt =curcnt;78}
79double
dis(point a)
8083
void solve(int
r)84
103double ans = -1
;104
point p1, p2;
105int
i,j;
106for(i = 1; i <= curcnt ; i++)
107for(j = i ; j<=curcnt ; j++)
108115
}116 printf("
%.4f %.4f %.4f %.4f\n
",p1.x,p1.y,p2.x,p2.y);
117}
118/*
void guizhenghua()
*/123
intmain()
124133
return0;
134 }
POJ 3384 Feng Shui 半平面交
題目給出兩個圓和乙個多邊形 問是否能讓兩個圓在多邊形內。並且覆蓋的面積最大 圓的半徑為r,我們則讓多邊形的每條邊都往內部退r距離。然後求半平面交得出的點集中,最遠的兩個點則是兩圓的圓心即可 include include include include include include include...
半平面交 POJ 3384 Feng Shui
先把每條邊壓縮r的距離,求出半平面交,然後半平面交的最遠點對就是答案了。要注意最後的點數只有乙個時的情況,此時兩個圓重合。但是半平面交求出的平面是不含直線上的點,所以這時半平面交求出的點集為空。我的處理方法是壓縮每一條邊的時候少壓縮一點距離,這樣子求出的點不會是空集,注意把握好精度就可以了。incl...
POJ 3384 Feng Shui 半平面交
by cxlove 題目 給出乙個凸多邊形的房間,根據風水要求,把兩個圓形地毯鋪在房間裡,不能摺疊,不能切割,可以重疊。問最多能覆蓋多大空間,輸出兩個地毯的圓心座標。多組解輸出其中乙個 題目保證至少可以放入乙個圓,上一題中判斷過在乙個多邊形內是否能放入乙個半徑為r的圓。同樣將多邊形的邊內移r之後,半...