圓盤覆蓋,計算幾何(圓盤問題,LA 2572)

2021-07-26 11:45:50 字數 2106 閱讀 3346

就是自己不會做呀,不知道該如何判斷乙個圓盤是否被其他圓盤覆蓋了,想通過判斷交點是否滿足某些條件來判斷是否覆蓋,但就是很難找到一些的簡單的規律吧。

然後看大白書做的。

題目說,就算輸入資料有+-5e-13的變化,答案仍然不會有變化。①

這句話十分值得注意,它不是在對你作精度要求,而是在告訴你圓盤的可見部分或不可見部分都具有一定的大小。

換句話說,如果我們把eps設得更小一點(這無所謂,只會更準確),比如1e-13,那麼離圓心距離r+5e-13的點p1會被判定為在圓外,並且這個點一定在某個我們可以確定的可見部分或者不可見部分裡面,不會因為精度問題而剛好在邊界上或者跳到了另乙個我們不知道的區域裡。當然,離圓心距離r-5e-13的點p2也是同樣的道理。

那麼從上往下看,第乙個圈住p1,p2的圓(為什麼連p2點也要一起圈住呢?首先由於①,所以這肯定不會導致錯誤。其次我也不知道這是為什麼。。。自己又交了乙份只圈住p1的**,也ac了,只能說自己認為圈住兩個的**應該會更魯棒。)將會在p1點被看到,所以vis。

乙個圓有如此之多的(p1,p2)點對,那麼我該選擇哪些來用於判斷呢?

顯然乙個區域找乙個點就好了,而乙個區域一定是由有限段的弧圍成的。那麼我們不妨每一段弧找乙個點對,這樣雖然略有重複,但是重複的不多而且不會漏。

至於弧的話必然就是由圓被交點截出來的。

那麼解法就出來了。

列舉任意兩個圓,求出交點,把交點在圓上的極角儲存到這個圓上。那麼這些極角所對應的端點就把圓分成了許多段。最後我們針對每一段弧求乙個(p1,p2)點對,然後從上往下找第乙個圈住這個點對的圓,並把它標記為vis就好了。(顯然第二個以及更後面圈住這個點對的圓已經被第乙個圓覆蓋了,所以不vis)具體**還有更多細節需要注意就不詳說了。

注意如果乙個圓不與任何其他圓有交點,那麼當且僅當它被在它上面的圓完全覆蓋時,他才會看不見。所以列舉在它上面的圓,然後看一下是否包含了它的圓心即可。

(其實如果圓a上面的圓b包含了a的圓心,是有兩種情況的,一是a包含於b,二是b包含於a。在二的情況下a是不會被b完全覆蓋的,但是在這種情況下,當我們列舉到b時,a會被重新標記為vis的。我是從下往上列舉得哈。這也算是弄拙成巧了。)

好吧,後來又想了想發現包含p1,p2的意思應該是,分別標記包含p1的圓與包含p2的圓,而不是一起包。詳見**2。

**#includeusing namespace std;

const int maxn = 110;

const double pi = acos(-1);

struct point

};typedef point vector;

point readpoint()

const double eps = 1e-13;

int dcmp(double x)

point point(double rad)

point point_(double rad)

};circle readcircle()

double angle(vector a)

void getcirclecircleintersection(circle& c1,circle& c2)

int n;

circle a[maxn];

void getvis(point p1,point p2)

}}int main()

};typedef point vector;

point readpoint()

const double eps = 1e-13;

int dcmp(double x)

point point(double rad)

point point_(double rad)

};circle readcircle()

double angle(vector a)

void getcirclecircleintersection(circle& c1,circle& c2)

int n;

circle a[maxn];

void getvis(point p1)

}}int main()

{ //freopen("data.txt","r",stdin);

while(scanf("%d",&n)==1&&n)

{for(int i=0;i

計算幾何 訊號覆蓋

輸入第一行包含乙個正整數 n,表示房子的總數。接下來有 n 行,分別表示每乙個房子的位置。對於 i 1,2,n,第i 個房子的座標用一對整數 xi和yi來表示,中間用空格隔開。輸出檔案包含乙個實數,表示平均有多少個房子被訊號所覆蓋,需保證輸出結果與精確值的絕對誤差不超過0.01。4 0 2 4 4 ...

計算幾何 圓與圓的交點座標

給出兩圓的圓心座標和半徑,求出兩圓交點的座標 如下圖 可根據餘弦定理求出角a的大小,再根據函式atan2 可求出向量c1c2的方位角t 這樣一來,我們所求的交點就是以圓心c1.c為起點,大小為c1.r 角度為 t a 和 t a 的兩個向量 include include includeusing ...

計算幾何之圓與圓的交點

計算圓與圓的交點,需要用到餘弦定理 步驟如下 求出兩個圓的圓心距d 求出向量c2.c c1.c與c1.c到某交點的向量夾角a 求出向量c2.c c1.c與x軸的夾角t 那麼,兩個交點就分別是以c1.c為起點,大小為c1.r,角度為t a t a的兩個向量 題目 cgl 7 e ac include ...