필터 지우기
필터 지우기

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

조회 수: 14 (최근 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!