Python 像素网格中的圆
给定中心Python 像素网格中的圆,python,numpy,graphics,Python,Numpy,Graphics,给定中心(x,y)和半径r,如何使用python在像素网格中绘制圆C((x,y,r)?可以假设像素网格足够大。这是Python中的Rosetta代码 def circle(self, x0, y0, radius, colour=black): f = 1 - radius ddf_x = 1 ddf_y = -2 * radius x = 0 y = radius self.set(x0, y0 + radius, colour) sel
(x,y)
和半径r
,如何使用python在像素网格中绘制圆C((x,y,r)
?可以假设像素网格足够大。这是Python中的Rosetta代码
def circle(self, x0, y0, radius, colour=black):
f = 1 - radius
ddf_x = 1
ddf_y = -2 * radius
x = 0
y = radius
self.set(x0, y0 + radius, colour)
self.set(x0, y0 - radius, colour)
self.set(x0 + radius, y0, colour)
self.set(x0 - radius, y0, colour)
while x < y:
if f >= 0:
y -= 1
ddf_y += 2
f += ddf_y
x += 1
ddf_x += 2
f += ddf_x
self.set(x0 + x, y0 + y, colour)
self.set(x0 - x, y0 + y, colour)
self.set(x0 + x, y0 - y, colour)
self.set(x0 - x, y0 - y, colour)
self.set(x0 + y, y0 + x, colour)
self.set(x0 - y, y0 + x, colour)
self.set(x0 + y, y0 - x, colour)
self.set(x0 - y, y0 - x, colour)
Bitmap.circle = circle
bitmap = Bitmap(25,25)
bitmap.circle(x0=12, y0=12, radius=12)
bitmap.chardisplay()
def圆(自身、x0、y0、半径、颜色=黑色):
f=1-半径
ddf_x=1
ddf_y=-2*半径
x=0
y=半径
自我设置(x0,y0+半径,颜色)
自我设置(x0,y0-半径,颜色)
自设置(x0+半径,y0,颜色)
自我设置(x0-半径,y0,颜色)
当x=0:
y-=1
ddf_y+=2
f+=ddf_y
x+=1
ddf_x+=2
f+=ddf_x
自我设置(x0+x,y0+y,颜色)
自我设定(x0-x,y0+y,彩色)
自组(x0+x,y0-y,彩色)
自我设定(x0-x,y0-y,彩色)
自组(x0+y,y0+x,彩色)
自组(x0-y,y0+x,彩色)
自组(x0+y,y0-x,彩色)
自组(x0-y,y0-x,彩色)
位图.circle=圆
位图=位图(25,25)
圆(x0=12,y0=12,半径=12)
位图.chardisplay()
假设您想完成任务(而不是学习光栅图形算法),只需使用:
输出:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 0, 0, 0, 255, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 0, 0, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
范围为0..255,因为即使对于每像素1位的图像,枕头也会每像素存储一个字节(因为它效率更高)
如果希望范围为0..1,则可以除以255:
[x/255 for x in image.getdata()]
要输出图像文件还是创建交互式应用程序?如果它是交互式的,是用于数据可视化还是游戏?@goncalopp我想要一个包含
0
和1
的2D数组,这样1
表示圆的位置。请查看。如果您在实现细节方面遇到困难,请告诉我们。@Falko非常感谢。如果您想获得灵感并画一个平滑的圆,请查看。该站点上的代码是用Pascal编写的,但要翻译成Python看起来并不难。Wu的线算法是绘制抗锯齿线的标准;他的圆圈算法不太为人所知。最好让链接文本更有意义,以防止链接腐烂。例如“这是Python中的Rosetta代码”。没错,rosettacode是一个相当稳定的网站,但你永远不知道。。。进入堆栈交换站点是一个好习惯。@PM2Ring感谢您的评论。我会解决它。如果我想在matplotlib上实现它呢?
[x/255 for x in image.getdata()]