2017-04-18 32 views
0

enter image description hereあなたが見ることができるように図

の内側にカーブを移動、最初の写真で、私は同じカーブ位置で2つの同じ2つのサブプロットを、持っています。しかし、私はサブプロットの1つのカーブ位置/ビュー角度を変更する必要があります(左または右の場合は問題ありません)。唯一の作業コマンドはCameraViewAngleですが、両方とも変更されていますが、私はなぜか分かりませんし、それぞれ別々に変更する必要があります。 enter image description here 画像2のように、両方の視野角が変わります。私はむしろカーブの位置だけを狂わせたいと思う。

私が使用しているコードは次のとおりです。

function [pointsQRS, pointsP, pointsT] = VCG (pointsQRS,pointsP,pointsT) 


global ax1 ax2 h 

figure('Name','Vektorkardiogram','NumberTitle','off','Color',[0.8 0.8 0.8]) 
ax1=subplot(1,2,1) 
set(ax1,'Position',[0.10,0.11,0.3346590909090909,0.815],'CameraPosition', 
[50.197132152696216,49.50150052184264,-7.57531754730548],'CameraTarget', 
[0.4, 0.7, -0.33],'View',[-184.4219, -8.9326],'CameraViewAngle', 
[9.256133109732078]) 

title('Vektorkardiogram') 
hold on 
grid on 
view(3) 

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) 
set(ax2,'Position',[0.565,0.11,0.33465909090909096,0.815],'CameraPosition', 
[-13.197132152696216,-59.50150052184264,10.57531754730548]) 

title('Vektorkardiogram') 
hold on 
grid on 
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 



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); 


linkaxes([ax1, ax2]) 

私はそれがGoogleの段ボールを使用して3D立体視を実現するために、それを変更する必要があります。 ご協力いただきありがとうございます!

PS:例3と同じようにしたいです。enter image description here 3つの3Dカーブは接続されていません。接続されていれば、一方が移動している間はもう一方は同じように動いた。

enter image description here

+0

は 'linkaxes([AX1、AX2を])'呼び出さずに試してみてください。 – Rotem

+0

作品は出ましたが、別の問題が発生しました。左の数字は小さくなりました。 質問の編集を参照してください、最後の画像、左の図/ 3Dカーブが小さくなります。 ピクチャーが他のピクチャーよりも小さい理由が分かりますか? –

+0

投稿したコードを他のマシンで実行可能にしてください。いくつかのデータを 'pointsQRS、pointsP、pointsT'に入れ、' mArrow3'関数への参照を与えます。 – Rotem

答えて

0

私は部分的にそれを解決するために管理。

CameraViewAngleを変更すると、カーブのサイズが変更されるので、変更しないでください。

CameraPositionの角度をに設定する代わりに、ax1と異なるように設定しますが、ターゲットから同じ距離を保ちます。代わりlinkpropを使用する

、Iはaddlistenerを使用し、ax1CameraPositionが変更されたときax2CameraPositionを設定するコールバック関数を実装します。

読む以下の参照ページ:


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); 
+0

私はおそらく誤解を犯した、私は別々のコントロール、同じコントロール、カーブの視野角を変更する必要はありません。 私はあなたの提案をしました、それは接続されていますが、再び、左の3Dカーブは小さく、移動中にサイズが変わります。 PS:同じサイズを維持し、接続を維持し、カーブの位置/視野角を変更する必要があります。 –

+0

完全なコードサンプルを実行しようとしましたか? – Rotem

+0

はい、私はそれを試しました。 –