【发布时间】: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 态度不佳。东西太多了,生命是有限的。避免重新发明轮子。