我想在jython中画一张脸。
我正在使用If if Elif语句,因此每种颜色都会被覆盖,我会逐层构建一个面。
def face():
pic=makeEmptyPicture(400,400)
for x in range (400):
for y in range (400):
px = getPixel(pic,x,y)
setColor(px, makeColor(43, 170, 214))
#face
if (( pow((x-200),2)+pow((y-200),2))<pow(200,2)):
setColor(px, makeColor (255, 214, 153))
#eyes
if( ((pow((x-100),2)+pow((y-160),2))<pow(50,2)) or ((pow((x-290),2)+pow((y-145),2))<pow(60,2)) ):
setColor(px,makeColor(255,255,255))
#iris
if( ((pow((x-100),2)+pow((y-163),2))<pow(20,2)) or ((pow((x-295),2)+pow((y-135),2))<pow(22,2)) ):
setColor(px,makeColor(54, 123, 220))
#pupil
if( ((pow((x-100),2)+pow((y-165),2))<pow(10,2)) or ((pow((x-295),2)+pow((y-137),2))<pow(11,2)) ):
setColor(px,makeColor(0,0,0))
#nose
if( ((pow((x-209),2)+pow((y-245),2))<pow(13,2)) or ((pow((x-191),2)+pow((y-250),2))<pow(12,2)) ):
setColor(px,makeColor(255, 198, 114))
#mouth
for y in range (337,311):
x = (y-337)*(247-181)/(311-337) +181
setColor(px,makeColor(254, 114, 115))
return (pic)
我得到了这个:
我想要的是这个:
看来这没有执行:
#mouth
for y in range (337,311):
x = (y-337)*(247-181)/(311-337) +181
setColor(px,makeColor(254, 114, 115))
我做错了什么?
答案 0 :(得分:2)
您需要将-1作为第三个参数传递给range
。
<强>演示:强>
>>> range(10, 5)
[]
>>> range(10, 5, -1)
[10, 9, 8, 7, 6]
<强>代码:强>
for y in range (337, 311, -1): #311 is not inclusive
x = (y-337)*(247-181)/(311-337) +181
setColor(px,makeColor(254, 114, 115))
答案 1 :(得分:2)
如果您想向后运行范围,,则需要提供-1
的步骤。
例如:
pax> python
Python 2.7.3 (default, Jan 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print range (50,40)
[]
>>> print range (50,40,-1)
[50, 49, 48, 47, 46, 45, 44, 43, 42, 41]
>>>
如果没有否定步骤,则范围永远不会开始,因为已经传递了结束值。
因此,在您的特定情况下,您需要:
for y in range (337,311,-1):
x = (y-337)*(247-181)/(311-337) +181
setColor(px,makeColor(254, 114, 115))
但是,你这样做的方式也不是......我称之为效率的典范 - 那就像我一样机智: - )
你正在为你处理的160,000个像素中的每个像素画出整个嘴。您可能需要考虑一些不太原始的绘图函数,如直线和圆,沿着以下几行:
我怀疑这会比根据一系列规则单独设置每个像素更有效。