【问题标题】:Formula to tile an irregular shape with a predefined number of squares使用预定义数量的正方形平铺不规则形状的公式
【发布时间】:2012-07-16 14:40:33
【问题描述】:

我有一个定义为矢量的形状。然后我会得到一个数字,它代表我需要在我的形状上平铺多少个相同大小的正方形,在一系列行中。行内每个正方形的 X 坐标不需要与其他行的坐标对齐。我需要确定正方形所需的大小,以及它们在形状(X 和 Y)上的位置,以便完全覆盖形状的内部,并且在周边上,每个正方形的大部分面积都在形状内.

有谁知道我可以用什么公式来计算这个?或者我会通过解决这个问题来获得自己的博士学位吗? :-)

【问题讨论】:

  • 在 ActionScript 中,向量类似于数组,但所有元素必须具有相同的数据类型。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 。您是在告诉我们您有一系列形状吗?或者是其他东西?您尝试过什么来完成这项工作?你有代码要分享吗?
  • 这里有一些代码会很好。困难的部分似乎是“每个正方形的大部分面积都在形状内”。我今天会考虑的。
  • @www.Flextras.com 很难给你代码,它是一个相当复杂的系统,但为了简单起见,让我们排除我从方程中绘制形状的实现。换句话说,不规则形状如何绘制并不重要,重要的是它可以被绘制以及在其中预定义数量的正方形。

标签: algorithm apache-flex math shape


【解决方案1】:

迭代过程的可能解决方案:

初步说明: - 我用符号 <...> 标记我稍后使用的变量名称,如果它是一个数组,我会在方括号中记下变量的维度。 - 在圆括号中,您可以找到通常以“i”作为迭代计数器的迭代段落。

给定:

I1) 二维直边图形的顶点数组 [2,n]:(1:i:2, 1:j:n),因此是一个大小为 2 x n 的整数数组。

I2) 覆盖图形的最大网格元素数: ,所以是一个标量值

I3) 2D OCS(正交坐标系)被视为顶点定位的参考:默认情况下,所有顶点将通过它们自己的值提供 OCS。将其称为前参考,但它并不是真正的变量。

输出:

O1) 提供了最多覆盖给定形状的正方形网格的边长: ,所以是一个标量。

O2) 生成的行数: , 另一个标量

O3) 每个字符串(一行)方格的X值数组,表示第一个方格网格元素的左下角:与1:i:R,其中R是前面提到的输出,所以数算法生成的行数。

O4) 一个整数数组,包含每行网格元素的数量:1:i:R

辅助功能:

//计算覆盖系数

ACF:(平均覆盖因子),计算整个原始形状的面积与生成的所有正方形数组的总和之间的比率(给定正方形的左下角列表加上边长)。

SCF:(单个元素覆盖因子):计算每个单个正方形区域被(重叠)形状覆盖的百分比。这很棘手,但可以通过有限元网格划分样式轻松计算(您可以在线找到网格划分三角形元素技术)。

算法:

1) 定义最小边界框(包含整个形状的第一个正方形)

1.1) 定义原始 OCS 中的最低 Y 形状点:因此是一个标量,表示 OCS0 和 OCS1 之间的垂直偏移量。

1.2) 定义原始OCS中最左边的形状点(顶点之一):

1.3) 用刚性线性变换 T:T(x,y) -> (x-dx, y-dy) 移动形状;现在边界框在新坐标系原点的左下角(这就是将 OCS0 映射到 OCS1 的原因)

1.4) 在OCS1中移动整个图形;

1.6) 在第 0 步计算平均覆盖因子;

注意:这已经是一个解决方案,不是最好的,而是一个数学上可接受的解决方案。

1.7) 检查有多少元素(在这个阶段只有一个)完全包含在形状中,调用它(在第一步中这是零),有多少元素被形状边界完全排除(在第一个步骤为零),以及有多少部分重叠(在第一步中为 1)。请注意,在迭代过程中,这三个数组的长度之和必须等于边界平方细化生成的平方数。

1.8) 从网格中删除所有属于 NFULLOUT(0) 的正方形。在第 0 步,此例程不提供任何结果,因为解决方案数组中只有一个部分覆盖的元素。

2) 循环细化

2.1) 通过RF = M /( QTY(1:R)之和) 计算细化因子

注意:第 2.1 点考虑面积计算中权重为 1 的所有全覆盖元素以及部分元素,更精确的方法是在每个单个部分覆盖正方形上使用 SCF 函数来计算元素的有效权重用于网格面积计算。

2.2) 用L(1) = L(0)/ ​​RF计算新的正方形边长;

2.3) IF(方格数低于允许的方格数),通过重新生成新边的方格矩阵来细化网格。

2.3.1) 检查有多少元素(在此阶段只有一个)完全包含在形状中(在第一步中为零),有多少元素被形状边界完全排除(在第一步中这是零),以及有多少部分重叠(在第一步中,这是 1),其中“i”表示迭代的步骤以进行细化。

2.3.2) 从网格中删除所有属于 NFULLOUT(i) 的正方形。在第 0 步,此例程不提供任何结果,因为解决方案数组中只有一个部分元素。

2.3.4) RF = M /( QTY(1:R)之和) 计算细化因子

2.3.5) 用L(1) = L(0)/RF计算新的正方形边长;

2.3.6) if L(i) > 0 then re-loop from 2) else break.

3) 休息后,分而治之

3.1) 对于网格的每一行,尝试左右移动大约一半边长的整行,计算效率并决定哪个更好。然后你将尝试和验证的那条线移动得更好,再次选择左右边长为 1/4 的长度,依此类推,直到你得到比上一步更低的效率。

注意:仅当您使用 O 和 1 之间的权重对每个单独的部分元素进行加权时,才应用最后一个 divide et impera 部分。如果您将部分覆盖元素视为完全覆盖元素,这不会为您提供任何改进。

最后注:考虑您可以将比例因子应用于 RF,例如,在第一次通过时,比例因子会给您 RF = M,可能会立即使您摆脱约束。每当您获得 RF > 2 时,如果您通常的元素数量在 100-1000 个或更多元素的范围内,则可以对 RF 应用 0.8 因子。

最后说明 2:如果您可以消除正方形应具有所有相同长度的约束,那么它会变得容易得多,而且最重要的是,当您只接近边界时,它会变得更快。

对不起,如果这不是一个真正的公式,但我认为它是让您远离可以从计算分析中获取的复杂网格划分算法的最快元素之一。 我也为不常见的符号道歉。我尽力解释自己,我不习惯标准符号。

【讨论】:

  • 这显然是一个经过充分研究和深思熟虑的答案,但很难理解行话和深奥的符号。您能否解释一下(除其他外)什么是 OCS,以及符号 (1:i:2)、T:T(x,y) -> T(x-dx, y-dy)、QTY(1:R ) 等是什么意思?
  • 对不起,你完全正确.. 我知道我应该使用标准表示法,但我离上学时间太远了。 1:x:R,意味着(在某种 Matlab 符号中)x 在 1 和 R 之间迭代(即在运行时是常数或已知变量)。 OCS 表示正交坐标系。 T 是将点 (x,y) 映射到新坐标点 (x-dx, y-dy) 的两个变量函数的标准数学符号。
  • @Stephen H 我做了一些计算以更好地重塑“您通常的元素数量在 100-1000 个元素的范围内甚至更多”的陈述。实际上,选择起始长度并减少一些第一次迭代的一个很好的改进是计算通过形状顶点的样条的最小半径 MINR,并从 MINR/2.5 或 MINR/3 的边长开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2013-10-28
  • 2016-12-12
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多