algorithm - 如何使用预定义的七巧板形状填充轮廓?

标签 algorithm geometry computational-geometry packing

我对使用这些形状很感兴趣:

tangram

通常是 tangram由 7 个形状(5 个三角形、1 个正方形和 1 个平行四边形)组成。

我想做的是只用七巧板形状填充一个形状,所以在这一点上, 形状的大小和重复应该无关紧要。

这是我手动尝试的:

crescent with tangram shapes

我对如何处理这个问题有点迷茫。

假设我有一条路径(轮廓点的有序列表/数组), 我想我应该尝试做某种三角测量。

有没有三角形限制为 45 度的 Deulanay 三角剖分 直角三角形?

更“粗暴”的方法是添加一堆三角形(45 度)并使用 SAT 用于碰撞检测以“修复”重叠,并希望避免间隙。

因为正方形和平行四边形也可以由三角形(45度)组成,所以我想 会是一个很好的干净几何解决方案,对吧?

如何在任意形状内打包三角形(45 度)?

欢迎提出任何想法。

最佳答案

如果您只使用形状的原始尺寸,一些随意的想法(也许它们可以帮助您找到更好的解决方案):

  • 正如您所指出的,七巧板中的所有形状都可以由例如黄色或粉红色三角形 (d-g-c),因此也请尝试考虑自下而上的方法,例如首先尝试将尽可能多的黄色三角形放入您的形状中,然后尽可能将它们组合成更大的形状。在最坏的情况下,您最终会得到一组这些最小的三角形。

  • 任何类型的非多边形三角剖分(例如您的示例中的半月)可能效果不佳...

  • 您似乎要求形状只能有几个不连续的方向。为了找到这些三角形与给定形状的最佳拟合,我提出了以下近似解决方案:在整个形状上绘制一个三角形网格(即带有对角线的正方形网格),然后取那些完全包含的三角形。这很可能不会为您提供最佳覆盖范围,但您可以在水平和垂直方向上重复移动网格大小的十分之一,看看您是否会找到覆盖原始形状的大部分的东西(或者您本着二进制搜索的精神,可以以原始网格大小的 1/2 然后 1/4 等步进)。

如果您允许对形状进行任意缩放,您可以通过添加越来越小的形状来将任何(合理平滑?)形状近似到任意精度。例如。如果你有一个光栅图像,你可以,例如选择黄色三角形的大小,使它们中的两个在图像上形成一个像素,然后您就可以表示任何此类光栅图像。

关于algorithm - 如何使用预定义的七巧板形状填充轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717178/

相关文章:

algorithm - 找到给定几条对角线的所有多边形面

JavaScript 圆碰撞检测错误

algorithm - 语法高亮/词法分析算法

python - 列表索引越界(街机游戏)

c++ - 表示下/上三角矩阵的有效方法

css - 带尖边和阴影的按钮

matlab - Polyxpoly 返回空矩阵

geometry - 如何计算垂线的坐标?

python - 如何检测矩形中的矩形?

C - 禁用用户已经使用的可能性