Python + Scipy로 무작위로 작성한 점에서 볼록한 포를 그립니다.

8115 단어 파이썬scipy
오랜만에 작은 재료.

할 일


  • 적당히 2 차원으로 점군을 얻는다
  • 점 구름에서 볼록함을 계산합니다
  • 점 구름과 볼록 패브릭을 matplotlib로 그립니다

  • 출처


    # -*- coding: utf-8 -*-
    
    import numpy as np
    import matplotlib.pyplot as plt
    import scipy.spatial as ssp
    
    
    def point_in_hull(point, hull, tolerance=1e-6):
      return all(
        (np.dot(eq[:-1], point) + eq[-1] <= tolerance)
        for eq in hull.equations)
    
    
    def main():
      N = 100
      points = np.random.rand(N, 2)
      idx_bases = np.random.choice(range(N), 5, replace=False)
      bases = points[idx_bases, :]
    
      # hull
      hull = ssp.ConvexHull(bases)
      idx = [i for i in range(N) if point_in_hull(points[i, :], hull)]
    
      # vis
      fig = plt.figure(figsize=(5, 5))
      ax = fig.gca()
      ax.scatter(points[:, 0], points[:, 1], c='r', marker='o')
      ax.scatter(bases[:, 0], bases[:, 1], c='b', marker='o')
    
      # in hull vertex and borders
      pidx = points[idx, :]
      ax.scatter(pidx[:, 0], pidx[:, 1], c='c', marker='x')
      for simplex in hull.simplices:
        plt.plot(bases[simplex, 0], bases[simplex, 1], "k--")
    
      ax.axis("off")
      ax.margins(x=0.015, y=0.015)
      ax.set_position([0.05, 0.05, 0.9, 0.9])
      plt.show()
      plt.close()
    
    
    if __name__ == '__main__':
      main()
    

    실행 예



    좋은 웹페이지 즐겨찾기