2017-04-18 85 views
0

enter image description here移动的人物

内部的曲线可以看到,第一张图片,我有两个次要情节,两个相同,具有相同的曲线位置。但是我需要改变其中一个子图的曲线位置/视角(如果左边的或右边的都不重要)。唯一的工作命令是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]) 

我需要去改变它,以达到使用谷歌纸板3D立体视图。 非常感谢您的帮助!

PS:比如我想实现的东西如图片3 enter image description here 但是在画面的三个3D曲线不连接,通过连接我的意思是,虽然我与他们的一个动,另外一个会以同样的方式移动。

enter image description here

+0

尝试没有调用'linkaxes([AX1,AX2])'。 – Rotem

+0

解决问题,但发生了另一个问题,左图比较小。 查看问题中的编辑,最后一张图片,左图/ 3D曲线更小。 你知道为什么picutre比另一个小吗? –

+0

您能否让您的发布代码在其他机器上可执行?将一些数据放在'pointsQRS,pointsP,pointsT'中,并引用'mArrow3'函数。 – Rotem

回答

0

我设法部分地解决它。

更改CameraViewAngle,修改曲线的大小,所以我决定不加修改。

不是设置角度,而是设置的CameraPositionax1不同,但保持与目标的距离相同。

代替使用linkprop的,我用addlistener,和实施时的ax1CameraPosition被修改,设置ax2CameraPosition的回调函数。

阅读下列参考页:


下面是代码:

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

是的,我试过了。 –