【问题标题】:Given a polygon & line in It: Find position on line where to split the polygon with perpendicular line to get subpolygon with cetain area给定一个多边形和其中的线:查找在线位置,用垂直线分割多边形以获得具有一定面积的子多边形
【发布时间】:2021-09-21 16:53:01
【问题描述】:

输入:

  • 多边形(您可以将其想象成一条街道:长且相对狭窄)
  • 直线:假定直线位于多边形内并沿着多边形的整个长度延伸
  • 所需区域:生成的输出子多边形必须具有的区域

输出:

  • 输入多边形的子多边形,其面积为输入所需的面积。

Example image of inputs and outputs: input polygon (blue), input line (red), line where the polygon is cut to produce output polygon (green)

输入多边形在给定线的某个点处被切割成两部分,其中一条线(如果可能)垂直于该线。

我希望它清楚我的意思 - 单独描述问题已经相当困难。

我正在使用 shapley 几何库(用于 python)。 多边形被描述为一组表示外边界的点,以及可选的一组描述多边形内部孔的点。 线被描述为点列表。

【问题讨论】:

    标签: python geometry


    【解决方案1】:

    您可以考虑沿红色折线进行二分搜索。

    1. 计算红色折线的总长度 (L)(= 所有的总和 段长度)
    2. 假设我们有一个可以计算点的函数 (p) 和 正常 (n) 对应于沿折线的值 v,其中 0 <= v <= L
    3. 假设我们有一个函数可以计算拆分结果 输入多边形给定由点p 和方向定义的线 矢量n
    4. 执行二分搜索,从left = 0, right = L 开始,在mid(left, right) 定义的线处分割多边形,并将结果区域与目标进行比较。

    这是解决方案的草图:

    fn areaSearch(polygon, polyline, aTarget)
    
      left = 0
      right = length(polyline)
    
      while left < right
        mid = left + (right-left)/2;
        (p,n) = pointNormal(polyline, mid)
        (aLeft, aRight) = split(polygon, p, n)
    
        if aLeft eq aTarget or aRight eq aTarget return (p, n)
    
        if aLeft < aTarget
         right = mid
        else
         left = mid
    

    pointNormal 看起来像:

    fn pointNormal(polyline, v) 
      for each segment of polyline
        len = len(segment)
        if v < len
          p = segment.start + v*unit(segment) 
          n = segment normal
          return (p, n)
        else
          v = v - len
    

    这种方法有几个问题:

    1. 它要求分割线垂直于红色折线的一段。例如,它不考虑在端点处平分相邻线段的线。
    2. 对于给定的目标,可能有两种可能的解决方案,一种是“左”多边形具有所需的面积,另一种是“右”多边形具有所需面积。考虑到问题 1,可能存在一个解决方案,但不存在另一个解决方案。上面概述的解决方案仅考虑“左”多边形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      相关资源
      最近更新 更多