2011-02-07 21 views
1

(ネストされたリスト)

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

が、私は「行「を描く」ことを望む、次のようにして製造し、時間X ワットサイズのグリッドを考えます前記グリッド内の2つの点の間の文字の "次のコードは、私が

ポイント()関数は、単に 文字でグリッド内の単一の点で埋め
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)) 

を作ってみたものです。

これは、直線と完全対角線の魅力のように機能します。それはエラーを投げないという意味で "曲がった"ラインでも動作しますが、ちょうど2つのポイント間のラインのようには見えません。私はホッケーのスティックは分かりません。例えば

、10x7グリッドとコール

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

与えられた私は、私が好きな何

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

を取得するには、おそらくよりどのようにでしょう

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

のようなものですこれを行うには、途中で直線と完璧な対角線のためにそれを壊すことはありませんか? 2つのケースを処理するために2つの異なるコードを必要とするのでしょうか、あるいはどちらか一方のアルゴリズムで両方を行うことはできますか?

答えて

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

これは高速でした。どうもありがとう、それは完璧に動作します。 –

関連する問題