1

次の方法で作成されたw x hサイズのグリッドが与えられた場合

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

上記のグリッドの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) )

point() 関数は、グリッド内の単一のポイントをcharで埋めるだけです。

これは、直線と完全な対角線の魅力のように機能します。エラーをスローしないという意味で、「曲がった」線でも機能しますが、正確には 2 点間の線のようには見えず、ホッケースティックのように見えます。

たとえば、10x7 グリッドと呼び出しが与えられた場合

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

私は得る

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

私が欲しいのは、おそらくもっと似たものです

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

その過程で直線と完全な対角線のためにそれを壊さずに、どうすればこれを行うことができますか? 2 つのケースを処理するには 2 つの異なるコードが必要ですか、それとも 1 つのアルゴリズムで両方を処理できますか?

4

1 に答える 1

2

これを自分でプログラミングすることを主張する場合は、Bresenham's line algorithmを使用する必要があります。さらに、次のようにグリッドを初期化する場合は注意してください。

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

self.h同じリストのコピーを編集するため:

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

使用する

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

または代わりに Numpy 配列。

于 2011-02-07T14:14:48.887 に答える