колчан не рисует стрелки, просто много синего цвета - PullRequest
2 голосов
/ 15 сентября 2011

Может кто-нибудь сказать мне, что я делаю неправильно с функцией построения колчана, когда я действительно не получаю стрелки, она просто заполняет пустое пространство большим количеством синего цвета. Посмотрите на изображение ниже, а затем посмотрите на мой код.

Это только часть моего контура, так как он поглощает вычислительную мощность, если я пытаюсь увеличить его.Но моя функция, контуры и все остальное работает, у меня проблемы только с колчаном.

Matlab plot

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;

Если я сделаю свою матрицу более разреженной, например, с помощью«Интервал = пробел (-800, 1600, 1200);»результат будет выглядеть следующим образом: enter image description here

РЕДАКТИРОВАТЬ: Мне нужны такие контурные линии, но стрелки должны течь вместе с ними.Прямо сейчас они выглядят как точки, даже если я увеличу масштаб.Если я уменьшу масштаб, все окно будет синим.

Вот сценарий целиком, если кто-то захочет поиграть с ним, чтобы выяснить это.

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;

Ответы [ 2 ]

5 голосов
/ 15 сентября 2011

Проблема в том, что сетка слишком плотная. Вам нужно всего лишь столько элементов, сколько необходимо для создания полезной сетки. Поэтому попытайтесь уменьшить плотность сетки:

interval = -100:2:100

Если вы собираетесь часто менять пределы, вам, вероятно, следует избегать использования формулировки X:Y:Z. Вместо этого используйте функцию linspace:

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

Это гарантирует, что независимо от ваших лимитов, ваша сетка будет 10x10. В комментарии ниже вы упоминаете, что стрелки появляются как точки, когда вы используете очень большую сетку. Этого следовало ожидать. Стрелки отражают «скорость» в данной точке. Когда ваш график масштабируется в очень большой степени, то скорость в любой заданной точке на графике будет почти 0, отсюда и очень маленькие стрелки. Ознакомьтесь с документами quiver , а также quivergroup properties , чтобы узнать больше.

Если вам абсолютно необходимо видеть стрелки в большом масштабе, вы можете попробовать установить для свойства AutoScale значение off или увеличить AutoScaleFactor:

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

Вы также можете поиграть со свойствами MarkerSize и MaxHeadSize. Я действительно просто предлагаю посмотреть на все свойства QuiverGroup и опробовать вещи.

1 голос
/ 02 декабря 2012

Вы можете использовать порог

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;

Это покажет только векторы с величиной> 0,1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...