计算和显示凸包。

7

我想在Python中计算和展示一组随机点的凸包。

这是我的当前代码:

import numpy as np
import random
import matplotlib.pyplot as plt
import cv2

points = np.random.rand(25,2)   

hull = ConvexHull(points)

plt.plot(points[:,0], points[:,1], 'o',color='c')

for simplex in hull.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1], 'r')

plt.plot(points[hull.vertices,0], points[hull.vertices,1], 'r', lw=-1)
plt.plot(points[hull.vertices[0],0], points[hull.vertices[0],1], 'r-')
plt.show()

我的问题:

  • 如何将 X、Y 标签和点的限制更改为 0 到 9?例如 (0,1,2,3,4,5,6,7,8,9)
  • 如何使用圆圈标记凸包上的点? 示例
1个回答

10

np.rand() 替换为 randint(0, 10) 将生成坐标作为整数从 0,1,...9

使用 '.' 作为标记将导致给定点的标记更小。

使用 'o' 作为标记,设置一个 markeredgecolor 并将主颜色设置为 'none',将导致圆形标记,可用于凸包上的点。标记的大小可以通过 markersize= 进行调整。

fig, axes = plt.subplots(ncols=..., nrows=...) 是创建多个子图的方便方法。

这是一个最简示例的代码:

from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
import numpy as np

points = np.random.randint(0, 10, size=(15, 2))  # Random points in 2-D

hull = ConvexHull(points)

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 3))

for ax in (ax1, ax2):
    ax.plot(points[:, 0], points[:, 1], '.', color='k')
    if ax == ax1:
        ax.set_title('Given points')
    else:
        ax.set_title('Convex hull')
        for simplex in hull.simplices:
            ax.plot(points[simplex, 0], points[simplex, 1], 'c')
        ax.plot(points[hull.vertices, 0], points[hull.vertices, 1], 'o', mec='r', color='none', lw=1, markersize=10)
    ax.set_xticks(range(10))
    ax.set_yticks(range(10))
plt.show()

生成的图表

提示:要在单独的窗口中显示图表:

from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
import numpy as np

points = np.random.randint(0, 10, size=(15, 2))  # Random points in 2-D
hull = ConvexHull(points)
for plot_id in (1, 2):
    fig, ax = plt.subplots(ncols=1, figsize=(5, 3))
    ax.plot(points[:, 0], points[:, 1], '.', color='k')
    if plot_id == 1:
        ax.set_title('Given points')
    else:
        ax.set_title('Convex hull')
        for simplex in hull.simplices:
            ax.plot(points[simplex, 0], points[simplex, 1], 'c')
        ax.plot(points[hull.vertices, 0], points[hull.vertices, 1], 'o', mec='r', color='none', lw=1, markersize=10)
    ax.set_xticks(range(10))
    ax.set_yticks(range(10))
    plt.show()

我还有一个小问题。如何仅获取点的输出? - Atakan ADA
另一个显示屏只需要显示点。就像这样: --> 第一个显示屏仅显示点 --> 第二个显示屏计算凸包并显示 - Atakan ADA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接