首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:在矩阵中的两个坐标之间画线

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

Stack Overflow用户
提问于 2018-05-17 09:11:32
回答 5查看 4.9K关注 0票数 2

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

N=5的一个例子是:

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

代码语言:javascript
运行
复制
[x0,y0] = [0,3]
[x1,y1] = [4,2]

那么矩阵应该类似于:

代码语言:javascript
运行
复制
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

做这件事的简单方法是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-05-17 10:16:56

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

代码语言:javascript
运行
复制
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

一些测试:

代码语言:javascript
运行
复制
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.]]
票数 3
EN

Stack Overflow用户

发布于 2018-05-17 09:40:29

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

票数 2
EN

Stack Overflow用户

发布于 2018-05-17 09:41:05

这与选择屏幕上的两个像素并决定在两个像素之间亮起以直线连接的问题是一样的。查看直线绘制算法和其他类似的教程,了解这一问题是如何解决的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50387606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档