MATLABで作成した曲線をstlに描き出したいです
12 views (last 30 days)
Show older comments
MATLABでベジエ曲線を導き、その曲線(2次元or3次元)部分のみをstlファイルに描き出し、3dCADでモデル作成に用いたいです。
また、その曲線の縮尺設定(例:グラフ上の数値1=1㎜)をMATLAB内ですることは可能でしょうか。
3 Comments
Atsushi Ueno
on 1 Oct 2023
作成したベジエ曲線のシンボリック式は多項式なので、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 オブジェクト
Accepted Answer
Atsushi Ueno
on 3 Oct 2023
Moved: Atsushi Ueno
on 8 Oct 2023
> 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 Comments
Atsushi Ueno
on 3 Oct 2023
Moved: Atsushi Ueno
on 8 Oct 2023
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
More Answers (0)
See Also
Categories
Find more on モデルのインポート in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!