次の方法で作成された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 つのアルゴリズムで両方を処理できますか?