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