MATLABで作成した曲線をstlに描き出したいです
9 次查看(过去 30 天)
显示 更早的评论
MATLABでベジエ曲線を導き、その曲線(2次元or3次元)部分のみをstlファイルに描き出し、3dCADでモデル作成に用いたいです。
また、その曲線の縮尺設定(例:グラフ上の数値1=1㎜)をMATLAB内ですることは可能でしょうか。
3 个评论
Atsushi Ueno
2023-10-1
作成したベジエ曲線のシンボリック式は多項式なので、sym2poly 関数で係数の抽出、polyval関数で多項式の計算が出来ます。ここまで書いて気付いたのですが、STL フォーマットは三角形分割された3次元の面情報を記述するフォーマットなので、ベジエ曲線(2D/3D)の情報をどうやって載せるかが問題になります。何らかの形で線データを面データとして扱う様にするか、線分を扱えるDXF等のフォーマットを採用するか、等の対応が必要です。
P = [0 -2; 1 -3; 2 -2; 3 2; 4 2; 5 0];
syms t
B = bernsteinMatrix(5,t);
bezierCurve = simplify(B*P);
bc1 = sym2poly(bezierCurve(1)); % ベジエ曲線の多項式係数を抽出
bc2 = sym2poly(bezierCurve(2)); % ベジエ曲線の多項式係数を抽出
plot(polyval(bc1,0:0.01:1), polyval(bc2,0:0.01:1)) % 数値解(点群)を得てからプロット
%stlwrite(TR,'test.stl','text'); % TRは triangulation オブジェクトまたは 2 次元 delaunayTriangulation オブジェクト
采纳的回答
Atsushi Ueno
2023-10-3
移动:Atsushi Ueno
2023-10-8
> MATLAB内で曲線に肉付けし、STLフォーマットを利用したほうが良いのでしょうか?
3DCADがSTLフォーマットしか受け付けないのであれば、STLフォーマットを利用した法が良いでしょう
>曲線(2次元or3次元)部分のみをstlファイルに描き出し、3dCADでモデル作成に用いたいです。
リンク先を参考に、自分でもやってみました。XY平面の曲線をZ方向に伸ばして、triangulation 関数で三角形メッシュに区切り、stlwrite 関数でSTLフォーマット形式ファイルを書き出しました。
>その曲線の縮尺設定(例:グラフ上の数値1=1㎜)をMATLAB内ですることは可能でしょうか
MATLABでも可能です。単に頂点リストの数値をスケーリング(係数倍)するなり移動(加減算)すれば良いです。
P = [0 -2; 1 -3; 2 -2; 3 2; 4 2; 5 0];
syms t
B = bernsteinMatrix(5,t);
bezierCurve = simplify(B*P);
bc1 = sym2poly(bezierCurve(1)); % ベジエ曲線の多項式係数を抽出
bc2 = sym2poly(bezierCurve(2)); % ベジエ曲線の多項式係数を抽出
range = 0:0.1:0.9; szrng = size(range); s = szrng(2); h = s/2;
dat = [polyval(bc1,range); polyval(bc2,range); zeros(szrng)]'; % ベジエ曲線の頂点を抽出
P = repmat(dat,2,1); P(size(dat,1)+1:end,3) = 1; % ベジエ曲線の頂点リスト(Z方向にずらしてコピー)
T = repmat([1,2,1;1,2,2],s-1,1) + repelem(0:s-2,3,2)' + repmat([0,0,s;s,s,0],s-1,1); % 三角形分割連結リスト
TR = triangulation(T,P); % 3次元三角形分割データの作成
stlwrite(TR,'test.stl','text'); % STLファイルの作成
type test.stl
2 个评论
Atsushi Ueno
2023-10-3
移动:Atsushi Ueno
2023-10-8
DXFファイルについては、線分の頂点リストをDXFフォーマットに従い出力すれば良いです。MATLABはDXFファイルを扱っていませんが、File Exchangeには同士の作成したDXFファイル作成関数が多数あります。今回の目的(線分データをDXFファイルに出力)に最も近い下記の関数を実行してみました。
P = [0 -2; 1 -3; 2 -2; 3 2; 4 2; 5 0];
syms t
B = bernsteinMatrix(5,t);
bezierCurve = simplify(B*P);
bc1 = sym2poly(bezierCurve(1)); % ベジエ曲線の多項式係数を抽出
bc2 = sym2poly(bezierCurve(2)); % ベジエ曲線の多項式係数を抽出
range = 0:0.1:0.9;
writedxf('temp',polyval(bc1,range),polyval(bc2,range),zeros(size(range))); % DXFファイルの作成
type temp.dxf
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 モデルのインポート 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!