2017-05-09 174 views
0

我正在爲高精度測量編程應用程序。現在我有一個問題。通過兩點繪製精確圓圈

用戶可以在軸X上選擇一個代表圓的直徑的線段。 如果選定的直徑具有偶數像素長度,我如何通過兩個選定的終點畫圓圈 在這種情況下,圓的原點將在兩個像素之間,這將使我選擇其中一個像素,從而將圓圈移動一個像素左或右。 確實,外觀不會改變,因爲一個像素將被包含,另一個像素被添加到選定片段的另一側,但如果我需要首先根據片段在該區域周圍的長度繪製一個正方形,該怎麼辦? 然後圓形和方形會碰到錯誤的地方。

在這種情況下通常會做什麼?

+0

通常做的是讓圓的中心位於半像素邊界上。 –

+0

這是如何完成的。我的意思是,繪製正確的圓圈,我可以想象(使用極座標到三角或圓弧方程的笛卡爾座標),但是如果您必須繪製原點,還是要放置原點的位置?你使用兩個像素還是簡單地忽略它在數學上不正確的事實?我的意思是,你不能在兩個像素之間繪製。 :D – Dalen

回答

0

ImageDraw.Draw.ellipse以邊界框爲參數。它並不關心圓圈的中心位置。

圓形輪廓包含我執行的測試中邊界框的所有4個邊。我建議你也做你自己的測試。

從兩個任意點計算邊界框很容易,一旦你有圓的直徑和中心。

diameter = ((x2 - x1)**2 + (y2 - y1)**2) ** 0.5 
radius = diameter/2 
xC, yC = (x1 + x2)/2.0, (y1 + y2)/2.0 
bbox = [round(xC - radius), round(yC - radius), round(xC + radius), round(yC + radius)] 
+0

是的,我知道,但我仍然在意當我使用它時會發生什麼。將真正的橢圓畫出來,而不是一個圓,以接觸邊長爲D的邊界框四邊形的所有邊。或者,它會繪製一個真實的圓,但是使用R = int(D/2.0)並且向右保留一個像素,一個下降圈免費? – Dalen