2017-12-20 17 views
0

Ich frage mich, wie man eine Funktion mit PIL in Python auf das Intervall (-1,1) zeichnen. Ich habe mit Funktion y = x**2 gestartet und so weit ich habe dies:Wie zeichnet man die Werte, die von einer Funktion mit PIL erzeugt werden?

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) 

aber ich bin immer nur:

enter image description here

Und ich will bekommen:

enter image description here

Kannst du mir sagen, wo das Problem sein kann?

+0

Wo hast du 'function' definieren? ' – user1767754

+0

haben Sie versucht, Bedingung 'wenn Funktion (x) freude

Antwort

2

Nun, ich glaube nicht, dass Sie das Problem richtig angehen. Erstens, darüber nachzudenken, was Sie für das Pixel konditionieren schwarz sein bedeutet:

function(x) < function(y) 

Dies gilt nicht wirklich den Bereich unterhalb der Parabel definieren. Die Bedingung, die ist, ist

function(x) < y 

Denken Sie auch darüber nach, was Ihr Plotbereich ist. Es ist [0, 200) x [0, 200). Auch in PIL die x Koordinate steigt nach unten in das Bild, so dass Ihre Parabel (wenn überhaupt) auf dem Kopf steht.

Hier ist eine kleine Änderung an Ihrem Code:

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) 

Dieses Bild dieses produzieren sollte etwas ähnlich: enter image description here

0

Sie müssen die x und y Werte, um sicherzustellen, so dass sie Koordinaten in die darstellen Bereich von 0 bis size-1, um sie zu verwenden, um auf die Image zu zeichnen. Dies wird im folgenden Code erreicht, indem zuerst die minimalen und maximalen Werte ermittelt werden, die die Funktion für x Werte in diesem Bereich zurückgibt. Dann verwendet es diese, um sie zu übersetzen (zu bewegen) und zu skalieren, so dass sie alle in den benötigten Bereich fallen. Um den Bereich unterhalb der Kurve als Füllung zu erhalten, müssen Sie vertikale Linien und keine einzelnen Pixel zeichnen. Dazu habe ich ImageDraw.Draw.line() anstelle von im.putpixel() verwendet. Der Bildhintergrund wird im Image.new()-Aufruf auch auf WHITE initialisiert.

Beachten Sie auch, dass das erzeugte Bild auf dem Kopf steht, was in den meisten Lehrbüchern angezeigt wird, da der Ursprung die obere linke Ecke ist und die y-Achse von dort nach unten links verläuft. Die meisten Illustrationen haben ihren Ursprung in der unteren linken Ecke. Wenn du es wünschst, könntest du das auch reparieren.

from PIL import Image, ImageDraw 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

def parabola(x): 
    return (-1) * (x ** 2) 

def draw_function(function, size=200): 
    min_y, max_y = 0, 0 
    for x in range(size): 
     val = function(x) 
     if val < min_y: 
      min_y = val 
     if val > max_y: 
      max_y = val 
    delta = max_y - min_y 

    im = Image.new("RGB", (size, size), WHITE) 
    draw = ImageDraw.Draw(im) 
    for x in range(size): 
     y = int(((function(x)-min_y)/delta) * (size-1)) 
     draw.line([(x, 0), (x, y)], BLACK) 
    im.show() 

draw_function(parabola) 

Ergebnisse:

output showing parabola

Verwandte Themen