多语言展示
当前在线:362今日阅读:19今日分享:20

python 如何判断矩阵与线段是否相交?

存在一个矩阵(实心与空心), 和6条线段, 6条线段中有的与长方形相交, 有的不相交,用红色表示相交的线段;蓝色表示不相交的线段。
工具/原料

Anaconda3.exe

方法/步骤
1

首先通过python创建一个矩阵import numpy as npimport matplotlib.pyplot as pltimport matplotlib.transforms as pboximport matplotlib.path as ppathfig = plt.figure()rect = plt.Rectangle((-1, -1), 2, 2, facecolor='#aaaaaa')plt.gca().add_patch(rect)bbox = pbox.Bbox.from_bounds(-1, -1, 2, 2)plt.xlim(-2, 2)plt.ylim(-3,3)plt.show()

2

接着我们随机生成6条直线data = []lines =[]for i in range(6):    verts = (np.random.random((2, 2)) - 0.5) * 3.0    data.append(verts)    path = ppath.Path(verts)    line, = plt.plot(verts[:, 0], verts[:, 1], color='b')    lines.append(line)

3

在这里我们就完成了题干的设置

4

下面我们就需要对图中的线段进行区分,并标上不同的颜色,第一种情况,矩阵是个空心的矩阵,关键代码:data = zip(linedata, lines)for dt in data:    verts = dt[0]    path = ppath.Path(verts)    if path.intersects_bbox(bbox, False):        dt[1].set_color('red')

5

当矩阵是实心的话,首先我们要清空,并重建题干的情况:fig.clear()lines = []    fig = plt.figure()rect = plt.Rectangle((-1, -1), 2, 2, facecolor='#aaaaaa')plt.gca().add_patch(rect)bbox = pbox.Bbox.from_bounds(-1, -1, 2, 2)plt.xlim(-2, 2)plt.ylim(-3,3)for verts in linedata:    line, = plt.plot(verts[:, 0], verts[:, 1], color='b')    lines.append(line)

7

本节主要是对intersect_bbox 的方法进行探究,完整的代码如下:import numpy as npimport matplotlib.pyplot as pltimport matplotlib.transforms as pboximport matplotlib.path as ppathfig = plt.figure()rect = plt.Rectangle((-1, -1), 2, 2, facecolor='#aaaaaa')plt.gca().add_patch(rect)bbox = pbox.Bbox.from_bounds(-1, -1, 2, 2)plt.xlim(-2, 2)plt.ylim(-3,3)linedata = []lines =[]for i in range(6):    verts = (np.random.random((2, 2)) - 0.5) * 3.0    linedata.append(verts)    path = ppath.Path(verts)    line, = plt.plot(verts[:, 0], verts[:, 1], color='b')    lines.append(line)## 用于保存到本地图片from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvascanvas = FigureCanvas(fig)canvas.print_figure('test1.png', dpi=80)data = zip(linedata, lines)for dt in data:    verts = dt[0]    path = ppath.Path(verts)    if path.intersects_bbox(bbox, False):        dt[1].set_color('red')        canvas = FigureCanvas(fig)canvas.print_figure('test2.png', dpi=80)fig.clear()lines = []    fig = plt.figure()rect = plt.Rectangle((-1, -1), 2, 2, facecolor='#aaaaaa')plt.gca().add_patch(rect)bbox = pbox.Bbox.from_bounds(-1, -1, 2, 2)plt.xlim(-2, 2)plt.ylim(-3,3)for verts in linedata:    line, = plt.plot(verts[:, 0], verts[:, 1], color='b')    lines.append(line)        data = zip(linedata, lines)for dt in data:    verts = dt[0]    path = ppath.Path(verts)    if path.intersects_bbox(bbox):        dt[1].set_color('red')        canvas = FigureCanvas(fig)canvas.print_figure('test3.png', dpi=80)plt.show()

推荐信息