如何在网格中绘制字符行(嵌套列表)
给定一个 w x h 大小的网格,这个网格是这样生成的:
self.grid = [ ['-'] * self.w ] * self.h
我想在这个网格中“画”一条字符线,连接两个点。以下是我写的代码:
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 填充网格中的一个点。
对于直线和完美的对角线,这个方法效果很好。对于“弯曲”的线条,它也能运行,不会出错,但看起来并不太像连接两个点的线,更像是……我也不知道,像一根曲棍球棒。
举个例子,给定一个 10x7 的网格和这个调用:
line( 'X', (1,1), (5,9) )
我得到的结果是:
----------
-X--------
--X-------
---X------
----X-----
-----XXXXX
----------
我希望得到的结果可能更像是:
----------
-X--------
---X------
-----X----
-------X--
---------X
----------
我该怎么做,才能在不影响直线和完美对角线的情况下实现这个效果?我需要两段不同的代码来处理这两种情况,还是可以用一个算法同时解决这两个问题?
1 个回答
2
如果你真的想自己编写这个程序,建议你使用布雷森汉线算法。另外,初始化网格时要小心,像这样做:
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数组来代替。