【问题标题】:Convex hull area in Python?Python中的凸包区域?
【发布时间】:2013-11-21 07:42:27
【问题描述】:

我有一组点A。我得到了CH_A 的凸包A

那么,我有加分,点集B。我将B 添加到A 并获得更大的点集。我获得了包含AB 的更大集合的凸包CH_AB

我想量化将B 添加到集合A 中需要支付多少费用。我正在考虑使用一个额外的区域来量化这个成本。

假设CH_A 的面积为Area_A,那么CH_AB 的面积为Area_AB。然后,我想计算边际成本为

(Area_AB - Area_A) / Area_A 

如何在 Python 中获得凸包的面积?

【问题讨论】:

    标签: python geometry convex-hull


    【解决方案1】:

    您可以只使用来自scipy.spatialConvexHull 类。它不仅会为您提供船体的面积,还会为您计算船体。但是如果你确实使用它,小心!在 2D 中,你要使用的属性不是 area,而是 volume ,因为前者实际上会给你船体的周长。

    这是因为属性是根据它们在 3D 中的值命名的,其中 area 确实是船体的面积,而 volume 就是它的体积。对于 2D 船体,名称相同,但它们实际包含的内容与锡上所说的不完全一样。更糟糕的是,文档并没有就此发出警告。

    (您可以通过简单的示例轻松检查这一点,例如腿上长度为 1 的等腰直角三角形:周长应为 2+sqrt(2),或约 3.414213562,面积应为 0.5。)

    【讨论】:

      【解决方案2】:

      凸包只是一个凸多边形,因此您可以轻松尝试{this}{this} 来查找二维多边形的面积。

      类似于以下内容(我们的版本):

      def PolyArea2D(pts):
          lines = np.hstack([pts,np.roll(pts,-1,axis=0)])
          area = 0.5*abs(sum(x1*y2-x2*y1 for x1,y1,x2,y2 in lines))
          return area
      

      其中 pts 是多边形顶点的数组,即 (nx2) 数组。

      完全使用:

      import numpy as np
      
      def PolyArea2D(pts):
          lines = np.hstack([pts,np.roll(pts,-1,axis=0)])
          area = 0.5*abs(sum(x1*y2-x2*y1 for x1,y1,x2,y2 in lines))
          return area
      
      pts = [[0,0],[1,0],[1,1],[0,1]]
      print PolyArea2D(pts)    
      
      pts = [[0,0],[1,0],[0,1]]
      print PolyArea2D(pts)    
      
      pts = [[0,0],[1,0],[0.5,0.5]] 
      print PolyArea2D(pts)    
      
      >>>
      1.0
      0.5
      0.25
      

      【讨论】:

      • 不错且清晰的答案。但是有一个问题:函数名以大写开头! :-)
      • 如果我在更大的多边形内添加一个点,答案会改变。比如说pts = [[0,0],[1,0],[1,1],[0,1]] print PolyArea2D(pts) #1.0pts = [[0,0],[1,0],[1,1],[0,1],[0.5,0.5]] print PolyArea2D(pts) #0.75
      • 我看到这个算法在给定顶点的情况下计算多边形的面积,但是它在哪里计算复杂的外壳?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2019-02-23
      • 2015-08-09
      • 2019-08-22
      • 2014-03-14
      • 2019-07-28
      相关资源
      最近更新 更多