【问题标题】:Calculate Minimum Bounding Rectangle Of 2D Shape By Coordinates通过坐标计算二维形状的最小边界矩形
【发布时间】:2012-01-27 09:10:11
【问题描述】:

我有一个解决方案,它使用空间数据来表示地图上的一组点。我需要使用代表集群范围的坐标来找到可以包含所述点集群的最小边界矩形。

是否存在任何简单的算法来计算这个,或者 C# 中是否有任何内置功能来实现这个。我知道 NetTopologySuite,但不确定如何/是否可以使用它来实现相同的目标。我有一个坐标列表,所以我需要将这个字符串列表传递给它并取出 MBR。

【问题讨论】:

  • 不幸的是,我不知道从哪里开始解决这个问题。我正处于将我的坐标放在字符串类型列表中的阶段,并且不确定如何从这里继续前进。
  • @你有两种类型:轴对齐的边界框;只需找到最小 x/y 和最大 x/y 即可找到。或者你有更复杂的任意方向的边界框(en.wikipedia.org/wiki/Minimum_bounding_box_algorithms)。如果您需要考虑地球的曲率(我希望您不要),这会变得更加复杂,尽管从技术上讲您仍在绘制一个盒子,但它实际上是球体表面的一部分(可能太多了你需要的)
  • 我明白了。我需要一个为盒子提供 4 个坐标的函数。所以两个 X 值和两个 Y 值。您是否建议最好的方法是拆分我的坐标,然后将它们全部比较以找到最低的 X 值和最小的 Y 值?如果我这样做,那么我假设我只会得到一个 minX 值和一个 maxY 值?从这两个数字是否可以计算其他 X 和 Y 值?对不起,如果我看起来有点失落。空间根本不是我的领域。
  • 目前我不必考虑曲率,因为我使用的是英国国家电网,但随着时间的推移它可能会成为一项要求,但现在我只想获得一个工作功能,然后可以从那里继续.

标签: c# algorithm spatial mbr


【解决方案1】:

最简单的解决方案,我假设您最有可能正在寻找的解决方案是计算轴对齐的边界框,这只是找到最小/最大 x 和 y 值,然后构造一个盒子。

我会给你伪代码,因为你还没有发布你的几何图形表达的类型......

type point { float x; float y; }
type box { point topleft; point topright; point bottomleft; point bottomright; }

function bounding_box(points)
{
  xmin = min(points.x)
  xmax = max(points.x)
  ymin = min(points.y)
  ymax = max(points.y)

  return new box{
    topleft = { x = xmin, y = ymax },
    topright = { x = xmax, y = ymax },
    bottomleft = { x = xmin, y = ymin },
    bottomright = { x = xmax, y = ymin }
  };
}

所以给出这些:

point[] points = [[x = -2, y = 0], [x = 1, y = 2], [x = 1, y = 1], [x = -1, y = -2]];
box bounds = bounding_box(points);

以下所有情况都是正确的:

bounds.topleft == [x = -2, y = 2];
bounds.topright == [x = 1, y = 2];
bounds.bottomleft == [x = -2, y = -2];
bounds.bottomright == [x = -1, y = -2];

当然,如果坐标系的顶部坐标最低(例如,像典型的显示器) - 那么您必须反转计算;或者先在对象空间计算结果,然后再转换到逻辑空间。

请注意,我已经为表示所有四个角的框选择了一种类型,以防您将来决定在将来更新为任意对齐的框(尽管出于同样的原因,您可以只使用一个点 + 2 个向量)。

【讨论】:

  • 这正是我所追求的。谢谢。
【解决方案2】:

一种可能的方法,虽然简单,但可能是这样的:

public Rectangle Test(List<Point> points)
{
    // Add checks here, if necessary, to make sure that points is not null,
    // and that it contains at least one (or perhaps two?) elements

    var minX = points.Min(p => p.X);
    var minY = points.Min(p => p.Y);
    var maxX = points.Max(p => p.X);
    var maxY = points.Max(p => p.Y);

    return new Rectangle(new Point(minX, minY), new Size(maxX-minX, maxY-minY));
}

这当然假设您正在寻找一个垂直和水平对齐的矩形。因此,如果您正在寻找尽可能小的矩形,无论它如何旋转,这都不适合您。

【讨论】:

    【解决方案3】:

    http://www.ceometric.com/products/g.html 尝试 G#

    它具有最小面积和最小周长包围矩形以及最小包围圆。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2019-08-11
      • 2012-04-15
      • 2019-01-05
      • 2014-08-13
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多