計算幾何學習9
沒有學特定的姿勢
做了第二期的一些普通題
發現了自己很容易犯的一些錯誤
HDU 3264
給你一些互不相交,互不內含的圓,尋找一個最小的半徑,使得在某點圓心處以該半徑作圓時可以覆蓋每個圓至少一半的面積
一看就是二分加兩圓的面積交了,但是很智障的是,我當時並沒有直接去求交集面積,而是額外去求了圓的交點,並且是求了兩個弓形的面積之和
這樣討論起來就麻煩了,圓的優弧情況是對應扇形加上三角形,劣弧是減去,判斷優弧劣弧的條件是一方半徑平方大於另一方半徑加上圓心距平方
不過還是寫過了= = 當是敲了一個圓的交點的板子吧
求圓的交點是求出圓心連線 和兩圓之差得到的直線的交點,可以知道圓的的交點到至直線交點的距離,就可以求了
poj 2546
這個才是求圓交面積= =
求圓交面積是兩個扇形的面積減去兩個大三角面積,不用到弓形。
由於邊的關系確定,角度可以從余弦定理算出。。。不需要求交
asin返回的是-pi/2 ~ pi/2 而acos是0~ pi atan2是 (-pi,pi]
UVALive 3000
在線段上種樹
若幹條線段 線段交點的25m範圍內不允許種樹 兩棵樹的間隔要大於等於50m
枚舉每條線段,求所有線段和他的交點,排個序得到若幹區間,每個區間統計答案就行了
= =但是我WA了不知道多少炮
最後才發現是自己在判斷交點是否在線段上的問題
一般有兩種方法:
1)點和線段兩端點的叉積為0,並且點和兩端點的點積小於等於0
2)點到直線兩端的距離之和等於線段長度
。。。我用的第一種,但是的精度貌似炸了
以後如果求線段交點,最穩的是先叉積用判斷線段相交,再求直線交點。。。而不是先求再判斷
UVALive 4676
給你兩個三角形和他們的速度 問他們最早什麽時候相交
很直觀的想法是固定一個,讓另一個動
判斷是否會相交,就是運動三角形的三個點運動得到的射線包含了另一個三角形的一部分
由於判斷點是否在一組平行線之間更簡單,所以可以做兩次
求時間,可以直到最早發生的相交一定是一個點和一個點或者線段相交,所以也需要枚舉兩次,讓哪個動
求射線和線段交點,射線的話可以先求,然後再判斷和運動方向判斷
一個trick是合成速度為0的時候直接判斷初始的時候是否有相交
寫的時候發現之前的一個錯誤,判斷兩線段是否相交的時候,前面的四條判斷語句並非沒有用(在非規範相交的時候
有一種情況就是 兩線段共線但是並不相交 必須先用判斷語句判掉
hdu 3272
給你三個點C,D,H要求你找一條路徑從H出發,需要經過C,D,X軸,Y軸(沒順序)最後回到H,路徑最短
剛開始很naive的想法是把 C,D的三個對稱點加上他們自己枚舉一下,固定H,只要總路徑既經過X又經過Y就更新答案
但是有錯誤到達像點的含義是經過一個軸到達實際點,如果像點和其他實際點同側顯然會出現問題,而且兩個像點之間的距離是無意義的
看了別人的題解 找到一種簡潔的寫法
路徑是由三條邊組成的,邊需要跨x或者跨y或者跨原點
我們枚舉一條邊,如果跨越原點其他兩邊就不用變了;
或者枚舉兩條邊,一條跨x,一條跨y。
如果本身已經跨越就直接計算距離,否則把同側的部分對稱過去
註意邊的長度是像點到實際點,不會有像點到像點的邊
明天打算繼續做部分題
計算幾何學習9