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

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

채택된 답변

Hernia Baby
Hernia Baby 2022년 3월 8일
편집: Hernia Baby 2022년 3월 8일
曲線上で等間隔な点列に変換がうまく理解できていません
違う回答でしたら申し訳ございません
今回は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
Hernia Baby
Hernia Baby 2022년 3월 8일
편집: Hernia Baby 2022년 3월 8일
編集して追記しております
媒介変数を用いています
nito
nito 2022년 3월 9일
편집: nito 2022년 3월 9일
ご解説いただきありがとうございます.
とても参考になりました.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

Community Treasure Hunt

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

Start Hunting!