我想知道如何在间隔(-1,1)中使用python中的PIL绘制任何函数。我从函数y = x**2
开始,到目前为止,我有这个:
from PIL import Image
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
def parabola(x):
return (-1) * (x ** 2)
def draw_function(function, size=200):
im = Image.new("RGB", (size, size))
for x in range(size):
for y in range(size):
if function(x)< function(y):
im.putpixel((x,y), BLACK)
else:
im.putpixel((x,y), WHITE)
im.show()
draw_function(parabola)
但我得到了:
我想得到:
你能告诉我问题出在哪里吗?
答案 0 :(得分:2)
好吧,我不认为你正确地解决了这个问题。首先,考虑一下像素为黑色的条件意味着:
function(x) < function(y)
这并没有真正定义抛物线下面的区域。这样做的条件是
function(x) < y
另外,想想你的绘图区域是什么。它是[0, 200) x [0, 200)
。此外,在PIL
中,x
坐标在图像中向下增加,因此您的抛物线将可见(如果有的话)颠倒。
这里对您的代码进行了一些修改:
from PIL import Image
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
def parabola(x):
return (-1) * ((x - 100) ** 2) + 150
def draw_function(function, size=200):
im = Image.new("RGB", (size, size))
for x in range(size):
for y in range(size):
if function(x) < y:
im.putpixel((x,y), BLACK)
else:
im.putpixel((x,y), WHITE)
im.show()
draw_function(parabola)
答案 1 :(得分:0)
您需要确保x
和y
值,以便它们代表0
到size-1
范围内的坐标,以便使用它们来绘制{ {1}}。这是在下面的代码中完成的,首先找到函数将返回该范围内Image
值的最小值和最大值。然后它使用它们来翻译(移动)并缩放它们,使它们都落入所需的范围。要使曲线下方的区域为填充,您需要绘制垂直线,而不是单个像素。为此,我使用x
代替ImageDraw.Draw.line()
。在im.putpixel()
来电中,图片背景也会初始化为WHITE
。
另请注意,生成的图像将与大多数教科书中显示的图像颠倒,因为原点是左上角,y轴从那里到左下角。大多数插图的起源都在左下角。如果你愿意,你也可以解决这个问题。
Image.new()
结果: