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

조회 수: 16 (최근 30일)
Keiichi Hirayama
Keiichi Hirayama 2018년 10월 10일
댓글: Hirokazu Tanaka 2018년 10월 13일
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

채택된 답변

Hirokazu Tanaka
Hirokazu Tanaka 2018년 10월 12일
편집: Hirokazu Tanaka 2018년 10월 12일
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
Keiichi Hirayama
Keiichi Hirayama 2018년 10월 13일
わかりました。
本当にありがとうございます。
もしよろしければ この続きでわからないことがあった時はまた質問させてください。
Hirokazu Tanaka
Hirokazu Tanaka 2018년 10월 13일
ぜひぜひ。面白そうなことをされていますね。 新しい質問もお待ちしてますー。

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Subspace Methods에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by