Skip to main content
 首页 » 编程设计

Python:在矩阵中的两个坐标之间画线

2025年05月04日13wayfarer

我有一个大小为 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 

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

请您参考如下方法:

这是一个使用 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.]]