Рисование диагональных линий на изображении

Я пытаюсь нарисовать параллельные линии по диагонали от верхнего правого угла к нижнему левому углу картинки. Я хочу, чтобы это выглядело так (прекрасный рис рис)

рис рис рис

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), и не будет работать наоборот, либо когда я уменьшу его. Это как парадокс.

Первый цикл работает, независимо от того, что я пытаюсь, я не могу заставить работать второй цикл. Это то, чем я заканчиваю.

диагональные линии

Есть идеи? Благодарю.


редактировать

Я поиграл с диапазонами, и либо не получил результат для второго цикла, как показано выше для исключения вне диапазона.

Я пытался:

  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

Украл Единорогов отсюда.

4 ответа

Решение

В первой части 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. Или вы могли бы переключиться y3 а также y4 (будьте осторожны с тем, что это делает с остальным кодом).

Во втором цикле y3 больше (или равно) чем y4, Так что постарайтесь range (y4,y3),

range() Предполагается, что первый параметр меньше, чем второй параметр, и он идет в порядке возрастания. У тебя есть:

for y in range (y3,y4):

где y3=h а также y4=0 (на первом проходе). Поскольку y3 > y4, этот цикл ничего не делает. Вы можете использовать либо:

for y in range(y4,y3):

или же

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

Я решил это, сделав 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)

фильм

Другие вопросы по тегам