如何在网格中绘制字符行(嵌套列表)

1 投票
1 回答
625 浏览
提问于 2025-04-16 11:23

给定一个 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数组来代替。

撰写回答