如何将 delaunay 三角剖分转换为 .stl(立体光刻)格式?

how to convert delaunay triangulation to .stl (stereolithography) format?

我找到了几种工具,可以将 MATLAB 中的 isosurface - class 或 meshgrid 数据转换为 STL 格式。示例包括 stlwrite and surf2stl . What I can't quite figure out is how to take a delaunayTriangulation 对象并使用它创建 STL 文件或将其转换为等值面对象。
根本问题是我从不规则多边形的 N×2 边界点数组开始,所以我没有任何简单的方法来生成 xyz 网格。如果有办法将边界列表转换为内部区域的等值面(我只需要恒定的 Z 高度),那也可以解决我的问题。
否则,我需要一些方法将 delaunayTriangulation 对象转换为引用的 MATLAB FEX 工具可以处理的对象。

编辑以回应 Ander B 的建议:

我验证了我在 MATLAB 中的三角化集是一个二维扇形圆。但是,当我将数据提供给 stlwrite 并导入到 Cura 时,我遇到了一场灾难 - 直角三角形或从所需位置旋转 pi,或者更糟。这是 stlwrite 的错误,还是 Cura 对某些意外值敏感,或者两者兼而有之,我无法判断。这是最初作为光盘开始的内容: 例如,这里有一组定义圆扇区的点。我可以从这些数据成功创建 delaunayTriangulation 对象。

>> [fcx1',fcy1']
ans =
  100.4563   26.9172
   99.9712   28.6663
   99.4557   30.4067
   98.9099   32.1378
   98.3339   33.8591
   97.7280   35.5701
   97.0924   37.2703
   96.4271   38.9591
   95.7325   40.6360
   95.0087   42.3006
   94.2560   43.9523
   93.4746   45.5906
   92.6647   47.2150
   91.8265   48.8250
   90.9604   50.4202
   90.0666   52.0000
   89.1454   53.5640
   88.1970   55.1116
   87.2217   56.6425
   86.2199   58.1561
   85.1918   59.6519
   84.1378   61.1297
   83.0581   62.5888
   81.9531   64.0288
   80.8232   65.4493
   79.6686   66.8499
   78.4898   68.2301
   77.2871   69.5896
   76.0608   70.9278
   74.8113   72.2445
   73.5391   73.5391
   72.2445   74.8113
   70.9278   76.0608
   69.5896   77.2871
   68.2301   78.4898
   66.8499   79.6686
   65.4493   80.8232
   64.0288   81.9531
   62.5888   83.0581
   61.1297   84.1378
   59.6519   85.1918
   58.1561   86.2199
   56.6425   87.2217
   55.1116   88.1970
   53.5640   89.1454
   52.0000   90.0666
   50.4202   90.9604
   48.8250   91.8265
   47.2150   92.6647
   45.5906   93.4746
   43.9523   94.2560
   42.3006   95.0087
   40.6360   95.7325
   38.9591   96.4271
   37.2703   97.0924
   35.5701   97.7280
   33.8591   98.3339
   32.1378   98.9099
   30.4067   99.4557
   28.6663   99.9712
   26.9172  100.4563
   25.1599  100.9108
   23.3949  101.3345
   21.6228  101.7274
   19.8441  102.0892
   18.0594  102.4200
   16.2692  102.7196
   14.4740  102.9879
   12.6744  103.2248
   10.8710  103.4303
    9.0642  103.6042
    7.2547  103.7467
    5.4429  103.8575
    3.6295  103.9366
    1.8151  103.9842
         0  104.0000
   -1.8151  103.9842
   -3.6295  103.9366
   -5.4429  103.8575
   -7.2547  103.7467
   -9.0642  103.6042
  -10.8710  103.4303
  -12.6744  103.2248
  -14.4740  102.9879
  -16.2692  102.7196
  -18.0594  102.4200
  -19.8441  102.0892
  -21.6228  101.7274
  -23.3949  101.3345
  -25.1599  100.9108
  -26.9172  100.4563
         0         0

STL只是一种在内存中存储网格信息的格式,因此,如果你有一个网格,你就有了数据,你只需要使用正确的格式将它写入内存。

看来您将顶点和面输入 stlwrite 函数作为

stlwrite(FILE, FACES, VERTICES);

并且 delaunayTriangulation 输出为您提供了一个可以轻松访问此数据的对象,对于对象 DTDT.Points 是顶点,DT.ConnectivityList 是面孔。

您可以在链接的文档中阅读更多相关信息。

根据 Ander B 的回答,这里是完整的序列。这些步骤确保即使是凹多边形也能得到正确处理。

从包含所有 xy 坐标的两个向量开始。那么:

% build the constraint list
constr=[ (1:(numel(x)-1))' (2:numel(x))' ; numel(x) 1;];
foodel = delaunayTriangulation(x',y',constr);
% get logical indices of interior triangles
inout = isInterior(foodel);

% if desired, plot the triangles  and the original points to verify.
%  triplot(foodel.ConnectivityList(inout, :),...
    foodel.Points(:,1),foodel.Points(:,2), 'r')
% hold on
%  plot(fooa.Points(:,1),fooa.Points(:,2),'g')

% now solidify
%  need to create dummy 3rd column of points for a solid
point3 = [foodel.Points,ones(numel(foodel.Points(:,1)),1)];
% pick any negative 'elevation' to make the area into a solid
[solface,solvert] = surf2solid(foodel.ConnectivityList(inout,:),...
    point3, 'Elevation', -10);  

stlwrite('myfigure.stl',solface,solvert);

我已经成功地将一些 'ugly' 凹多边形转换为 Cura 很乐意将其转换为 gCode 的 STL。