0

点群を構築した後、各点の法線を取得したいので、組み込みの matlab 関数 surfnorm を使用しましたが、処理に時間がかかります。したがって、誰かが私を助けてくれれば、これをより効果的で効率的な方法で行うことができます。

4

1 に答える 1

3

次のコードが役立つかどうか疑問に思います。ここには 3 つのステップがあります。

  1. 500 個のランダムな間隔の点 (x,y) を作成し、sinc同様の関数を選択した対応する値 z (表面の高さ) を計算します。
  2. 関数を使用してランダムなポイントを再TriScatteredInterpサンプリングします。これにより、最初のサーフェスに「ほぼ対応する」均等にサンプリングされたグリッド上のポイントを取得できます。
  3. そのグリッドの「いくつかのポイント」の法線を計算します (480x640 ポイントがあるため、すべてのポイントで法線を計算すると、信じられないほど密集した「ベクトルの森」が作成されます。「10 番目のポイントごと」にサンプリングすることで、実際に自分が何であるかを確認できます。やっている

私が使用したコードは次のとおりです。

randomX = rand(1,500);
randomY = rand(1,500);
r = 5*sqrt(randomX.^2 + randomY.^2);
randomZ = sin(r) ./ r;

% resample the data:
[xx yy] = meshgrid(linspace(0,1,640), linspace(0,1,480));
F = TriScatteredInterp(randomX(:), randomY(:), randomZ(:));
zz = F(xx, yy);

%% at each point, the normal is cross product of vectors to neighbors
xyz=reshape([xx yy zz],[size(xx) 3]);
xv = 10:30:479; yv = 10:30:639; % points at which to compute normals
dx = xyz(xv, yv+1, :) - xyz(xv, yv, :);
dy = xyz(xv+1, yv, :) - xyz(xv, yv, :);

normVecs = cross(dx, dy); % here we compute the normals.
normVecs = normVecs ./ repmat(sqrt(sum(normVecs.^2, 3)), [1 1 3]);

figure;
quiver3(xx(xv, yv), yy(xv, yv), zz(xv, yv), ...
    normVecs(:,:,1), normVecs(:,:,2), normVecs(:,:,3));
axis equal
view([56 22]);

そして結果のプロット:

ここに画像の説明を入力

于 2013-08-05T18:39:39.077 に答える