Octave GNU倍频程,如何阻止3d轴在交互窗口中旋转时调整大小?

Octave GNU倍频程,如何阻止3d轴在交互窗口中旋转时调整大小?,octave,Octave,问:有没有办法阻止倍频程尝试将轴对象自动适配到一个恒定大小的框中,而使观看比例保持恒定 我喜欢向我的学生展示大量与各种数学/科学主题相关的3D绘图,并在课堂上使用默认的交互窗口(Octave 4.0到Debian amd64存储库)实时旋转图形。问题是由此产生的大小调整会分散对对象/动画轨迹形状的注意力 这里是一个简单的散点图动画,我正在处理,但这适用于所有3d绘图 #!/usr/bin/octave-cli clear all; close all; planetx=[-0.147867

问:有没有办法阻止倍频程尝试将轴对象自动适配到一个恒定大小的框中,而使观看比例保持恒定

我喜欢向我的学生展示大量与各种数学/科学主题相关的3D绘图,并在课堂上使用默认的交互窗口(Octave 4.0到Debian amd64存储库)实时旋转图形。问题是由此产生的大小调整会分散对对象/动画轨迹形状的注意力

这里是一个简单的散点图动画,我正在处理,但这适用于所有3d绘图

#!/usr/bin/octave-cli

clear all;
close all;


planetx=[-0.1478672,  -0.7257694,  -0.1756896,   1.3832219;
 -0.0381809,  -0.7160833,  -0.2610456,   1.3850799;
  0.0737428, -0.6924100,  -0.3444268 ,  1.3831345;
  0.1793219,  -0.6552495,  -0.4251856 ,  1.3774159;
  0.2688712,  -0.6053663,  -0.5026964,   1.3679664;
  0.3311067,  -0.5437714,  -0.5763614,  1.3548404;
  0.3531110,  -0.4716991,  -0.6456154 , 1.3381034;
  0.3219212,  -0.3905812,  -0.7099307,  1.3178316;
  0.2300102,  -0.3020162,  -0.7688217,  1.2941111;
  0.0855329,  -0.2077379,  -0.8218485,  1.2670372;
 -0.0814988,  -0.1095802,  -0.8686203,  1.2367138;
 -0.2318261,  -0.0094427,  -0.9087983,  1.2032523;
 -0.3384457,   0.0907458,  -0.9420979,  1.1667714;
 -0.3929915,   0.1890627,  -0.9682904,  1.1273956;
 -0.3988960,   0.2836267,  -0.9872039,  1.0852552;
 -0.3641642,   0.3726316,  -0.9987242,  1.0404850;
 -0.2977153,   0.4543788,  -1.0027945,  0.9932238;
 -0.2081496,   0.5273076,  -0.9994152,  0.9436139;
 -0.1036023,   0.5900227,  -0.9886429,  0.8917999;
  0.0079838,   0.6413199,  -0.9705888,  0.8379287];

planety=[-0.4466930,  -0.0252958,   0.9659716,  -0.0238017;
 -0.4657149,  -0.1263067,   0.9471212,   0.0520870;
 -0.4508105,  -0.2248822,   0.9208844,   0.1278263;
 -0.4013623,  -0.3190893,   0.8874673,   0.2032115;
 -0.3181219 , -0.4070912,   0.8471345,   0.2780418;
 -0.2041932 , -0.4871833,   0.8002063,   0.3521215;
 -0.0669533,  -0.5578254,   0.7470558,   0.4252601;
  0.0789006,  -0.6176696,   0.6881051,   0.4972739;
  0.2085279,  -0.6655848,   0.6238214,   0.5679859;
  0.2899490,  -0.7006754,   0.5547124,   0.6372265;
  0.2993354,  -0.7222964,   0.4813220,   0.7048344;
  0.2378102,  -0.7300623,   0.4042244,   0.7706562;
  0.1278686,  -0.7238523,   0.3240197,   0.8345477;
 -0.0036336,  -0.7038105,   0.2413281,   0.8963733;
 -0.1357070,  -0.6703412,   0.1567847,   0.9560064;
 -0.2544710,  -0.6241000,   0.0710340,   1.0133298;
 -0.3512399,  -0.5659813,  -0.0152755,   1.0682353;
 -0.4205857,  -0.4971011,  -0.1014962,   1.1206241;
 -0.4590497,  -0.4187770,  -0.1869867,   1.1704064;
 -0.4644300,  -0.3325042,  -0.2711164,   1.2175012];

planetz=[ -2.3139e-02,   4.1378e-02,   2.0503e-04,  -3.4412e-02;
 -3.4756e-02,   3.9440e-02,   2.0468e-04,  -3.2867e-02;
 -4.3806e-02,   3.6728e-02,   2.0433e-04,  -3.1231e-02;
 -4.9452e-02,   3.3297e-02,   2.0398e-04,  -2.9511e-02;
 -5.0867e-02,   2.9217e-02,   2.0363e-04,  -2.7710e-02;
 -4.7267e-02,   2.4568e-02,   2.0328e-04,  -2.5834e-02;
 -3.8071e-02,   1.9444e-02,   2.0292e-04,  -2.3890e-02;
 -2.3288e-02,   1.3946e-02,   2.0256e-04,  -2.1882e-02;
 -4.2578e-03,   8.1806e-03,   2.0220e-04,  -1.9816e-02;
  1.5659e-02,   2.2609e-03,   2.0183e-04,  -1.7700e-02;
  3.1762e-02,  -3.6987e-03,   2.0145e-04,  -1.5537e-02;
  4.0539e-02,  -9.5832e-03,   2.0107e-04,  -1.3335e-02;
  4.1349e-02,  -1.5280e-02,   2.0067e-04,  -1.1099e-02;
  3.5618e-02,  -2.0679e-02,   2.0027e-04,  -8.8346e-03;
  2.5376e-02,  -2.5678e-02,   1.9986e-04,  -6.5487e-03;
  1.2491e-02,  -3.0182e-02,   1.9944e-04,  -4.2464e-03;
 -1.5080e-03,  -3.4104e-02,   1.9901e-04,  -1.9337e-03;
 -1.5389e-02,  -3.7371e-02,   1.9856e-04,   3.8413e-04;
 -2.8122e-02, -3.9918e-02,   1.9810e-04,   2.7015e-03;
 -3.8798e-02,  -4.1699e-02,   1.9762e-04,   5.0131e-03;];

N=size(planetx)
N=N(1,1)

figure('position',[50,50,1000,750]);
h=scatter3(planetx(1,:),planety(1,:),planetz(1,:) , 10*[3,4,5,4], 
[3,4,5,4],'filled');

axis([-2,2,-2,2,-1,1],'square');
set(gca,'fontsize',20)
axis('manual')
#box('off')
#axis('off')
view([15,15]);
hold on;

p1=plot3(planetx(1:20,1),planety(1:20,1),planetz(1:20,1),':')
p2=plot3(planetx(1:20,2),planety(1:20,2),planetz(1:20,2),':')
p3=plot3(planetx(1:20,3),planety(1:20,3),planetz(1:20,3),':')
p4=plot3(planetx(1:20,4),planety(1:20,4),planetz(1:20,4),':')

ans=input('loaded, hit enter to start!')

for i=1:N
    #[AZ,EL]=view();
    set(h, 'xdata', planetx(i,:) , 'ydata', planety(i,:), 'zdata', 
    planetz(i,:))
    title(sprintf('YEAR=%f',2000+i*200/14010 ))

    set(p1,'xdata',planetx(1:i,1),'ydata',planety(1:i,1),'zdata', planetz(1:i,1))
    set(p2, 'xdata', planetx(1:i,2),'ydata',planety(1:i,2),'zdata',planetz(1:i,2))
    set(p3, 'xdata', planetx(1:i,3),'ydata',planety(1:i,3),'zdata',planetz(1:i,3))
    set(p4, 'xdata', planetx(1:i,4),'ydata',planety(1:i,4),'zdata',planetz(1:i,4))
    pause(1)
endfor;
ans=input('hit to close!')

这似乎是旧八度版本的一个bug。 在我的系统(octave 4.2.1-linux)上,它似乎按照您的预期工作


请忽略这些小故障,它们是与我使用的屏幕录像机有关的错误


更新:回应Cris的评论,罗伯特所指的可能是相机在旋转时如何略微“缩小”以容纳整个“盒子”

通过将cameraviewanglemode属性从“自动”更改为“手动”,可以更改此行为。这将导致更平滑的旋转体验,而无需移动摄影机

>> set(gca, 'cameraviewanglemode', 'manual')
视觉比较:

“自动模式”与“手动模式”



其他与“相机”相关的属性也可能很有用。键入
get(gca,'camera')
以获取相关属性的列表。(或者只需查看手册中的默认值等)。

否。通常,每当调用新的绘图命令时,您需要在for循环中指定轴。您使用的是本地数据,因此我无法准确测试您的意思,但我假设当您
设置(h,扩展数据,…)
它会重置轴?在这种情况下,也可以通过此语法设置新轴;只需设置
xlim
ylim
zlim
参数,同时设置
xdata
等。谢谢您,对本地数据感到抱歉,我添加了一些数字以完成模拟。问题不在于重新设置轴限制本身,这是由
axis('manual')
确保的,而
set('xdata')…)
不会创建新的绘图,而只是更改现有轴对象的数据。问题在于,当您通过单击并拖动旋转操作打印窗口时,它会根据观察角度更改外观大小。其效果是,旋转时,它会让您感觉您正在改变与图像的观看距离。这对于最大化使用的窗口区域是有意义的。也许这是旧八度版本的一个错误。。。在我的安装(linux上的octave 4.2.1)中,它可以像您所期望的那样工作。我建议在crunchbang语法中使用
octave
而不是
octave cli
,因为前者默认为gnuplot模式,而后者默认为更通用的qt模式。不确定这是否与您的问题有关。我在我的系统上添加了一个gif,以确认我们讨论的是同一件事。您没有注意到轴在旋转时如何改变大小吗?它试图将框+装饰物放在窗口内,因此您的视角是沿着框对角线的,需要将其显著缩小,即垂直于一个面的视角。也许这就是“你所期望的”,因为MATLAB也有同样的功能,但无论如何它都很烦人。@CrisLuengo啊,现在我明白你指的是什么了。当您向上移动时,它会有点“缩小”,因为它试图将指定的轴限制保持在视图中。你认为这也是罗伯特在说的吗?我以为他说的是轴的大小调整,也就是编程概念本身,而不是视觉意义上的。您可以使用相机选项来控制此操作。我想你特别提到的是cameraviewanglemode属性。这是我读这个问题的第一印象,因为我过去也对它很恼火(使用MATLAB)。但它从未让我感到足够的沮丧,以至于我无法真正找到避免它的方法很酷,这是一个如此简单的解决方案。我必须记住这一点!克里斯,我也是这么说的!塔索斯,这个解决方案正是我想要弄明白的,谢谢!