Mindis 圓的反演變換

2021-08-06 02:12:43 字數 1338 閱讀 7706

題意:

圓心 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...