2012-01-17 130 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