给定一个多边形和其中的线:找到线上的位置,用垂直线分割多边形以获得具有特定面积的子多边形

Given a polygon & line in It: Find position on line where to split the polygon with perpendicular line to get subpolygon with cetain area

输入:

输出:

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)。 多边形被描述为表示外边界的一组点,也可以选择描述多边形内部孔的点集。 线被描述为点列表。

您可以考虑沿红色折线进行二分查找。

  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,可能存在一个解决方案而不存在另一个解决方案。上面草拟的解决方案仅考虑“左”多边形。