在图片上绘制对角线

时间:2013-08-05 17:26:54

标签: python coordinates draw jython jes

我试图从图片的右上角到左下角对角线绘制平行线。我希望它看起来像这样(可爱的油漆图片)

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将是最大值,导致超出范围异常,或者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

4 个答案:

答案 0 :(得分:8)

在第一部分中,y1设置为0,y2从循环中的0增加,因此y1 < y2。这很好,因为你使用

for y in range (y1,y2)

在第二部分中,y3设置为h(在您的情况下为128),而y4在循环中从0增加,因此y3 > y4。这不好,因为你使用

for y in range (y3,y4)

您可以通过向range()提供指示步长为-1的第三个参数来尝试向后退步。或者您可以切换y3y4(谨慎对待其他代码的作用)。

答案 1 :(得分:5)

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):

答案 2 :(得分:5)

在第二个循环中,y3大于(或等于)y4。所以,试试range (y4,y3)

答案 3 :(得分: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