Matlab箭袋箭头长度

Matlab quiver arrow length

我正在编写以下代码:

function myquiver

clc
R=2.3;
C=1.2;
V=@(t) 3*sqw(t,1,10);
F=@(t,VC) (V(t)-VC)/(R*C);
[T,VC]=meshgrid(linspace(0,25,10),linspace(0,0.5,10));
S=(3*sqw(T,1,10)-VC)/(R*C);
L=sqrt(1+S.^2);
quiver(T,VC,1./L,S./L,'r','ShowArrowhead','off','AutoScale','off')
axis([0,25,0,0.5])
shg

function y=sqw(t,T,d)
r=mod(t,T);
y=(r<d*T/100);

这会生成以下图像:

现在,我想要做的是根据轴使每个箭袋箭头的长度相同。我不想改变轴([0,25,0.05])。这正是我想要的。但是我怎样才能缩放每个箭袋箭头,使它们在这个特定图像中的长度都相同?

如果我用 axis([0,10,-30,50]) 绘制另一个图,我希望看到一个我可以使用的想法。

我希望看到完整的代码示例和图像。

谢谢。

让我们考虑两个坐标系。首先,数据所在的世界坐标系。例如1./LS./L是世界坐标表示。其次,我们定义的地块坐标系使得一个距离单位是地块的宽度和高度window。 IE。在绘图坐标中具有单位长度的水平向量将恰好跨越整个绘图宽度,类似地,在绘图坐标中具有单位长度的垂直向量将恰好跨越整个绘图高度。

您似乎要问的是如何缩放每个向量,使它们在绘图坐标中的长度都是固定的。不难看出,对于在世界坐标 (x_world, y_world) 中定义的某些矢量,以下函数将世界坐标转换为绘图坐标。

x_plot = x_world / x_span
y_plot = y_world / y_span

其中 x_spany_span 是绘图在世界坐标中的宽度和高度(在您的情况下分别为 250.5)。

我们想知道应用于 x_worldy_world 的比例因子,以便 (x_plot, y_plot) 是某个固定长度。观察到我们 必须在 x 和 y 中应用相同的比例因子以保持原始方向 。在数学上,这可以用等式

来描述
d = sqrt((s*x_world / x_span)^2 + (s*y_plot / y_span)^2)

其中 d 是绘图坐标中所需的长度,s 是我们需要确定的比例因子。

求解 s 的方程,我们得到

s = d/sqrt((x_world / x_span)^2 + (y_plot / y_span)^2)

这给了我们一个解决方案。

function myquiver
    xmin = 0; xmax = 25;
    ymin = 0; ymax = 0.5;

    R=2.3;
    C=1.2;
    V=@(t) 3*sqw(t,1,10);
    F=@(t,VC) (V(t)-VC)/(R*C);
    [T,VC]=meshgrid(linspace(xmin,xmax,10),linspace(ymin,ymax,10));
    S=(3*sqw(T,1,10)-VC)/(R*C);
    L=sqrt(1+S.^2);

    x_span = xmax - xmin;
    y_span = ymax - ymin;
    % Compute the scale factor so that vectors are 10% of plot window
    d = 0.1;
    X_world = 1./L;
    Y_world = S./L;
    s = d ./ sqrt((X_world / x_span).^2 + (Y_world / y_span).^2);
    quiver(T,VC,s.*X_world,s.*Y_world,'r','ShowArrowhead','off','AutoScale','off')
    axis([xmin,xmax,ymin,ymax])

    % force the axis to be square
    axis('square');

function y=sqw(t,T,d)
    r=mod(t,T);
    y=(r<d*T/100);


这里要注意的一件事是我们使用了axis('square')。这对于确保 绘图坐标 screen/pixel 坐标 之间的比例关系相等是必要的。由于这可能是不可取的(也许我们不想要方形图!),那么 我们可以通过将 x_span 除以轴的纵横比(以像素为单位)[=72] 来解决这个问题=].不幸的是,我们无法在创建图之前获得纵横比。为了实施通用解决方案,我们基本上有两种选择。

  1. 编写一个函数处理程序,以便在每次调整图形大小时自动 re-plot。这是更多的工作,但概括了。
  2. 播放图形直到达到所需的大小,然后查询大小,然后使用此信息 re-plot 获得所需的图形大小。

我选择了第二个选项。首先,我绘制了 没有 axis('square'),然后使用 window 直到它与您发布的原始数字大致相同。接下来我查询了图形的位置和纵横比如下

>> get(gcf, 'Position')
ans = 666   223   672   505
>> set(gca, 'Units', 'Pixels');
>> get(gca, 'Position')
ans = 88.3600   56.5500  520.8000  411.5750

这告诉我们,对于这个图形位置,轴的纵横比(以像素为单位)为 520.8 / 411.575。利用这些知识,我们修改函数来为这个 non-square 轴绘制等长向量,如下所示。

function myquiver
    xmin = 0; xmax = 25;
    ymin = 0; ymax = 0.5;

    R=2.3;
    C=1.2;
    V=@(t) 3*sqw(t,1,10);
    F=@(t,VC) (V(t)-VC)/(R*C);
    [T,VC]=meshgrid(linspace(xmin,xmax,10),linspace(ymin,ymax,10));
    S=(3*sqw(T,1,10)-VC)/(R*C);
    L=sqrt(1+S.^2);

    aspect = 520.8 / 411.575;
    x_span = (xmax - xmin) / aspect;
    y_span = ymax - ymin;
    % Compute the scale factor so that vectors are 10% of y-direction of plot window
    d = 0.1;
    X_world = 1./L;
    Y_world = S./L;
    s = d ./ sqrt((X_world / x_span).^2 + (Y_world / y_span).^2);
    quiver(T,VC,s.*X_world,s.*Y_world,'r','ShowArrowhead','off','AutoScale','off')
    axis([xmin,xmax,ymin,ymax])

    % Make the figure have the desired position/size
    set(gcf, 'Position', [666   223   672   505]);

function y=sqw(t,T,d)
    r=mod(t,T);
    y=(r<d*T/100);