m×n行列で表現される表面形状の形状偏差

下図のように2次元配列で表現された2つの表面形状の形状偏差を計算したいと考えています.
(偏差は「形状Aの頂点→形状Bの面」または「形状Aの頂点→形状Bの頂点」間の符号付距離を想定してます)
何か良い方法はありますでしょうか?

 采纳的回答

Atsushi Ueno
Atsushi Ueno 2022-3-23
编辑:Atsushi Ueno 2022-3-23
回答の例と図示は2次元で進めます。下記のグラフで一目瞭然と思います。3次元でも同じです。
x = (0:pi/20:pi)';
A = sin(x); % Aは正弦波(青い太線)
B = A + rand(size(x)) - 0.5; % BはAにランダムな偏差を乗せた波形(オレンジの太線)
plot(x,A,'o-',x,B,'o-','LineWidth',2); hold on;
[k,dist] = dsearchn([x A],[x B]);
dist = dist .* sign(B-A(k)); % 距離は符号無し⇒y軸方向の大小関係で符号をつける
line([x';x(k)'],[B';A(k)']); % 形状Aの頂点→形状Bの頂点に向け細線を引く
dist' % 偏差「形状Bの頂点→形状Aの頂点」間の符号付距離を想定してます)
ans = 1×21
0.2259 -0.1620 0.1144 0.0353 -0.2205 -0.1621 0.3297 0.1693 -0.0196 -0.3136 -0.1617 0.0585 0.2891 0.4660 -0.2704 0.1214 0.0969 0.0374 -0.3454 -0.0062 -0.0593

7 个评论

Hernia Baby
Hernia Baby 2022-3-23
最近傍距離だと横軸0.5付近のように、一つの点に対して複数の距離が構成されると思うのですが、どっちがいいんでしょうかね? にしても最近傍距離て、これでいけるんですね おもしろい…!
Atsushi Ueno
Atsushi Ueno 2022-3-23
質問文の形状Aと形状Bが逆になってしまいましたが、相互に置き換えて考えると同じ事です。
Atsushi Ueno
Atsushi Ueno 2022-3-23
他に気にしている事
①質問にはありませんが、偏差の二乗和が最短となるような形状Aと形状Bの相対位置も求める必要があるのかなとおもいました。
回答の最近傍点探索 dsearchn関数は(未確認ですが)3次元の大規模なメッシュだと時間が掛かるかもしれません。「ある程度xy座標の近い点が最短距離になるはずだ」という前提の元で上記リンクの近傍処理を使えば、より高速な探索が出来るのではないかと想定します。
Atsushi Ueno
Atsushi Ueno 2022-3-23
@Hernia Babyさん その点が気になったので、自分の解釈で回答しました。
いっぬさんの回答は同一インデックスでもxy座標が異なるメッシュを想定したのだと認識しました。なので偏差も単にA-Bではなくユークリッド距離を求めたという事ですよね。
自分は最初「単にA-Bで良いやんけ」と思ったのですが、最短距離という事は必ずしもインデックスの同じ点ではないのだろうなと考えを改めた次第です。
nito
nito 2022-3-23
编辑:nito 2022-3-24
お二人ともご回答いただきありがとうございます.
dsearchnでの最近傍探索が自分のやりたいことに近かったので,こちらを使って進めていきたいと思います.(実際に扱いたい形状は下図のように立壁部を含むため,後処理を追加するか形状の点群を取り直すかで対処してみようと思います)
追加で一点お聞きしたいのですが,ポリゴンモデルに対して最近傍の面を探索することは可能でしょうか?
Atsushi Ueno
Atsushi Ueno 2022-3-26
「最近傍の面」とは何でしょう。上記リンク先でいうとポリゴン間の最短距離を求める事でしょうか?
nito
nito 2022-3-28
「点からの距離が最短になるポリゴンとその時の最短距離を求めたい」という意味です.「ある程度xyz座標の近い点が最短距離になるはずだ」という前提で,全探索ではなく,評価するポリゴンを絞って計算したいと考えています

请先登录,再进行评论。

更多回答(1 个)

Hernia Baby
Hernia Baby 2022-3-22
编辑:Hernia Baby 2022-3-22
点数が一緒であるなら、三平方の定理は使えませんか?
clc,clear;
[X,Y,Z] = peaks(50);
X1 = X + 0.1*randi([-1 1],size(X));
Y1 = Y + 0.1*randi([-1 1],size(Y));
Z1 = Z;
Z1(10:20,10:20) = Z1(10:20,10:20) + randi([-1,1],size(Z1(10:20,10:20)));
surf(X,Y,Z,'EdgeColor','none')
colormap('gray')
hold on
scatter3(X1,Y1,Z1,'red','x')
距離を算出して各格子点でどれだけ離れているかをプロットします
R = sqrt((X-X1).^2+(Y-Y1).^2+(Z-Z1).^2);
figure
surf(R,'EdgeColor','none')
view(2)
xlabel 'xの点数'
ylabel 'yの点数'
追記:符号
おそらくz軸で正負判定を決めているのでしょうか
それでしたら以下のようになります
R = R*sign(Z-Z1);
figure
surf(R,'EdgeColor','none')
view(2)
xlabel 'xの点数'
ylabel 'yの点数'

类别

帮助中心File Exchange 中查找有关 基本的な多角形 的更多信息

Community Treasure Hunt

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

Start Hunting!