此程序创建一个600 x 600图像,然后初始化四个点。 然后,这四个点中的每一个朝向该点移动10%的距离 顺时针方向最接近它们。每次移动后,程序都会绘制 每对点之间的一条线。该计划在积分时停止 非常接近。
from PIL import Image
from math import *
# Initial white image
n=600
img = Image.new("RGB", (n, n), (255, 255, 255))
# Draws a line between (p1x, p1y) and (p2x, p2y)
def drawLine(p1x, p1y, p2x, p2y):
t = 0.0
while t < 1.0:
x = int (n * (p1x + t * (p2x - p1x)))
y = int (n * (p1y + t * (p2y - p1y)))
img.putpixel((x, y),(0, 0, 255))
t += 0.001
# Initialize four points
P1 = (x1, y1) = (0.0, 0.0)
P2 = (x2, y2) = (1.0, 0.0)
P3 = (x3, y3) = (1.0, 1.0)
P4 = (x4, y4) = (0.0, 1.0)
# Draws lines
for counter in range(600):
x1 = .9 * x1 + .1 * x2
y1 = .9 * y1 + .1 * y2
drawLine(x1, y1, x2, y2)
x2 = .9 * x2 + .1 * x3
y2 = .9 * y2 + .1 * y3
drawLine(x2, y2, x3, y3) # Doesn't work
x3 = .9 * x3 + .1 * x4
y3 = .9 * y3 + .1 * y4
drawLine(x3, y3, x4, y4) # Doesn't work
x4 = .9 * x4 + .1 * x1
y4 = .9 * y4 + .1 * y1
drawLine(x4, y4, x1, y1)
# Saves image in Lab09.png
img.save("Lab09.png")
img.show("Lab09.png")
所以基本上用#Doesn工作评论的行导致了这个错误:
Traceback (most recent call last):
File "/Users/e154675/Desktop/Lab09.py", line 41, in <module>
drawLine(x2, y2, x3, y3)
File "/Users/e154675/Desktop/Lab09.py", line 25, in drawLine
img.putpixel((x, y),(0, 0, 255))
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/Image.py", line 1518, in putpixel
return self.im.putpixel(xy, value)
IndexError: image index out of range
我想知道如何解决这个问题及其导致的问题。 (我在使用IDLE的macbook pro上)
非常感谢你们! :)&lt; 3
答案 0 :(得分:1)
来自Python文档:
exception IndexError当序列下标超出范围时引发。
我开始尝试将有问题的代码块放入试验:除了:阻止,也许尝试打印索引,它首先尝试访问并从那里开始工作。
答案 1 :(得分:1)
使用drawLine(x2, y2, x3, y3)
,您有x2 = .9 * x2 + .1 * x3
,其中x2
和x3
最初定义为1.0
。因此,在函数调用时,x2
为1.第一次通过线条绘制循环,t=0.0
时,您将x
设置为int (n * (p1x + t * (p2x - p1x)))
可以使用1.0 * 600
或600.所以,你最终会使用x分量为600的像素坐标调用img.putpixel
。在600x600图像上,外角为(599,599) 。结果将是一个IndexError。
为了测试这个理论,您可以尝试将图像放大一个像素,看看是否有帮助:
img = Image.new("RGB", (n+1, n+1), (255, 255, 255))
或者,将您的点(P1
等)移动到远离图像边缘的位置,例如制作它们(0.1,0.1)和(0.9,0.9)等。