MATLABで作成し​た曲線をstlに描き​出したいです

9 次查看(过去 30 天)
HY
HY 2023-10-1
评论: HY 2023-12-1
MATLABでベジエ曲線を導き、その曲線(2次元or3次元)部分のみをstlファイルに描き出し、3dCADでモデル作成に用いたいです。
また、その曲線の縮尺設定(例:グラフ上の数値1=1㎜)をMATLAB内ですることは可能でしょうか。
  3 个评论
Atsushi Ueno
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 オブジェクト
HY
HY 2023-10-3
ご回答いただき誠にありがとうございます。
『何らかの形で線データを面データとして扱う様にするか、線分を扱えるDXF等のフォーマットを採用するか、等の対応が必要です。』こちらの文の内容を実行する方法はUeno様はご存じでしょうか?
また、参考で載せていただいた内容のようにMATLAB内で曲線に肉付けし、STLフォーマットを利用したほうが良いのでしょうか?

请先登录,再进行评论。

采纳的回答

Atsushi Ueno
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
solid MATLAB_1 facet normal -0.50665158 -0.862150908 0 outer loop vertex 0 -2 0 vertex 0.5 -2.29382992 0 vertex 0 -2 1 endloop endfacet facet normal 0.50665158 0.862150908 0 outer loop vertex 0 -2 1 vertex 0.5 -2.29382992 1 vertex 0.5 -2.29382992 0 endloop endfacet facet normal 0.224647418 -0.974440098 0 outer loop vertex 0.5 -2.29382992 0 vertex 1 -2.17856002 0 vertex 0.5 -2.29382992 1 endloop endfacet facet normal -0.224647418 0.974440098 0 outer loop vertex 0.5 -2.29382992 1 vertex 1 -2.17856002 1 vertex 1 -2.17856002 0 endloop endfacet facet normal 0.681694984 -0.731636465 0 outer loop vertex 1 -2.17856002 0 vertex 1.5 -1.71269 0 vertex 1 -2.17856002 1 endloop endfacet facet normal -0.681694984 0.731636465 0 outer loop vertex 1 -2.17856002 1 vertex 1.5 -1.71269 1 vertex 1.5 -1.71269 0 endloop endfacet facet normal 0.814817071 -0.579718173 0 outer loop vertex 1.5 -1.71269 0 vertex 2 -1.00992 0 vertex 1.5 -1.71269 1 endloop endfacet facet normal -0.814817071 0.579718173 0 outer loop vertex 1.5 -1.71269 1 vertex 2 -1.00992 1 vertex 2 -1.00992 0 endloop endfacet facet normal 0.84533757 -0.534232557 0 outer loop vertex 2 -1.00992 0 vertex 2.5 -0.21875 0 vertex 2 -1.00992 1 endloop endfacet facet normal -0.84533757 0.534232557 0 outer loop vertex 2 -1.00992 1 vertex 2.5 -0.21875 1 vertex 2.5 -0.21875 0 endloop endfacet facet normal 0.820128202 -0.572179794 0 outer loop vertex 2.5 -0.21875 0 vertex 3 0.497920007 0 vertex 2.5 -0.21875 1 endloop endfacet facet normal -0.820128202 0.572179794 0 outer loop vertex 2.5 -0.21875 1 vertex 3 0.497920007 1 vertex 3 0.497920007 0 endloop endfacet facet normal 0.696457565 -0.717597961 0 outer loop vertex 3 0.497920007 0 vertex 3.5 0.98319 0 vertex 3 0.497920007 1 endloop endfacet facet normal -0.696457565 0.717597961 0 outer loop vertex 3 0.497920007 1 vertex 3.5 0.98319 1 vertex 3.5 0.98319 0 endloop endfacet facet normal 0.239555582 -0.970882654 0 outer loop vertex 3.5 0.98319 0 vertex 4 1.10655999 0 vertex 3.5 0.98319 1 endloop endfacet facet normal -0.239555582 0.970882654 0 outer loop vertex 3.5 0.98319 1 vertex 4 1.10655999 1 vertex 4 1.10655999 0 endloop endfacet facet normal -0.541710556 -0.840565085 0 outer loop vertex 4 1.10655999 0 vertex 4.5 0.78433001 0 vertex 4 1.10655999 1 endloop endfacet facet normal 0.541710556 0.840565085 0 outer loop vertex 4 1.10655999 1 vertex 4.5 0.78433001 1 vertex 4.5 0.78433001 0 endloop endfacet endsolid MATLAB_1
  2 个评论
Atsushi Ueno
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
999 created by Matlab 0 SECTION 2 ENTITIES 0 LINE 8 0 10 0.0000 20 -2.0000 30 0.0000 11 0.5000 21 -2.2938 31 0.0000 0 LINE 8 0 10 0.5000 20 -2.2938 30 0.0000 11 1.0000 21 -2.1786 31 0.0000 0 LINE 8 0 10 1.0000 20 -2.1786 30 0.0000 11 1.5000 21 -1.7127 31 0.0000 0 LINE 8 0 10 1.5000 20 -1.7127 30 0.0000 11 2.0000 21 -1.0099 31 0.0000 0 LINE 8 0 10 2.0000 20 -1.0099 30 0.0000 11 2.5000 21 -0.2188 31 0.0000 0 LINE 8 0 10 2.5000 20 -0.2188 30 0.0000 11 3.0000 21 0.4979 31 0.0000 0 LINE 8 0 10 3.0000 20 0.4979 30 0.0000 11 3.5000 21 0.9832 31 0.0000 0 LINE 8 0 10 3.5000 20 0.9832 30 0.0000 11 4.0000 21 1.1066 31 0.0000 0 LINE 8 0 10 4.0000 20 1.1066 30 0.0000 11 4.5000 21 0.7843 31 0.0000 0 ENDSEC 0 EOF
HY
HY 2023-12-1
遅くなってしまい申し訳ございません。無事実行することができました!
ありがとうございました。

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 モデルのインポート 的更多信息

产品


版本

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!