2次元平面上で軸方向​に等間隔な曲線(点列​)を,曲線上で等間隔​な点列に変換する方法

下図のように2次元配列で高さを表現したサーフェスモデルに対して断面形状(点列)を取得し,ロボットのツール先端軌跡の指令として利用したいと考えています.
2次元上で横軸方向に等間隔な点列を,曲線上で等間隔な点列に変換するにはどういった方法が考えられるでしょうか?
※モデルはある程度簡単な機械部品(自由曲面と一部平面を含む)を十分細かい格子で分割しているものを想定しています.
※軌跡の誤差は気にせず,簡単に変換する方法があればと思っています.

 Accepted Answer

Hernia Baby
Hernia Baby on 8 Mar 2022
Edited: Hernia Baby on 8 Mar 2022

1 vote

曲線上で等間隔な点列に変換がうまく理解できていません
違う回答でしたら申し訳ございません
今回はx平面でスライスカットし、3次元上に載せます
まずはサンプルを peaks で作成します
clc,clear,close all;
[x,y,z] = peaks(100);
指定した x から最も近い x平面を切り出します
xq0 = -0.3;
[~,xidx] = min((min(abs(x - xq0))));
xq = x(:,xidx);
yq = y(:,xidx);
zq = z(:,xidx);
図示します
f = surf(x,y,z,'FaceColor',[1 1 1]*.7,'FaceAlpha',.8, ...
'EdgeColor',[1 1 1]*.4,'EdgeAlpha',.4);
xlabel 'x'
ylabel 'y'
zlabel 'z'
title(sprintf('Select: X_q = %g\nNearest x_q = %g',xq0,xq(1)))
hold on
plot3(xq,yq,zq,'-r','LineWidth',.7)
おまけで切り取った部分を表示します
figure
plot(yq,zq,'r')
xlabel 'y'
ylabel 'z'
title(sprintf('Select: X_q = %g\nNearest x_q = %g',xq0,xq(1)))
■追記事項
ここから追記事項になります
線分距離 r を媒介変数にして、等間隔になるように線形補間します
をここでは計算します
累積和は cumsum 関数を参照ください
dr = sqrt((diff(yq)).^2+(diff(zq)).^2);
r = [0; cumsum(dr)];
drp刻みでypとzpを線形補間させます
drp = 2;
rp =(0:drp:r(end))';
yp = interp1(r,yq,rp);
zp = interp1(r,zq,rp);
ここで r と y/z の関係を見てみましょう
figure
subplot(1,2,1)
plot(r,yq,'--r',rp,yp,'ok')
xlabel 'r'
ylabel 'y'
subplot(1,2,2)
plot(r,zq,'--r',rp,zp,'ok')
xlabel 'r'
ylabel 'z'
r に対して等間隔になっていることがわかります
では最後に再プロットします
figure
plot(yq,zq,'--r',yp,zp,'ok')
xlabel 'y'
ylabel 'z'

3 Comments

nito
nito on 8 Mar 2022
Edited: nito on 8 Mar 2022
ご回答いただきありがとうございます.
>曲線上で等間隔な点列に変換がうまく理解できていません
説明が不十分で申し訳ありません.
面から切り取った点列を元に,任意の間隔で新たな点列を生成したいという意味でした.
(曲線と言っていましたが,実際は点を結んだ折れ線を"真"として十分です)
誤差を考慮すると,おそらく断続的な箇所で点列を分割して複数のパラメトリック曲線で近似するような処理になるかと思うのですが,
今回は大まかに断面上をなぞれるだけで問題ないため(折れ線上で点を打ちなおすような処理でも可),
簡単に利用できそうなmatlab関数等について質問させていただいた次第です.
Hernia Baby
Hernia Baby on 8 Mar 2022
Edited: Hernia Baby on 8 Mar 2022
編集して追記しております
媒介変数を用いています
nito
nito on 9 Mar 2022
Edited: nito on 9 Mar 2022
ご解説いただきありがとうございます.
とても参考になりました.

Sign in to comment.

More Answers (0)

Categories

Find more on 内挿 in Help Center and File Exchange

Asked:

on 8 Mar 2022

Edited:

on 9 Mar 2022

Community Treasure Hunt

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

Start Hunting!