MATLAB Answers

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

33 views (last 30 days)
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.

Accepted Answer

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

Sign in to comment.

More Answers (0)