2014-03-03 6 views
0

그림의 크기를 반으로 줄이는 간단한 알고리즘을 쓰려고하는데, 나에게 의미가있는 것처럼 보입니다. 그러나 여기에 명백한 내용이 없을 것입니다. 누구든지 가리킬 수 있는지 궁금해하고 있습니다. 나 옳은 방향으로.JES 수축 알고리즘이 작동하지 않습니다.

a = pickAFile() 
b = makePicture(a) 
c = getWidth(b) 
d = getHeight(b) 
e = (c * 3)/4 
f = (d * 3)/4 
canvas = makeEmptyPicture(e,f) 
sourceX = 1 
for targetX in range (1, c): 
    sourceY = 1 
    for targetY in range (1, d): 
    color = getColor(getPixel(b, sourceX, sourceY)) 
    setColor(getPixel(canvas, targetX, targetY), color) 
    sourceY = sourceY + 2 
    sourceX = sourceX + 2 
show(canvas) 
show(b) 

EDIT : 지금 실행하려고하면 for 루프의 인덱스 범위를 벗어납니다.

+0

JES는 무엇인지 모르겠지만 사진에 대해서는 많이 알지 못하지만, 홀수 좌표 (x 및 y 좌표)가있는 모든 원본 픽셀을 복사하여 새로운 그림 (대상 그림)을 만들고 싶습니다. 1,3,5, ...). 나는 e와 f가 대상 그림의 높이와 너비라고 생각한다. 대상 사진의 너비가 반쪽이고 높이가 절반 인 경우 왜 e = (c * 3)/4가 아닌 e = c/2 및 f = d/2입니까? targetX가 1에서 c로 실행되고 y 폼 1에서 d로 대상이되는 이유는 무엇입니까? 나는 targetX가 1에서 e (c/2에 관한 것)까지 실행되어야한다고 생각할 것이다. 하지만 관련 주제에 대한 지식이 부족한 것 같습니다. – miracle173

+0

바운드가 아닌 정확한 오류 메시지는 무엇입니까? – miracle173

답변

0

캔버스 크기는 원래 이미지의 절반으로 시작해야합니다. 그래서 당신은 루프가 마지막에 새로운 이미지의 최초의 픽셀에서 반복하는 의미 둘째에 대한

e = c/2 
f = d/2 

e = (c * 3)/4 
f = (d * 3)/4 

을 변경해야합니다. 다음 문제는 당신이 루프 내부 내부의 변수에서는 sourceX를 증가한다는 것이다 다음

for targetX in range (1, c): 

for targetX in range (1, e): 

for targetY in range (1, d): 

for targetY in range (1, f): 

에 변경하십시오 . 이 루프

더 의미있는 이름을 선택하기위한 전체 코드는 내가 추천 마지막 것은이이

a = pickAFile() 
b = makePicture(a) 
c = getWidth(b) 
d = getHeight(b) 
e = c/2 
f = d/2 
canvas = makeEmptyPicture(e,f) 
sourceX = 1 
for targetX in range (1, e): 
    sourceY = 1 
    for targetY in range (1, f): 
    color = getColor(getPixel(b, sourceX, sourceY)) 
    setColor(getPixel(canvas, targetX, targetY), color) 
    sourceY = sourceY + 2 
    sourceX = sourceX + 2 
show(canvas) 
show(b) 

과 같아야에 대한 외부의 일부입니다, 그래서 당신은이 라인 코드 들여 쓰기를 변경해야합니다 귀하의 변수. c와 e, sourceWidth 및 targetWidth의 이름을 각각 지정하면 for 루프의 문제점을 쉽게 식별하는 데 도움이됩니다. 또한 몇 가지 추가 키를 입력 한 다음 코드 내에서 문제를 찾으려고 시간을 낭비했습니다.