MATLAB Answers

0

制御点の2重点、3重​点の識別し違う記号に​するやり方

Asked by RYUNOSUKE KUBOYAMA on 15 Oct 2018
Latest activity Answered by Hirokazu Tanaka on 16 Oct 2018
sspファイルを用いて行っています現段階で点を直線で結び「み」と表示されるようになっています。その中で制御点が2重点や3重点になっておりマーカーで識別できるようにしたいのですがどうしたらよいでしょうか。
function df_editor
% オブジェクトをマウスで動かすサンプル例
% Figure に各種コールバックを設定
figure('WindowButtonDownFcn',@myBDCallback,'WindowButtonUpFcn',@myBUCallback)
axis([-200,200,-200,200]); axis square; hold on;
xlabel('x'), ylabel('y');
po=sspread('mi.ssp');
pos(:,1)=po(:,1);
pos(:,2)=po(:,2);
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),'bs');
end
for i=1:length(pos)
h(i)=plot(pos(i,1),pos(i,2),'bo');
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 16 Oct 2018

こちらのエントリー( 実行結果の直線を曲線にしたい )と似た状況ですね。
すっとしたコードが書ければよかったのですが、思いつきませんでした。実直にそれぞれの点が重複しているか否かをチェックして、色分けしてプロットするのが良いかと思います。
単純ですが、(1,2) だけが重複する 5点 に対して実行してみます。そのまま使えると思いますので試してみてください。
x = [1,2;1,2;2,1;3,2;2,2];
[C,ia,ic] = unique(x,'rows'); % x の各行を見て、ユニークな点を抽出 C
a_counts = accumarray(ic,1); % C に含まれるユニークな点がそれぞれ何回登場するかをカウント
idxunique = a_counts == 1; % 1 回しか登場しない(重複無し)な点を検出
plot(C(idxunique,1),C(idxunique,2),'xr'); % 重複無しを赤でプロット
hold on
plot(C(~idxunique,1),C(~idxunique,2),'^b'); % 重複有りを青でプロット
hold off
legend({'重複ナシ','重複アリ'});
xlim([0,4]); % 結果が見やすいように表示範囲変更
ylim([0,3]);

  0 Comments

Sign in to comment.