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

11 views (last 30 days)
RYUNOSUKE KUBOYAMA
RYUNOSUKE KUBOYAMA on 15 Oct 2018
Answered: 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

Answers (1)

Hirokazu Tanaka
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]);

Categories

Find more on Predictive Maintenance Toolbox in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!