題意:
圓心 o 座標(0, 0), 給定兩點 p, q(不在圓外),滿足 po = qo, 要在圓上找一點 d,使得 pd + qd 取到最小值。
官方題解:
做p點關於圓的反演點p',opd與odp'相似,相似比是|op| : r。
q點同理。
極小化pd+qd可以轉化為極小化p'd+q'd。
當p'q'與圓有交點時,答案為兩點距離,否則最優值在中垂線上取到。
時間複雜度 o(1)
o(1)
反演的定義:
已知一圓c,圓心為o,半徑為r,如果p與p』在過圓心o的直線上,且
反演的性質:
除反演中心外,平面上的每乙個點都只有唯一的反演點,且這種關係是對稱的,位於反演圓上的點,保持在原處,位於
反演圓外部的點,變為圓內部的點,位於反演圓內部的點,變為圓外部的點。 舉個最簡單的例子,區間
半徑,那麼反演後的區間就是
p向圓反演後的到p',可以推出p'do 與 pdo是相似三角形,那麼pd的距離就可以通過p'd來算
q點同理。
當 p'q' 與圓有交點時:
不妨設交點為 o',若 d 不為 o',則 p'd + q'd > p'q'(三角形兩邊之和大於第三邊);當且僅當 d 取 o' 時,p'q + q'd 取到最小值,即為 p'q'。
當 p'q' 與圓無交點時:
不妨將 p' 與 q' 看成橢圓的兩個焦點,當橢圓慢慢變大時,第乙個碰到的圓上的點 d 即為使得 p'd + q'd 最小的點;畫個圖就很顯然了,第乙個碰到的點即為 pq 的中垂線與圓的交點。
至於判斷有 p'q' 與圓有沒有交點,就是圓心到直線的距離與半徑比較,又因為此處 p'o=q'o,所以只需要比較 p'q' 的中點到圓心的距離和半徑的大小。
#include#define eps 1e-6
using namespace std;
int main()
double k=(r*r)/(d*d); // q這個點反演點與他到圓心的比例
double x3=x1*k,y3=y1*k,x4=x2*k,y4=y2*k;
double ox=(x3+x4)/2,oy=(y3+y4)/2; //p,q中點座標
double dis=sqrt(ox*ox + oy*oy);
if(dis <= r)
else}}
圓的反演變換 cdq分治 共點圓
因為所有的圓都過原點,因此可以以原點為反演中心,將所有的圓反演為一條直線,然後根據反演的性質,可以發現圓的內部會被反演到乙個半平面上去,因此每次詢問就相當於詢問點是否在半平面的交之中,這個可以動態插半平面詢問,也可以cdq分治來離線回答 詢問的時候二分點在凸包的哪塊三角形中,然後叉積一下就可以判斷了...
Parry圓的反演
最近閒來無事,專門研究了一下parry圓的性質,發現如果以參考三角形abc的外接圓作為反演圓,那麼parry圓的反演就是自身。原因是 parry圓與外接圓有兩個交點,乙個是kiepert拋物線的焦點,乙個是parry點,這兩個點反演後不變,另外parry圓經過三角形的兩個isodynamic點s和s...
圓的反演學習筆記
反演是平面上點到點的乙個對映,除反演中心外每個點都有唯一的反演點與之對應 通過畫圖可以知道一些性質 反演點在圓上,圓會反演成一條直線 反演點不在圓上,圓會反演成乙個圓,與原來的圓位似 反演點在直線上,直線會反演成它本身 反演點不在直線上,直線會反演成乙個圓 反演過後的相切關係不會改變 hdu4773...