2012-01-17 135 views
-1

我想知道如果這裏有人能幫助我與一些僞代碼,或者至少指向我如何畫一個圓段無抗鋸齒正確的方向。繪製一個圓段

回答

1

用於在圓點的公式是:

x = xcenter + radius * sin(theta) 
y = ycenter + radius * cos(theta) 

其中xcenterycenter是圓的中心,radius是半徑,theta是角度。

您只需遍歷從您的出發角度theta在足夠小的步驟,您的終止角度,並繪製提取xy價值觀,牢記最三角函數把他們的論據,弧度(0通過2 * PI),而不是度(0到360) - 調整開始和結束角度theta步驟考慮到這一點。

僞代碼將是類似以下內容:

def plotCirle (xc, yc, rad, start, end): 
    theta = start 
    while theta <= end: 
     x = xc + rad * sin (theta) 
     y = yc + rad * cos (theta) 
     plot (x, y) 
     theta = theta + 0.01 

雖然你可能要規範化的角度爲0和2 * PI之間,如果然後交換的開始和結束的角度前者大於後者。

如果你想更有效的代碼,你可以看看到midpoint circle algorithm。數學更重要,並且由於只需要一個段(這意味着您需要知道角度,通常對於該算法而言通常不需要使用整圈)的要求會稍微複雜一些,但如果上面的簡單算法速度不夠快。

+0

謝謝,懂了工作。但是這個算法只有一個整數數學的版本嗎? – Mattivc 2012-01-17 01:58:42

+0

如果需要,可以使用整數,但標準的trig函數將會獲得浮點值。在使用放大的值(0-360變爲0-3600)和值的查找表之前,我已經構建了整數trig函數,但是這些函數在嵌入式空間中的舊時代中,這些函數在時間上非常昂貴。還有更有效的圈子繪製算法(查找bresenham或中點圓圈),但這需要更多的數學,而不是我可以輕鬆適應的答案。 – paxdiablo 2012-01-17 02:06:57

+0

'plot(int(x),int(y))' – 2012-01-17 04:21:43

0

僅適用於整圈拉,看到維基百科的文章midpoint circle algorithm。它用代碼呈現了Bresenham的線算法的一種圓形變體。參見codecircle與中點圓算法,Bresenham圓算法和優化的第三種方法進行比較(帶代碼)。

0
Result.X := Round(fCenter.X + cos(Angle/180*pi)* Radius); 
Result.Y := Round(fCenter.Y + sin(Angle/180*pi)* Radius); 
+0

請解釋如何回答這個問題。 – 2018-02-15 07:30:01