【问题标题】:Find the outline of a union of grid-aligned squares找到网格对齐正方形的并集的轮廓
【发布时间】:2010-08-17 10:15:13
【问题描述】:

如何获得使用较小网格块形成的轮廓形状的坐标。

例如,如果我使用 32x32 单位块来构建形状(任何形状)。 那我怎样才能得到形状的整体坐标,包括负空间。

例如: 可以像这样排列块: (每个方块为32x32,坐标参考方块的左下角)

Block 1 - (0,0)
BLock 2 - (32,0)
Block 3 - 64,0)
Block 4 - (64,32)
Block 5 - (64, 64)
BLock 6 - (32, 64)
BLock 6 - (0 64)
Block 7 - (0, 32)

现在您可以看到这将在中间创建一个空白空间。

所以我想知道的是,如何获得上述形状的坐标,以便我得到:

Main Block = (0,0), (96,0), (0,96)
Empty space = (32,32), (64,32), (64,64), (32,64)

有什么数学方法可以解决这个问题吗?

最终我会做复杂的形状。

谢谢

********编辑**** 你好,

如何处理这种情况?

<------------------^<----^
|                  ||    |
V------------------>|    |
<------^          /^|    |
|      |<------^ / ||    |
|      ||      |/  ||    |
V------>V------>V-->V---->

我希望结果是这样的

<-------------------<----^
|                        |
V      ^----------->     |
|      |          /      |
|      <-------^ /       |
|              |/        |
V------>------->--->----->

【问题讨论】:

  • 你想看看集合论。

标签: math geometry polygon


【解决方案1】:

将每个正方形想象成一个由四个逆时针链组成的向量组成的轮廓。

<-----^
|     |
|     |
V----->

所以对于你形状中的所有正方形,取它们的轮廓向量的并集。如果联合中的两个轮廓向量相同但方向相反,则它们相互抵消并从联合中移除。

例如,对于两个并排的正方形,联合是 8 个向量

<-----^<-----^
|     ||     |
|     ||     |
V----->V----->

因为中间的两个垂直向量相消,所以减少到 6 个向量:

<-----<-----^
|           |
|           |
V----->----->

对于您给出的示例,结果将是(取消后):

<-----<-----<-----^
|                 |
|                 |
V     ^----->     ^
|     |     |     |
|     |     |     |
V     <-----V     ^
|                 |
|                 |
V----->----->----->

您只需连接最终简化联合中的向量即可读取轮廓路径。请注意,内部轮廓(“孔”)是顺时针方向的。

【讨论】:

  • 嗨,这听起来很有希望。基本上我正在尝试使用 PHP 数组来做到这一点。我还没有为 PHP 找到一个好的 Vector 类。顺便提一句。知道如何识别顺时针方向的闭环并将它们与逆时针环分开吗?
  • 即使spahes 形状奇特,这种逻辑是否有效?例如。如果第二个形状是矩形(第一个正方形高度的一半)会怎样。
  • @ssdesign,你真的不需要 Vector 类,只需要指示起点和终点的东西,或者起点+方向+长度。您可以在 StackOverflow 中搜索区分顺时针和逆时针的测试。至于奇怪的形状,我猜你可以让向量部分相互抵消 - 所以 1.0up + 0.5down = 0.5up。
  • 嗨,我根本不是数学爱好者 :) 只是我在制作 Web 应用程序时必须处理这种情况。那么有没有可能给我一些关于一些事情的更多提示?我尝试搜索有关顺时针和逆时针的 StackOverflow,但没有得到任何有用的信息。我错过了什么?另外我想知道如何部分取消向量。 --- 谢谢
  • @ssdesign:当最后一个顶点与起始顶点相同时,您知道循环正在关闭。如果两个轮廓没有任何共同的顶点,则它们是分开的。
【解决方案2】:

您可能需要关注Boolean Polygon Operations,在您的情况下是工会。有很多论文涵盖了 2D 布尔多边形运算和构造平面几何,请参阅 Wikipedia:http://en.wikipedia.org/wiki/Boolean_operations_on_polygons

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2012-12-13
    • 2021-10-29
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多