2013-08-05 64 views
6

我正在嘗試從圖片的右上角向左下角對角繪製平行線。我希望它看起來像這樣(迷人的油漆PIC)在圖片上繪製對角線

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) 

你會注意到的X3要麼是最大值,引起outof範圍的異常,或y範圍將從一個更高的值開始,即(y3> y4),並且不反轉,或者當它遞減時。這就像一個悖論。

第一個循環正在工作,無論我嘗試什麼,我都無法獲得第二個循環的工作。這就是我最終的結果。

diag lines

任何想法?謝謝。


編輯

我與範圍周圍演奏,並且或者沒有得到結果爲第二回路,如圖上述超出範圍的異常的。

我曾嘗試:

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 

偷獨角獸from here

+0

你得到一個錯誤?或者它只是不顯示 – sihrc

回答

7

在第一部分中,y1被設置爲在環0 0和y2增加,因此y1 < y2。因爲你用

for y in range (y1,y2) 

在第二部分,這是好的,y3設置爲h(128你的情況,我猜),並在環路0 y4增加,因此y3 > y4。因爲你用

for y in range (y3,y4) 

您可以嘗試通過給range()指示-1步驟大小的第三個參數後退操作這不精。或者你可以切換y3y4(謹慎對待你的其他代碼)。

+0

隨着所有的X和Y的,所有的錯誤的可能性。例如在'x =(y-y3)*(x4-x3)/(y4-y3)+ x3'這一行中,'y4-y3'將是負數。嘗試通過並找到那樣的事情。 – nonexplosive

4

range()假設第一個參數小於第二個參數,並且按升序排列。您有:

for y in range (y3,y4): 

其中y3=hy4=0(第一遍)。由於y3> y4,這個循環什麼都不做。 可以使用任一:

for y in range(y4,y3): 

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

在第二個循環中,y3大於(或等於)y4。因此,請嘗試range (y4,y3)

2

我通過製作px=getPixel(pic,x,y-1)並使用遞減y範圍的建議答案來解決這個問題。

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