1

给定一个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
----------

我将如何做到这一点,同时又不会在此过程中打破直线和完美的对角线?我需要两段不同的代码来处理这两种情况,还是一种算法可以同时处理这两种情况?

4

1 回答 1

2

如果您坚持自己编程,您应该使用Bresenham 的线算法。此外,请注意像这样初始化网格:

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 回答