3

幾何学的形状で構成される生のボリューム データのデータセットを作成しようとしています。ポイントは、ボリューム レイ キャスティングを使用して 2D で投影することですが、最初にボリュームを手動で作成します。

ジオメトリは、ボリュームの中央にある Z 軸に沿った 1 つの円柱と、最初の円柱の周りにある 2 つの小さな円柱 (軸の周りの回転から派生) で構成されます。

これまでの私の機能は次のとおりです。

function cyl= createCylinders(a, b, c, rad1, h1, rad2, h2)

% a : data width
% b : data height
% c : data depth
% rad1: radius of the big center cylinder
% rad2: radius of the smaller cylinders
% h1: height of the big center cylinder
% h2: height of the smaller cylinders

[Y X Z] =meshgrid(1:a,1:b,1:c);  %matlab saves in a different order so X must be Y
centerX = a/2;
centerY = b/2;
centerZ = c/2;

theta = 0; %around y
fi = pi/4; %around x

% First cylinder
cyl = zeros(a,b,c);

% create for infinite height
R = sqrt((X-centerX).^2 + (Y-centerY).^2);

startZ = ceil(c/2) - floor(h1/2);
endZ = startZ + h1 - 1;

% then trim it to height = h1
temp = zeros(a,b,h1);
temp( R(:,:,startZ:endZ)<rad1 ) = 255;
cyl(:,:,startZ:endZ) = temp;

% Second cylinder

cyl2 = zeros(a,b,c);

A = (X-centerX)*cos(theta) + (Y-centerY)*sin(theta)*sin(fi) + (Z-centerZ)*cos(fi)*sin(theta);
B = (Y-centerY)*cos(fi) - (Z-centerZ)*sin(fi);

% create again for infinite height
R2 = sqrt(A.^2+B.^2);
cyl2(R2<rad2) = 255;

%then use 2 planes to trim outside of the limits
N = [ cos(fi)*sin(theta) -sin(fi) cos(fi)*cos(theta) ];

P = (rad2).*N + [ centerX centerY centerZ];
T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3);
cyl2(T<0) = 0;

P = (rad2+h2).*N + [ centerX centerY centerZ];
T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3);
cyl2(T>0) = 0;

% Third cylinder
% ...

cyl = cyl + cyl2;

cyl = uint8(round(cyl));

% ...

概念は、最初の円柱が作成され、次に z 軸の値に従って「カット」され、その高さを定義するというものです。もう 1 つの円柱は、関係 A 2 + B 2 = R 2を使用して作成されます。ここで、A と B は、ここで説明されているように R y (θ)R x (φ)を使用して、x 軸と y 軸のみの回転行列を使用して適宜回転されます。

投影を表示するコードを実装し (うまく動作することをテストしました)、シリンダーが無限の高さから「トリミング」されていない場合、円柱は正しい回転をしているように見えるため、これまではすべてが機能しているようです。

円柱と同じように回転さNせたベクトル、別名 z 軸を計算します。[0 0 1]次に、円柱のエッジが必要な同じ距離の 2 つの点を見つけ、その点と法線ベクトルに従ってP平面方程式を計算します。T最後に、その等式に従ってトリムします。または、少なくともそれが私がやっていることだと思います。なぜなら、トリミングの後、私は通常何も得られないからです (すべての値はゼロです)。または、私が実験していたときに得られた最良のことは、円柱をトリミングしたことですが、上部と下部の平面の向きが適切ではありませんでした。

私は幾何学方程式を見ていて、間違いがどこにあるかを見つけることができないので、コードの助けや修正をいただければ幸いです。

編集:これは、作成しようとしているオブジェクトの簡単なスクリーンショットです。円柱はボリューム データでは不透明であることに注意してください。内部はすべて均質な材料と見なされます。

シリンダーのセット

4

1 に答える 1

1

私は代わりに考えます:

T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3);

両方の場所で次のことを試してください。

T = (X-P(1)) + (Y-P(2)) + (Z-P(3));

乗算Nは、そのステップのすぐ上で既に行っている 2 番目の円柱の軸の方向を考慮することです。

于 2013-03-19T10:31:44.740 に答える