2011-02-07 9 views
1

(중첩 된 목록)

self.grid = [ ['-'] * self.w ] * self.h 

은 내가 "선을"그릴 "할 다음과 같은 방법으로 생산하는 높이 x w 크기의 격자를 감안할 때 "그리드의 두 점 사이의 문자를"표시합니다. 다음 코드는 내가

점() 함수는 단순히 문자와 그리드의 단일 지점 채워
def line(self, char, (x1, y1), (x2, y2)): 
    self.point(char, (x1, y1)) 

    x = x1 + cmp(x2, x1) 
    y = y1 + cmp(y2, y1) 
    while x != x2 or y != y2: 
     self.point(char, (x, y)) 
     x = x + cmp(x2, x) 
     y = y + cmp(y2, y) 

    self.point(char, (x2, y2)) 

을 마련했습니다 것입니다.

이것은 직선과 완벽한 대각선의 매력처럼 작동합니다. 그것은 "비뚤어진"선들에 대해서도 오류를 발생시키지 않는다는 점에서 효과가 있지만 두 점 사이의 선처럼 정확하게 보이지는 않습니다. 나는 잘 모르겠지만 하키 스틱입니다. 10x7 그리드 내가

---------- 
-X-------- 
--X------- 
---X------ 
----X----- 
-----XXXXX 
---------- 

는 내가 원하는 얻을

line('X', (1,1), (5,9)) 

전화를 주어진 예를 들어

는, 아마 더

---------- 
-X-------- 
---X------ 
-----X---- 
-------X-- 
---------X 
---------- 

같은 것입니다 어떻게 것 그 과정에서 직선과 완벽한 대각선을 위해 그것을 부수 지 않으면 서 이것을 할 수 있습니까? 두 경우를 처리하기 위해 두 개의 코드가 필요합니까? 아니면 하나의 알고리즘이 두 가지를 모두 수행 할 수 있습니까?

답변

2

너 자신이 프로그래밍을 고집하는 경우라면 Bresenham's line algorithm을 사용해야합니다. 또한,이 같은 그리드를 초기화하는 조심 :

grid = [ ['-'] * self.w ] * self.h 

을하기 때문에 동일한 목록의 self.h 사본과 함께 edning의 :

grid = [ ['-'] * 3 ] * 3 
grid[0][0] = 'X' 
print grid 
# [['X', '-', '-'], ['X', '-', '-'], ['X', '-', '-']] 

사용

grid = [['-'] * self.w for ignored in xrange(self.h)] 

또는 NumPy와 배열 대신.

+0

빠른 속도입니다. 고맙습니다. 완벽하게 작동합니다. –