MATLAB Answers

0

実行結果の直線を曲線にしたい

Asked by Keiichi Hirayama on 10 Oct 2018
Latest activity Commented on by Hirokazu Tanaka on 13 Oct 2018
sspファイルを用いて行っています 現段階で点を直線で結び「み」と表示されるようになっています。 点を結んだ際の直線を曲線にするにはどうしたらよいでしょうか。
function df_editor
% オブジェクトをマウスで動かすサンプル例
% Figure に各種コールバックを設定
figure('WindowButtonDownFcn',@myBDCallback,'WindowButtonUpFcn',@myBUCallback)
%pos=[50 50; 60 60; 70 70];
%axis([0,100,0,100]); axis square; hold on;
%xlabel('x'), ylabel('y');
%sspファイルの読み込み
po=sspread('mi.ssp');
pos(:,1)=po(:,1);
pos(:,2)=po(:,2);
%-200から200までの座標表示
axis([-200,200,-200,200]); axis square; hold on;
xlabel('x'), ylabel('y');
%img = imread('circle.png'); % 面を表示
for i=1:length(pos)-1
hL(i)=plot(pos(i:i+1,1),pos(i:i+1,2),'k-');
end
for i=1:length(pos)
h(i)=plot(pos(i,1),pos(i,2),'bx');
end
function myBDCallback(src,eventdata)
% WindowButtonDownFcn
% マウスを押したときのコールバック関数
set(src,'WindowButtonMotionFcn',@myBMCallback);
function myBMCallback(src,evnt)
% WindowButtonMotionFcn
% マウスを動かしたときのコールバック関数
Cp = get(gca,'CurrentPoint'); % 座標軸上のマウスの位置を取得
Xf = Cp(1,1); % X 軸上の位置
Yf = Cp(1,2); % Y 軸上の位置
[dp,Ip] = min((pos(:,1)-Xf).^2+(pos(:,2)-Yf).^2) %debug用にコメントアウト
set(h(Ip),'XData',Xf) % ボタンのX軸位置を変更
set(h(Ip),'YData',Yf) % ボタンのY軸位置を変更
if Ip==1
set(hL(Ip),'XData',[Xf,pos(Ip+1,1)]) % ボタンのX軸位置を変更
set(hL(Ip),'YData',[Yf,pos(Ip+1,2)]) % ボタンのY軸位置を変更
pos(Ip,:)=[Xf Yf];
elseif Ip==length(pos)
set(hL(Ip-1),'XData',[pos(Ip-1,1),Xf]) % ボタンのX軸位置を変更
set(hL(Ip-1),'YData',[pos(Ip-1,2),Yf]) % ボタンのY軸位置を変更
pos(Ip,:)=[Xf Yf];
else
set(hL(Ip),'XData',[Xf,pos(Ip+1,1)]) % ボタンのX軸位置を変更
set(hL(Ip),'YData',[Yf,pos(Ip+1,2)]) % ボタンのY軸位置を変更
set(hL(Ip-1),'XData',[pos(Ip-1,1),Xf]) % ボタンのX軸位置を変更
set(hL(Ip-1),'YData',[pos(Ip-1,2),Yf]) % ボタンのY軸位置を変更
pos(Ip,:)=[Xf Yf];
end
drawnow % 強制描画
end
end
function myBUCallback(src,evantdata)
% WindowButtonUpFcn
% マウスを放したときのコールバック関数
set(src,'WindowButtonMotionFcn','');
end
end

  0 Comments

Sign in to comment.

1 Answer

Answer by Hirokazu Tanaka on 12 Oct 2018
Edited by Hirokazu Tanaka on 12 Oct 2018
 Accepted Answer

po=sspread('mi.ssp');
の箇所、sspread 関数は MATLABに入っている関数では無さそうですね? mi.ssp ファイルもないのでサンプルコードを実行できませんが、、要は各点を直線で結ぶのではなく、滑らかに繋いでプロットされたいということですか?
% 元データ x, y 間をスプライン補完し
% 各点を"滑らか"にプロットするサンプルコード
% もともとのデータ5点
x = rand(5,1);
y = rand(5,1);
plot(x,y,'r-o'); % プロット
hold on
% 上の5点のデータを最初の点 (x(1),y(1)) を起点とした
% 距離に対する関数と考えて、距離を細かく区切り補完します。
dx = diff(x);
dy = diff(y);
% 各点の x(1), y(1) からの距離
dist = cumsum(sqrt(dx.^2 + dy.^2));
dist = [0; dist];
% N個均等に区切った距離で内挿します。
N = 100;
newdist = linspace(0,max(dist),N)';
newx = interp1(dist,x,newdist,'spline'); % スプライン補間
newy = interp1(dist,y,newdist,'spline'); % スプライン補間
% プロット
plot(newx,newy,'b-o');
hold off
legend({'元データ','滑らかに繋いだ点'})

  13 Comments

Hirokazu Tanaka on 13 Oct 2018
はい。添付して頂いた mat ファイルに入っている po のデータを使うと、添付画像のような結果になります。
わかりました。
本当にありがとうございます。
もしよろしければ この続きでわからないことがあった時はまた質問させてください。
Hirokazu Tanaka on 13 Oct 2018
ぜひぜひ。面白そうなことをされていますね。 新しい質問もお待ちしてますー。

Sign in to comment.