假设您使用 X,Y,Z 捕获了以下点:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
你有一个顶点数组,上面的每个数字都是该数组的索引,生成一个索引数组(每个值都是顶点数组的索引,识别顶点 - 从你的 CNC 探针捕获的点 - 在你的网格中)
// first row of quads - values are indices into the vertex array
0,1,4
1,5,4
1,2,5
2,6,5
2,3,6
3,7,6
// second row...
4,5,8
5,9,8
5,6,9
6,10,9
6,7,10
7,11,10
// etc. ..
在这里识别模式,我们可以说:(对格式表示歉意,注意这是伪代码。我在手机上写了这个,可能有很多错误。)
int cols = 4; // number of points in X
int rows = 4; // number of points in Y
std::vector<int> ti // triangle indices;
// speed things up a bit...
ti.reserve((cols + 1) * (rows + 1));
for(int j = 0; j < rows-1; ++j)
{
for(int i = 0; i < cols-1; ++i)
{
/*
i0--i1
| / |
|/ |
i2--i3
*/
int o = j * cols + i;
int i0 = o; // nw corner of local quad
int i1 = i0 + 1; // ne corner of local quad
int i2 = i0 + cols; // sw corner of local quad
int i3 = i2 + 1; // se corner of local quad
// upper-left triangle in this quad
ti.push_back(i0);
ti.push_back(i1);
ti.push_back(i2);
// lower-right triangle in this quad
ti.push_back(i1);
ti.push_back(i3);
ti.push_back(i2);
}
}
现在,每个三元组ti
表示单个三角形的索引。例如,将的第一部分ti
是
[0,1,4, 1,5,4, 1,2,5, 2,6,5...]
等等
或者,谷歌“从网格生成高度图网格”。
这假设您的探测数据以本文开头的“矩阵”指示的模式排列 - 即,沿 x 探测后,您快速回到另一侧,移动到下一个 X,然后再次探测,所以你得到一个光栅图案。
几年前我为我的 DIY CNC 路由器做了类似的事情。这很简单。可能已经有软件可以做到这一点 - 如果没有,我会感到惊讶 - 但算法非常基本。我是一名图形编码员,所以我只是建立了自己的。(我不能分享。)
这种方法不要求样本在精确的规则间隔,但如果它们接近规则,您将获得更好的结果(采样对象的更好近似)。