-1

我正在尝试在 jython 中画一张脸。

我正在使用 If not 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)

我得到了这个:
脸
我想要的是这个:

脸2

看来这没有执行:

#mouth
for y in range (337,311):
   x = (y-337)*(247-181)/(311-337) +181
   setColor(px,makeColor(254, 114, 115))

我做错了什么?

4

2 回答 2

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))
于 2013-08-12T09:10:58.287 回答
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 个像素中的每一个像素绘制整个嘴巴。您可能需要考虑一些不太原始的绘图函数,如直线和圆,如下所示:

  • 画一个蓝色的大方块。
  • 为脸部画一个粉红色的大圆圈。
  • 为外眼画两个白色圆圈。
  • 为内眼画两个蓝色圆圈。
  • 为虹膜画两个黑色圆圈。
  • 为鼻子画两个橙色圆圈。
  • 为嘴画一条紫色线。

我怀疑这会比根据一系列规则单独设置每个像素更有效。

于 2013-08-12T09:20:06.573 回答