Python:在矩阵中的两个坐标之间绘制线条

时间:2018-05-17 09:11:32

标签: python

我有一个大小为N x N的矩阵定义为M = np.zeros((N,N))和两个坐标[x0,y0][x1,y1]。现在我想把这两点连接起来。

N=5的一个例子是:

让我们在矩阵中将坐标设置为2

[x0,y0] = [0,3]
[x1,y1] = [4,2]

然后矩阵应该看起来像:

M = 
    0 0 0 2 0
    0 0 0 1 0
    0 0 1 0 0
    0 0 1 0 0
    0 0 2 0 0

这样做的简单方法是什么?

4 个答案:

答案 0 :(得分:2)

如果您将数组在概念上视为像素矩阵,则可以使用Bresenhams line drawing algorithm在这两个点之间绘制一条线。

答案 1 :(得分:2)

这与在屏幕上选择两个像素并确定其中哪些像素应该点亮以将它们以直线连接相同的问题。查看line drawing algorithms和其他类似的教程,了解它是如何解决的。

答案 2 :(得分:1)

考虑DDA线生成算法。它用于绘制两点之间的直线点。在这里,您必须填充数组中的位置,而不是绘图画布。

这是我的看法:

template(name="testLogFormat" type="list")
   property(name="syslogtag"
            regex.type="ERE"
            regex.submatch="0"
            regex.expression=".*--end"
            regex.nomatchmode="ZERO"
)

说明:

  1. 找到两个轴(dx和dy)所涵盖的距离
  2. 计算步数 - >
  3. 中任何轴都要覆盖的最大细胞数
  4. 查找需要增加的数量
  5. 循环获取步数并绘制点和增量。 您需要将其转换为绝对值,因为列表指针需要是整数。
  6. def printarr():
        for row in board:
            print ' '.join([str(x) for x in row]) 
    
    def makeline():
        dx = point2[0] - point1[0]
        dy = point2[1] - point1[1]
        steps = dx if (dx>dy) else dy
        xinc= dx/float(steps)
        yinc = dy/float(steps)
    
        x = point1[0]
        y = point1[1]
        for i in range(steps+1):
            if (board[abs(x),abs(y)] == 0):
                board[abs(x),abs(y)]=1
            x+=xinc
            y+=yinc
    
    point1 = [2,2]
    point2 = [10,12] 
    
    board[point1[0],point1[1]] = 2
    board[point2[0],point2[1]] = 2
    
    makeline()
    printarr()
    

答案 3 :(得分:1)

这是使用NumPy的一个简单实现,只计算线方程:

import numpy as np

def draw_line(mat, x0, y0, x1, y1, inplace=False):
    if not (0 <= x0 < mat.shape[0] and 0 <= x1 < mat.shape[0] and
            0 <= y0 < mat.shape[1] and 0 <= y1 < mat.shape[1]):
        raise ValueError('Invalid coordinates.')
    if not inplace:
        mat = mat.copy()
    if (x0, y0) == (x1, y1):
        mat[x0, y0] = 2
        return mat if not inplace else None
    # Swap axes if Y slope is smaller than X slope
    transpose = abs(x1 - x0) < abs(y1 - y0)
    if transpose:
        mat = mat.T
        x0, y0, x1, y1 = y0, x0, y1, x1
    # Swap line direction to go left-to-right if necessary
    if x0 > x1:
        x0, y0, x1, y1 = x1, y1, x0, y0
    # Write line ends
    mat[x0, y0] = 2
    mat[x1, y1] = 2
    # Compute intermediate coordinates using line equation
    x = np.arange(x0 + 1, x1)
    y = np.round(((y1 - y0) / (x1 - x0)) * (x - x0) + y0).astype(x.dtype)
    # Write intermediate coordinates
    mat[x, y] = 1
    if not inplace:
        return mat if not transpose else mat.T

一些测试:

print(draw_line(np.zeros((5, 5)), 0, 3, 4, 2))
#[[0. 0. 0. 2. 0.]
# [0. 0. 0. 1. 0.]
# [0. 0. 1. 0. 0.]
# [0. 0. 1. 0. 0.]
# [0. 0. 2. 0. 0.]]
print(draw_line(np.zeros((5, 5)), 4, 2, 0, 3))
#[[0. 0. 0. 2. 0.]
# [0. 0. 0. 1. 0.]
# [0. 0. 1. 0. 0.]
# [0. 0. 1. 0. 0.]
# [0. 0. 2. 0. 0.]]
print(draw_line(np.zeros((5, 5)), 1, 0, 3, 4))
#[[0. 0. 0. 0. 0.]
# [2. 0. 0. 0. 0.]
# [0. 1. 1. 1. 0.]
# [0. 0. 0. 0. 2.]
# [0. 0. 0. 0. 0.]]