Matlab中的mArrow3函数表现得很奇怪

时间:2017-03-20 14:32:58

标签: matlab matlab-figure figure

enter image description here

如图所示,我正在使用mArrow3功能来显示平面的方向。 但是,有时任何飞镖都表现得很奇怪。

我正在使用的代码:

drawnow;
xExt = abs(diff(get(gca, 'XLim')));
yExt = abs(diff(get(gca, 'YLim')));
zExt = abs(diff(get(gca, 'ZLim')));
mArrow3([0 0 0],[xExt / 1, 0, 0], 'lineWidth', 2,'color','red','facealpha',  0.1);
mArrow3([0 0 0],[0, yExt / 1, 0], 'lineWidth',  2,'color','red','facealpha',0.1);
mArrow3([0 0 0],[0, 0, zExt / 1], 'lineWidth',  2,'color','red','facealpha',0.1);


text(xExt, 0, 0, 'Vx','FontSize',12);  
text(0, yExt, 0, 'Vy','FontSize',12); 
text(0, 0, zExt, 'Vz','FontSize',12);

你能否就这个问题给我任何暗示?

1 个答案:

答案 0 :(得分:1)

根据mArrow3MATLAB FEX)的内联文档,控制线条外观的三个属性是:

% properties: 'color':      color according to MATLAB specification
%                           (see MATLAB help item 'ColorSpec')
%             'stemWidth':  width of the line
%             'tipWidth':   width of the cone 

如您所见,'lineWidth'不是其中一种选择。要理解为什么看到上述行为,可以查看函数定义,看看如果函数调用中没有传递这些值会发生什么:

%% default parameters
if ~exist('stemWidth','var')
    ax = axis;
    if numel(ax)==4
        stemWidth = norm(ax([2 4])-ax([1 3]))/300;
    elseif numel(ax)==6
        stemWidth = norm(ax([2 4 6])-ax([1 3 5]))/300;
    end
end
if ~exist('tipWidth','var')
    tipWidth = 3*stemWidth;
end

如您所见,如果未提供stemWidthtipWidth,则mArrow3会根据轴限制和stemWidth对其值进行标准化。

那为什么不抛出错误呢?如果您进一步查看函数定义,可以查看错误检查:

%% draw
fv.faces = f;
fv.vertices = v;
h = patch(fv);
for propno = 1:numel(propertyNames)
    try
        set(h,propertyNames{propno},propertyValues{propno});
    catch
        disp(lasterr)
    end
end

这样做是使用try/catch blockset您传递的属性不是'color''stemWidth''tipWidth'。如果它们不是patch对象的有效属性,set将抛出一个错误,该错误被捕获并显示以防止函数完全错误输出。如果您查看Patch properties,则会看到'lineWidth' is a valid property,因此set不会出错。但是,它控制了补丁边缘的宽度,我猜测它不是你想要调整的属性。