【问题标题】:Designing an algorithm for making shapes设计用于制作形状的算法
【发布时间】:2020-04-11 06:23:17
【问题描述】:

我已经掌握了算法背后的理论,但由于我没有受过正规教育,我无法将其转化为代码。有关该理论的更多信息如下。任何帮助表示赞赏。

make_shape

给定 x 个顶点及其相对于角的坐标(为简单起见,让它相对于左下角)作为函数的参数。

using vertices_t = std::vector< std::pair< double,
                                           double > >;

make_shape( vertices_t const & vertices );
// doesnt need to be a vector of a pair of doubles.
// use anything else, like a valarray of ints if you so choose

作为回报,您将构建一个以三角形(基元)描述形状的对象

using triangles_t = std::vector< std::tuple< std::size_t,
                                             std::size_t,
                                             std::size_t > >;

triangles_t make_shape( vertices_t vertices );
// once again, it does not need to be a vector of a 3 tuple of size_t

理论:任何形状都可以由三角形组成。所需的三角形数等于顶点数减二。

auto && triangles = vertices.size( ) - 2;

算法很简单:取一个顶点和两个相邻的顶点并将它们连接起来。然后,交替增加顶点并将最后一个增加的顶点存储为下一个三个顶点。这将产生一系列组成任何形状的三角形。问题出现在凹形中,选择顶点很重要。

以下是该算法实际运行的一些图片

【问题讨论】:

  • 为什么不直接使用实现这一点的几十个现有开源库之一?
  • 那么,到目前为止,您尝试了哪些方法,有什么问题?除此之外,你不能简单地使用 Delaunay 三角测量吗?
  • @ALX23z 我对此一无所知,我也很享受自己制作东西的挑战。一旦我做了一些事情并且做得很好,我就允许自己使用开源选项:)
  • @Aziuth 我不熟悉“Delaunay 三角测量”。你能告诉我更多吗?到目前为止,我已经尝试完全按照我在屏幕截图中所做的那样做,在屏幕截图中我交替递增/递减并将其存储为索引。它变得多毛,凹形和更复杂的形状。看起来这可能不是组成最小三角形形状的方法
  • @nowi 态度不佳。东西太多了,生命是有限的。避免重新发明轮子。

标签: c++ algorithm


【解决方案1】:

您缺少的部分是“耳朵剪裁算法”,它选择多边形的“耳朵”,这是一个可以按照您描述的方式切断的顶点。保证任何多边形(至少有 4 个顶点)至少有 2 个耳朵;所谓"two ears theorem"

如果你搜索“剪耳算法”,你会得到一堆关于如何或多或少有效地实现它的链接。

例如,这是一些非常清晰的识别耳朵的代码(虽然在 go,所以你必须翻译它):https://github.com/fogleman/triangulate/blob/master/ring.go

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2020-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多