可以从X,Y,Z点(非结构化点云)重建2.5D曲面到三角形网格吗?是否有一个库可以为我提供我可以与C#一起使用的库?我找不到任何开放源码的盒子,有这个内置的功能。
第一个选择:这是一个场景。我有一个可以捕捉位置数据的数控系统。我将从一个特定的轴进行扫描,并以特定的间隔进行测量。例如,我穿过X轴,每0.5毫米测量一次。每0.5毫米我就会得到X,Y和Z点。在我完成X轴扫描后,我会移动0.05毫米的Y,然后再扫描X轴。似乎把它变成一个网格应该是非常直接的。一个点总是与8个三角形相交,除了在边上是4和连接点将是已知的。所有X/Y将对齐每0.5毫米。
首选方案:可能需要一个密度估计算法,并且尽可能地告诉我,没有像MatLab这样的东西是不可能的,我不想使用它。
如果我不必以一致的X轴间隔进行测量,那就更好了。激光位移传感器和相关设备将允许我捕捉点数据在50赫兹。我宁愿在这段时间内尽可能多地测量,因为我在X上扫描,但它很有可能X在以前的Y位置将不会对齐。
在上面的选项中,我仍然可以通过创建一个规范化算法来对齐X和Y坐标。
我几乎可以用C#编写任何代码,但我对3D术语知之甚少。所以,如果我用错误的措辞来描述我想要完成的事情,我会提前道歉。
我知道这样的事情对于网通用户来说是非常有用的。一旦我创建了网格,我可以将结果保存到一个STL,我已经知道了这个部分。
发布于 2018-08-13 21:06:25
假设您已经用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数控路由器做了一些类似的事情。很简单。也许已经有软件这样做了--如果不是的话,我会感到惊讶--但是算法是非常基本的。我是一个图形编码器,所以我刚刚建立了自己的。(我不能分享。)
这种方法不要求样本间隔精确,但如果样本接近规则,则会得到更好的结果(更好地逼近采样对象)。
https://stackoverflow.com/questions/51830317
复制相似问题