2013-08-05 24 views
6

Sto provando a disegnare linee parallele diagonalmente dall'angolo in alto a destra all'angolo in basso a sinistra di un'immagine. Voglio farlo sembrare come questo (pic bella vernice)Disegno di linee diagonali attraverso un'immagine

diag paint pic

def diagTopLBottomR(): 
    pic=makePicture(pickAFile()) 
    w=getWidth(pic) 
    h=getHeight(pic) 
    x1=0 
    y1=0 
    x2=0 
    y2=0 
    i=0 
    while i<11: 
    x1=10*i 
    y2=10*i 
    i+=1 
    for y in range (y1,y2): 
     x = (y-y1)*(x2-x1)/(y2-y1) +x1 
     px=getPixel(pic,x,y) 
     color=makeColor(0,0,0) 
     setColor(px, color) 
    x3=0 
    y3=h 
    x4=w 
    y4=0 
    j=0 
    while j<10: 
    x3=10*j 
    y4=10*j 
    j+=1 
    for y in range (y3,y4): 
     x = (y-y3)*(x4-x3)/(y4-y3) +x3 
     px=getPixel(pic,x,y) 
     color=makeColor(0,0,0) 
     setColor(px, color) 

    return(pic) 

Noterete che il x3 o sarà il valore massimo, causando un'eccezione gamma outof, o l'intervallo y volontà inizia con un valore più alto, cioè (y3> y4) e non funziona al contrario, o quando lo decremento. È come un paradosso.

Il primo ciclo funziona, non importa quello che cerco Non riesco a far funzionare il secondo ciclo. Questo è quello con cui sto finendo.

diag lines

Tutte le idee? Grazie.


Modifica

Ho giocato intorno con gli intervalli, e sia ottenere nessun risultato per il secondo anello, come mostrato sopra di un'eccezione di gamma.

ho provato:

x3=0 
    y3=h 
    x4=w 
    y4=0 
    j=0 
    while j<10: 
    x3=10*j 
    y4=10*j 
    j+=1 
    for x in range (x3,x4): 
     y = (x-x3)*(y4-y3)/(x4-x3) +y3 

Stola Unicorns from here.

+0

si ottiene un errore? o semplicemente non viene visualizzato – sihrc

risposta

7

Nella prima parte, y1 è impostato su 0 e y2 aumenta da 0 nella maglia, così y1 < y2. Questo va bene perché si utilizzano

for y in range (y1,y2) 

Nella seconda parte, y3 è impostato su h (128 nel tuo caso, credo) e y4 aumenta da 0 nel ciclo, così y3 > y4. Questo non va bene perché si utilizza

for y in range (y3,y4) 

Si potrebbe provare a fare un passo indietro, dando range() un terzo parametro che indica un passo di -1. Oppure puoi cambiare y3 e y4 (fai attenzione a ciò che fa al resto del tuo codice).

+0

Con tutte le x e y, c'è una possibilità di errori in tutto. Per esempio nella riga 'x = (y-y3) * (x4-x3)/(y4-y3) + x3',' y4-y3' sarà negativo. Prova a passare e trova cose del genere. – nonexplosive

4

range() presuppone che il primo parametro sia inferiore al secondo parametro e diventi in ordine crescente. Hai:

for y in range (y3,y4): 

dove y3=h e y4=0 (al primo passaggio). Poiché y3> y4, questo ciclo non fa nulla. È possibile utilizzare:

for y in range(y4,y3): 

o

for y in range(y3,y4,-1): 
4

Nel secondo ciclo, y3 è maggiore (o uguale) di y4. Quindi, prova range (y4,y3).

2

L'ho risolto effettuando px=getPixel(pic,x,y-1) e utilizzando le risposte suggerite di decremento di intervallo.

def diagTopLBottomR(): 
    pic=makePicture(pickAFile()) 
    w=getWidth(pic) 
    h=getHeight(pic) 
    x1=0 
    y1=0 
    x2=0 
    y2=0 
    i=0 
    while i<10: 
    x1=10*i 
    y2=10*i 
    i+=1 
    for y in range (y1,y2): 
     x = (y-y1)*(x2-x1)/(y2-y1) +x1 
     px=getPixel(pic,x,y) 
     color=makeColor(0,0,0) 
     setColor(px, color) 
    x3=0 
    y3=h 
    x4=w 
    y4=0 
    j=0 
    while j<10: 
    x3=10*j 
    y4=10*j 
    j+=1 
    for y in range (y3,y4,-1):#change here 
     x = abs((y-y3)*(x4-x3)/(y4-y3) +x3) 
     px=getPixel(pic,x,y-1)#change here 
     color=makeColor(0,0,0) 
     setColor(px, color) 

    return(pic) 

pic

Problemi correlati