开发者

quiver not drawing arrows just lots of blue, matlab

Can somebody tell me what I am doing wrong with the quiver plotting function when I don't really get arrows, it just fills the em开发者_如何学运维pty space with lots of blue.Look at the image below and then look at my code.

This is just a part of my contour since this eats up proccessing power if I try to draw it larger. But my function, the contours and everything else works, it's just the quiver I'm having trouble with.

quiver not drawing arrows just lots of blue, matlab

interval = -100:100;

[X Y] = meshgrid(interval, interval);

h = figure;
contour(X, Y, Z);

hold on;

[FX,FY] = gradient(-Z);
quiver(X, Y, FX, FY);

hold off;

If I make my matrix more sparse, e.g. with "interval = linspace(-800, 1600, 1200);" the result will look like this:

quiver not drawing arrows just lots of blue, matlab

EDIT: What I need are contour lines like that, but the arrows should flow with them. Right now these just look like dots, even if I zoom in further. If I zoom out the entire window will be blue.

Here is the script in its entirety if anyone wants to play with it to figure this out.

m1 = 1;
m2 = 0.4;
r1 = [1167 0 0];
r2 = [-467 0 0];
G = 9.82;

w = sqrt( G*(m1+m2) / norm(r1-r2)^3 );

interval = linspace(-800, 1600, 1200);

% Element-wise 2-norm
ewnorm = @(x,y) ( x.^2 + y.^2 ).^(1/2);

% Element-wise cross squared
ewcross2 = @(w,x,y) w^2.*( x.*x + y.*y );

[X Y] = meshgrid(interval, interval);

Z = - G*m1 ./ ewnorm( X-r1(1), Y-r1(2) ) - G*m2 ./ ewnorm( X-r2(1), Y-r2(2) ) - 1/2*ewcross2(w,X,Y);

h = figure;
contour(Z);

daspect([1 1 1]);

saveas(h, 'star1', 'eps');

hold on;

[FX,FY] = gradient(-Z);
quiver(X, Y, FX,FY);

hold off;


The problem is that the mesh is too dense. You only want to have as few elements as necessary to generate a useful mesh. As such, try reducing the density of the mesh:

interval = -100:2:100

If you're going to be changing the limits often, you probably want to avoid using the X:Y:Z formulation. Use the linspace function instead:

interval = linspace(-100,100,10);

This will ensure that no matter what your limits, your mesh will be 10x10. In the comment below, you mention that the arrows are appearing as dots when you use a very large mesh. This is to be expected. The arrows reflect "velocity" at a given point. When your plot is scaled out to a very large degree, then the velocity at any given point on the plot will be almost 0, hence the very small arrows. Check out the quiver plot documentation, as well as the quivergroup properties, to see more details.

If you absolutely must see arrows at a large scale, you can try setting the AutoScale property to off, or increasing the AutoScaleFactor:

quiver(X, Y, FX, FY, 'AutoScale', 'off');
quiver(X, Y, FX, FY, 'AutoScaleFactor', 10);

You may also want to play with the MarkerSize and MaxHeadSize properties. I really just suggest looking at all the QuiverGroup properties and trying things out.


You could use a threshold

interval = -100:100;

[X Y] = meshgrid(interval, interval);

h = figure;
contour(X, Y, Z);

hold on;

[FX,FY] = gradient(-Z);
GM = sqrt(FX.^2 + FY.^2);
threshold = 0.1;
mask = GM > threshold;
quiver(X(mask), Y(mask), FX(mask), FY(mask));

hold off;

This will show only vectors with a magnitude > 0.1;

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜