私は部分的にそれを解決するために管理。
CameraViewAngle
を変更すると、カーブのサイズが変更されるので、変更しないでください。
CameraPosition
の角度をに設定する代わりに、ax1
と異なるように設定しますが、ターゲットから同じ距離を保ちます。代わりlinkprop
を使用する
、Iはaddlistenerを使用し、ax1
のCameraPosition
が変更されたときax2
のCameraPosition
を設定するコールバック関数を実装します。
読む以下の参照ページ:
0ここで
コードです:
function [pointsQRS, pointsP, pointsT] = VCG (pointsQRS,pointsP,pointsT)
%Clear global varabiles - for testing, we don't want any leftovers of ax1 and ax2.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear global
close all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Set some input data.
pointsQRS = 1:3:78;
pointsP = 1:2:92;
pointsT = 1:1:85;
%global ax1 ax2 h
fig1 = figure('Name','Vektorkardiogram','NumberTitle','off','Color',[0.8 0.8 0.8]);
ax1=subplot(1,2,1);
%Don't use view command, fill all parameters manually.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%view(ax1, 3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Set ax1 parameters values to be same as result as after executing view(ax1, 3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
set(ax1, 'XLim', [-0.5, 2.0], 'YLim', [-1, 3.0], 'ZLim', [-1.5, 1.0]);
set(ax1, 'Position',[0.13, 0.11, 0.3346590909090909, 0.815]);
set(ax1, 'CameraViewAngle', 10.339584907201974);
set(ax1, 'CameraTarget', [0.75, 1.0, -0.25]);
set(ax1, 'View',[-184.4219, -8.9326]);
set(ax1, 'DataAspectRatio', [1, 1.6, 1.0]);
set(ax1, 'PlotBoxAspectRatio', [1, 0.95521169259094, 0.8871534463389812], 'PlotBoxAspectRatioMode', 'Manual');
set(ax1, 'CameraPosition', [-10.664276793913514,-22.800600208737055,10.57531754730548]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ax2 = subplot(1,2,2);
%Set ax2 parameters values to be same as result as after executing view(ax2, 3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
set(ax2, 'XLim', [-0.5, 2.0], 'YLim', [-1, 3.0], 'ZLim', [-1.5, 1.0]);
set(ax2, 'Position',[0.5703409090909091, 0.11, 0.3346590909090909, 0.815]);
set(ax2, 'CameraViewAngle', 10.339584907201974);
set(ax2, 'CameraTarget', [0.75, 1.0, -0.25]);
set(ax2, 'View',[-184.4219, -8.9326]);
set(ax2, 'DataAspectRatio', [1, 1.6, 1.0]);
set(ax2, 'PlotBoxAspectRatio', [1, 0.95521169259094, 0.8871534463389812], 'PlotBoxAspectRatioMode', 'Manual');
set(ax2, 'CameraPosition', [-10.664276793913514,-22.800600208737055,10.57531754730548]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Move the camera of ax2 to be in different position compared to ax1, but keep the same distance from the Target.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cameraTarget = [0.75, 1.0, -0.25];
cameraPosition = [-10.664276793913514,-22.800600208737055,10.57531754730548];
V = cameraPosition - cameraTarget;
newV = V + [-10, 0, 0];
newV = newV/norm(newV)*norm(V);
newCameraPosition = cameraTarget + newV;
set(ax2, 'CameraPosition', newCameraPosition);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Store ax1 and ax2 in figure UserData
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
set(fig1, 'UserData', [ax1, ax2]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Set axes ax1 as active axes.
axes(ax1);
title('Vektorkardiogram')
hold on
grid on
%Move view(3) up
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%view(3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Use plot3 from Matlab example (fill curve with some data).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%t = -3*pi:pi/50:3*pi;st = sin(t)*2;ct = cos(t)*2;plot3(st,ct,t/6)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:size(pointsQRS,1)
if mod(i,2)==0
QRS=plot3(pointsQRS([i-1:i],1),pointsQRS([i-1:i],2),pointsQRS([i-1:i],3),'-g','LineWidth',1);
else
plot3(pointsQRS([i-1:i],1),pointsQRS([i-1:i],2),pointsQRS([i-1:i],3),'Color',[0 0 0],'LineWidth',1);
end
end
for i=2:size(pointsT,1)
if mod(i,2)==0
T=plot3(pointsT([i-1:i],1),pointsT([i-1:i],2),pointsT([i-1:i],3),'-r','LineWidth',1);
else
plot3(pointsT([i-1:i],1),pointsT([i-1:i],2),pointsT([i-1:i],3),'Color',[0 0 0],'LineWidth',1);
end
end
for i=2:size(pointsP,1)
if mod(i,2)==0
P=plot3(pointsP([i-1:i],1),pointsP([i-1:i],2),pointsP([i-1:i],3),'-b','LineWidth',1);
else
plot3(pointsP([i-1:i],1),pointsP([i-1:i],2),pointsP([i-1:i],3),'Color',[0 0 0],'LineWidth',1);
end
end
xlabel('Vx');ylabel('Vy');zlabel('Vz');
mArrow3([1.5 2 -1],[-0.5, 2, -1], 'stemWidth', 0.005,'color','red','facealpha',0.3);
mArrow3([1.5 2 -1],[1.5, -0.5, -1], 'stemWidth', 0.005,'color','red','facealpha',0.3);
mArrow3([1.5 2 -1],[1.5, 2, 1], 'stemWidth', 0.005,'color','red','facealpha',0.3);
text(-0.5, 2, -1, 'Vx','FontSize',12);
text(1.5, -0.5, -1, 'Vy','FontSize',12);
text(1.5, 2, 1, 'Vz','FontSize',12);
%ax2 = subplot(1,2,2); Moved up, axes(ax2) is used instead.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ax2 = subplot(1,2,2);
axes(ax2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
title('Vektorkardiogram')
hold on
grid on
%Move linkprop to the end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%h=linkprop([ax1, ax2],{'CameraPosition', 'CameraUpVector', 'XTick', 'YTick', 'ZTick'});
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:size(pointsQRS,1)
if mod(i,2)==0
QRS=plot3(pointsQRS([i-1:i],1),pointsQRS([i-1:i],2),pointsQRS([i-1:i],3),'-g','LineWidth',1);
else
plot3(pointsQRS([i-1:i],1),pointsQRS([i-1:i],2),pointsQRS([i-1:i],3),'Color',[0 0 0],'LineWidth',1);
end
end
for i=2:size(pointsT,1)
if mod(i,2)==0
T=plot3(pointsT([i-1:i],1),pointsT([i-1:i],2),pointsT([i-1:i],3),'-r','LineWidth',1);
else
plot3(pointsT([i-1:i],1),pointsT([i-1:i],2),pointsT([i-1:i],3),'Color',[0 0 0],'LineWidth',1);
end
end
for i=2:size(pointsP,1)
if mod(i,2)==0
P=plot3(pointsP([i-1:i],1),pointsP([i-1:i],2),pointsP([i-1:i],3),'-b','LineWidth',1);
else
plot3(pointsP([i-1:i],1),pointsP([i-1:i],2),pointsP([i-1:i],3),'Color',[0 0 0],'LineWidth',1);
end
end
%Use plot3 from Matlab example (fill curve with some data).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%t = -3*pi:pi/50:3*pi;st = sin(t)*2;ct = cos(t)*2;plot3(ax2, st,ct,t/6)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xlabel('Vx');ylabel('Vy');zlabel('Vz');
mArrow3([1.5 2 -1],[-0.5, 2, -1], 'stemWidth', 0.005,'color','red','facealpha',0.3);
mArrow3([1.5 2 -1],[1.5, -0.5, -1], 'stemWidth', 0.005,'color','red','facealpha',0.3);
mArrow3([1.5 2 -1],[1.5, 2, 1], 'stemWidth', 0.005,'color','red','facealpha',0.3);
text(-0.5, 2, -1, 'Vx','FontSize',12);
text(1.5, -0.5, -1, 'Vy','FontSize',12);
text(1.5, 2, 1, 'Vz','FontSize',12);
%view(ax1, 3)
%view(ax2, 3)
%Matalb gives warning message: linkaxes requires 2-D axes as input. Use linkprop for generic property linking.
%call linkprop here instead.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%linkaxes([ax1, ax2])
%h=linkprop([ax1, ax2],{'CameraPosition', 'CameraUpVector', 'XTick', 'YTick', 'ZTick'});
%Don't link CameraPosition - it is linked by "listener" implementation
linkprop([ax1, ax2],{'CameraUpVector', 'XTick', 'YTick', 'ZTick'});
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Add "listener", instead of using linkprop
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
addlistener(ax1, 'CameraPosition', 'PostSet', @Ax1CameraPositionCallback);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Display cameratoolbar
cameratoolbar
function Ax1CameraPositionCallback(src, evnt, ~)
ax1 = evnt.AffectedObject;
fig1 = get(ax1, 'Parent');
userData = get(fig1, 'UserData');
ax2 = userData(2);
%Move the camera of ax2 to be in different position compared to ax1, but keep the same distance from the Target.
cameraTarget = get(ax1, 'CameraTarget');
cameraPosition = get(ax1, 'CameraPosition');
V = cameraPosition - cameraTarget;
newV = V + [-10, 0, 0];
newV = newV/norm(newV)*norm(V);
newCameraPosition = cameraTarget + newV;
set(ax2, 'CameraPosition', newCameraPosition);
は 'linkaxes([AX1、AX2を])'呼び出さずに試してみてください。 – Rotem
作品は出ましたが、別の問題が発生しました。左の数字は小さくなりました。 質問の編集を参照してください、最後の画像、左の図/ 3Dカーブが小さくなります。 ピクチャーが他のピクチャーよりも小さい理由が分かりますか? –
投稿したコードを他のマシンで実行可能にしてください。いくつかのデータを 'pointsQRS、pointsP、pointsT'に入れ、' mArrow3'関数への参照を与えます。 – Rotem