matlabでの3D視覚化の実現

Matlabでの3次元グラフィックス視覚化の実現と処理

Matlabは、グリッドマップ、サーフェスマップ、等高線などの一般的に使用される方法に加えて、より複雑な3次元およびベクトルオブジェクトを描画するための3次元視覚化関数も提供します。

これらの関数は通常、3次元空間でスカラーおよびベクトルグラフィックスを

構築します。これらの関数によって構築される[b] [color = red]は、単純な表面[/ color] [/ b]ではなくソリッドであるため、3次元が必要です。パラメータとしての次元配列。3次元配列の各次元は座標軸を表し、3次元配列内の点は座標軸グリッドと座標軸上の座標点を定義します。

[b] [color = blue] [size = 4]いわゆるスカラーグラフィック[/ size] [/ color] [/ b]は、V = sqrt(X)などの数式によって決定される3次元グラフィックです。 ^ 2 + cos(Y)^ 2 + Z ^ 2)+ Z、Vが異なる値をとるときの画像。このような暗黙の3Dグラフィックスは、Matlabで直接描画することはできません。興味のあるネチズンは、この投稿の陰関数描画の説明を見ることができます。

描画される関数がスカラー関数の場合、描画関数には4つの3次元配列が必要です。そのうち3つの配列はそれぞれ座標軸を表し、4番目の配列はは、これらの場所のスカラーデータに加えて、通常、X、Y、Z、およびVとして表されます。

[b] [size = 4] [color = blue]いわゆるベクトルグラフ[/ color] [/ size] [/ b]は、グラフが特定の方程式を満たしている一方で、発散などの方向性も持っていることを意味します。 、カール、勾配など。

描画する関数がベクトル関数の場合、6つの3次元配列が必要です。そのうち、3つはそれぞれ座標軸を表し、残りの3つは座標点でのベクトルを表すために使用されます。これらの配列は通常、X、Y、Z、U、V、およびWとして表されます。


Matlabが提供するステレオおよびベクトルの視覚化関数を正しく合理的に使用するには、ステレオおよびベクトルに関連するいくつかの用語を理解する必要があります。

たとえば、発散​​とカールはベクトルプロセスを説明するために使用され、等値面と等値面は立体的な視覚的外観を説明するために使用されます。

より複雑な3次元オブジェクトを生成して処理する場合は、対応する文献を参照して、これらの用語を深く理解する必要があります。



[b] [color = blue]ベクトルステレオ視覚化には、流体力学、空気力学、場の理論、ベクトルなど、かなりの専門的背景があるため、[color = Red]スカラー3D視覚化[/ color]のみを紹介します。興味のあるネットユーザーは、Matlab [/ color] [/ b]のヘルプファイルを直接見ることができます。

以下のコンテンツでは、主に次のコンテンツを紹介します

。2#3次元データの生成方法
3#3次元3次元断面図
4#3 -次元など值面
5#3次元データの平滑化

 

3次元データの生成方法

次の3次元グラフィックスのプロパティを調べます
V = v = f(x、y、z)=(x + y + z)(xy + xz + yz)-10xyz

Vが異なる値をとる場合、次のようになります。異なる[b] [color = red]表面グラフィックス[/ color] [/ b]ですが、[b] [color = red] [/ color] [/ b]の間隔でVを連続値とすると、次に、[b] [color = red]三次元ソリッド[/ color] [/ b]を取得しました。

これは多くの曲面で構成されています[b] [color = red]三次元ソリッド[/ color] [/ b ]これは多くの曲面[b] [color = red] / color] [/ b]で構成されています。これは、Matlabが関連する直接関数を提供しているためです

が、ソリッド全体に関心がない場合もあります[b] [color = red]は特定の表面[/ color] [/ b]にのみ関心があり、問題はここにあります。Matlabの[b] [color = red]は、[/ color] [/ b] 3-の直接機能を提供しません。次元の暗黙的な関数の描画ですが、間接的に取得できます。つまり、関心のある3次元のAサーフェスから切り取ります。[color = blue]これは、Matlabによる3次元のサーフェス(特に暗黙的)の視覚化が必要であることを意味します。最初に3次元で処理されてから、関心のあるものをインターセプトします。[/ color]

上記のスカラー関数を使用して3次元の図形を作成する例を見てみましょう。まず、ソリッドオブジェクトを構築するための座標系を生成する必要があります。
[code] x = 0:0.5:10;
y = x;
z = x;
[X、Y、Z] = meshgrid(x、y、z); [/ code]
上記のコードは、3次元空間でのメッシュグリッド関数の適用を示しています。その中で、XYZは、グリッドを定義する3つの3次元配列であり、3次元グリッドを介したxyzの展開によって形成されます。言い換えると、Xはxをコピーして長さ(y)行と長さ(z)ページの3次元配列に展開します。Yは最初にyを列ベクトルに転置し、次にコピーして展開してlength( x)列と長さ(z)ページの3次元配列; Zは、最初にzを1×1×長さ(z)の3次元ベクトルに変換し、次にそれを長さの3次元配列に展開します。 (y)行とlength(x)列。

次に、3次元配列を持つスカラー関数Vを独立変数として定義する必要があります:
[code] V =(X + Y + Z)。*(X。* Y + X. * Z + Y. * Z)-10 * X. * Y. * Z; [/ code]


OK、[b] [color = blue]これにより、ステレオ視覚化に必要なデータX、Y、Z、Vが取得されます[/ color] [/ b ]、以下は、関心のあるパーツまたはサーフェスを視覚化して処理することです。

 

三次元断面図

2#では、スカラー関数v = f(x、y、z)=(x + y + z)(xy + xz + yz)-10xyzを使用して3次元オブジェクトを定義し、必要なすべてのデータを準備します、を作成するために3次元オブジェクトを視覚化するには、次のコマンドを使用して、3次元オブジェクトのいくつかの断面を表示できます。

V =(x + y + z)(xy + xz + yz)-10xyz = 0の図は、おおよそ次のとおりです。

[align = center] [attach] 1187 [/ attach] [/ align]

[align = center] [attach] 1188 [/ attach] [/ align]


[align = center] [b] [size = 5] [color = blue] 3次元平面インターセプト[/ color] [/ size] [/ b] [/ align ] [コード] slice(X、Y、Z、V、[6 8]、[5 9]、[3 5])%切片x = 6と8、y = 5と9、z = 3と5など
.6断面図xlabel( 'x')
ylabel( 'y')
zlabel( 'z')[/ code]
[align = center] [attach] 1184 [/ attach] [/ align]

この図から、次のことができます。コマンドがus = 6と8、y = 5と9、z = 3と5などのxをインターセプトすることを確認してください。6つの断面図。図の色はVに従って自動的に描画されることに注意してください。




[align = center] [b] [size = 5] [color = blue] 3次元の3次元表面インターセプト[/ color] [/ size] [/ b] [/ align]

上記では、三次元図では、三次元画像では、三次元図の湾曲した断面も表示することができます。[コード] [xs、ys] = meshgrid(x、y);
zs = sin(-xs + ys / 2);
スライス(X、Y、Z、V、xs、ys、zs)%は、正弦関数を使用して3次元図形のセクションをインターセプトします。
つまり、方程式zを満たす表面xlabel( 'x')をインターセプトします。 = sin(-x + y / 2
ylabel( 'y')
zlabel( 'z')
[/ code] [align = center] [attach] 1185 [/ attach] [/ align]

[align = center] [b ] [size = 5] [color = blue]断面の等高線描画[/ color] [/ size] [/ b] [/ align]

スクリーンショットの平面と表面に加えて、等高線スライス関数を使用して等高線を追加することもできます。インターセプトされた平面[コード]スライス(X、Y、Z、V、[7 3]、[5 9]、[3 5])

h = contraslice(X、Y、Z、V、7、[5 9 ]、5);%x = 7、y = 5および9で、z = 5セクションに等高線を追加します
set(h、 'edgecolor'、 'k'、 'linewidth'、1.5)%色と線を設定します等高線の幅
xlabel( 'x')
ylabel( 'y')
zlabel( 'z')[/ code] [align = center] [attach] 1189 [/ attach] [/ align]

 

3次元等値面プロット-3次元陰関数プロット

私たちはいつも数学をくそったれと叱ります。考えられる限り関数は必要ですが、3次元の陰関数の描画

は提供しません実際、Matlabは3を描画する直接関数を提供していません-次元陰関数グラフ。[b] [color = Red]等値面[/ color] [/ b]マップを使用して、

[b] [color = Blue] [size = 4]いわゆる等値面マップを描画できます[/サイズ] [/色] [/ b]、つまり、V = f(X、Y、Z)= C、Cの値が決定されたときの表面図、それは3次元Vの表面のみであり、= 、これは

、固体オブジェクトの断面図以外は何も特別な表面をインターセプトしない3#に相当し、Vの値が特定の表面(等値面)に等しいことを確認します。これも一般的です。Matlabでは、この操作は、delaunay関数に似ており、いくつかの三角形の頂点を返すisosurface()関数を使用して実行できます。等値面関数によって返されたパラメーターをパッチ関数に渡すと、これらの三角形で構成される等値面を描画できます。[コード] [X、Y、Z、V] = flow(13);
fv = isosurface(X、Y、Z、V、-2);%display V = -2等しい値の表面
サブプロット(121)
p =パッチ(fv);
set(p、 'facecolor'、[0.5 0.5 0.5]、 'edgecolor'、 'k');
view(3)


サブプロット(122)のタイトグリッドに等しい
p = patch(shrinkfaces(fv、0.3) );%shrinkfaces関数は表面を縮小することです
set(p、 'facecolor'、[0.5 0.5 0.5]、 'edgecolor'、 'k');
view(3)
軸はタイト
グリッドに等しい[/ code] [align = center] [attach] 1190 [/ attach] [ / align]

一般的な構造を観察するためだけに3次元グラフィックスを表示する場合、データポイントが多すぎると表示速度が低下するため、すべてのデータポイントをプロットする必要はありません。[color = Blue] Matlabのreducevolume()関数とreducepatch()関数を使用すると、グラフを使用して、表示する前にグラフ表示にほとんど影響を与えないデータポイントまたはフラグメントを削除して、グラフ表示の効率を向上させることができます[/色]。


別の例として、3次元の陰関数x ^ 2 + y ^ 2 + z ^ 2 = 5で球を描画します。Matlabは3次元の陰関数グラフを描画するための直接関数を提供しないため、次のようにします。インターセプトには3次元の等値面しか使用できません。等値面の描画は面倒で、得られるグラフィックはあまり美しくありませんが、少なくとも何もないよりはましです

[b] 1、3次元モデルを作成します[/ b]
V = X ^ 2 + Y ^ 2 + Z ^ 2-5;
[b] 2、3次元データを取得[/ b] [コード] [
X、Y、Z] = meshgrid(-10:0.5:10); V = X. ^ 2 + Y. ^ 2 + Z. ^ 2-5; [/ code] [b] 3、等値面を描画[/ b] [code]%x ^ 2 + y ^ 2 + z ^ 2 = 5は、V = 0と同等です
。Facefv= isosurface(X、Y、Z、V、0);%display V = 0などfacep
= patch(fv);
set(p、 'FaceColor'、 '赤'、 'エッジカラー'、 'なし');

カムライト
照明グーロー
軸がタイトに等しい[/ code] [align = center] [attach] 1191 [/ attach] [/ align]

 

3次元データの平滑化

3次元データは、smooth3()関数でフィルタリングすることによって平滑化することもできます[code] data = rand(10,10,10); datas
= Smooth3(data、 'box'、3);%boxは平滑化メソッドです。 Matlabにはいくつかの方法があります。特定の
サブプロット(121)のヘルプを参照してください
。p= ​​patch(isosurface(data、0.5));
patch(isocaps(data、0.5));
isonormals(data、p);
camlight Lighting
phong
axis vis3d off
view(3)
subplot(122)
p = patch(isosurface(datas、0.5));
patch(isocaps(datas、0.5));
isonormals(datas、p);
camlight Lighting
phong
axis vis3d off
view(3) [/ code]上記で使用したisocapsおよびisonormals関数の使用法は次のとおりです
。isocapsはブロック図の外面を生成し、isonormalsは描画されたフラグメントの属性を調整して、表示されるグラフィックが正しい照明効果を持つようにします。

 

おすすめ

転載: blog.csdn.net/ccsss22/article/details/115217880