2016-01-29 2 views
0

Команда MATLAB's surf позволяет передать ее необязательно X и Y данные, которые определяют некартесные компоненты x-y. (они существенно меняют базисные векторы). Я хочу передать аналогичные аргументы функции, которая будет рисовать линию.Нарисуйте линию с некартовыми координатами в MATLAB

Как построить линию, используя некартовую систему координат?

Приносим извинения, если моя терминология немного не работает. Это по-прежнему может быть формально декартово, но это не будет квадрат в том смысле, что один блок в направлении x ортогонален одному блоку в направлении y. Если вы можете исправить мою терминологию, я бы очень признателен!

РЕДАКТИРОВАТЬ:

Ниже лучше демонстрирует то, что я имею в виду:

Команды:

datA=1:10; 
datB=1:10; 
X=cosd(8*datA)'*datB; 
Y=datA'*log10(datB*3); 
Z=ones(size(datA'))*cosd(datB); 
XX=X./(1+Z); 
YY=Y./(1+Z); 
surf(XX,YY,eye(10)); view([0 0 1]) 

производит следующий график:

Non-Cartesian Surf

Здесь, X и Размеры Y не ортогональны или равно я разнесены. Одна единица в х может соответствовать 5 см в направлении х, а следующая единица в х может соответствовать 2 см в направлении х + 1 см в направлении у. Я хочу повторить эту функциональность, но рисуя линию вместо прибоя Например, я ищу функцию, где:

straightLine=[(1:10)' (1:10)']; 
my_line(XX,YY,straightLine(:,1),straightLine(:,2)) 

будет производить линию, которая прослежена красные квадраты на прибой графике.

+0

Я не уверен, что я знаю, что вы имеете в виду. Координаты 'plot', так же как' surf', должны быть заданы в декартовой системе координат. Однако вы можете * параметризовать * свои данные, чтобы получить 'x' и' y' как функцию ваших собственных, некарцевых координат. Я имею в виду 'phi = linspace (0,2 * pi, 50); г = соз (фи)^2.; . Х = г * соз (фи); . У = г * Sin (фи); участок (х, у) '. Это должно быть что-то вроде «polar (theta, r)». Отказ от ответственности: я понимаю, что полярная система координат локально ортогональна, но я надеюсь, что вы поймете мою мысль. Так что, пока вы знаете, что преобразование из вашей пользовательской системы координат в Cartesian, вы должны быть в порядке –

+0

Возможно, вы ищете что-то вроде [изометрической проекции] (https://en.wikipedia.org/wiki/Isometric_projection)? – beaker

+0

@beaker, который может работать, но я не проецируюсь из 3D в 2D. – chessofnerd

ответ

1

Я m все еще не уверены в ваших данных ввода и о том, что вы хотите построить. Однако от как вы хотите построить его, я могу помочь.

Когда вы звоните

surf(XX,YY,eye(10)); view([0 0 1]); 

и хотите получить только «красные части», т.е. максимумов функции, вы, по сути выбора подмножества XX, YY матриц, используя диагональную матрицу в качестве индикатора , Таким образом, вы можете выбрать эти пункты вручную, и использовать plot построить их в качестве линии:

Xplot = diag(XX); 
Yplot = diag(YY); 
plot(Xplot,Yplot,'r.-'); 

Вызов diag(XX) будет принимать диагональные элементы матрицы XX, что именно там, где вы получите красные пятна когда вы используете surf с данными z в соответствии с eye().

Результат:

result from plot


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

datA = 1:10; 
datB = 1:10; 
X2 = cosd(8*datA).*datB; 
Y2 = datA.*log10(datB*3); 
Z2 = cosd(datB); 
XX2 = X2./(1+Z2); 
YY2 = Y2./(1+Z2); 
plot(Xplot,Yplot,'rs-',XX2,YY2,'bo--','linewidth',2,'markersize',10); 
legend('original','vector') 

Результат: new result

+1

Это сработало отлично. Спасибо, что помогли мне понять это. – chessofnerd

0

У Matlab есть много встроенных функций, которые помогут вам.

В 2D самый простой способ сделать это polar, что позволяет сделать график с использованием theta и rho векторов:

theta = linspace(0,2*pi,100); 
r = sin(2*theta); 
figure(1) 
polar(theta, r), grid on 

Таким образом, вы получите this. Там также pol2cart функция, которая будет конвертировать ваши данные в x и y формат:

[x,y] = pol2cart(theta,r); 
figure(2) 
plot(x, y), grid on 

Это будет выглядеть немного different Затем, если мы распространим это на 3D, вы остаетесь только с plot3.Итак, если у вас есть данные, такие как:

theta = linspace(0,10*pi,500); 
r = ones(size(theta)); 
z = linspace(-10,10,500); 

вам нужно использовать pol2cart с 3-мя аргументами для получения this: [х, у, г] = pol2cart (тета, г, г); цифра (3) plot3 (х, у, г), сетка на

Наконец, если у вас есть сферические данные, у вас есть sph2cart:

theta = linspace(0,2*pi,100); 
phi = linspace(-pi/2,pi/2,100); 
rho = sin(2*theta - phi); 
[x,y,z] = sph2cart(theta, phi, rho); 
figure(4) 
plot3(x,y,z),grid on 
view([-150 70]) 

Это будет выглядеть this way

+0

Спасибо за ответ, но у меня нет полярных или сферических данных. (Однако я пытаюсь сделать что-то там, где это может сработать) – chessofnerd

+0

Комментарий @AndrasDeak очень полезен, потому что он применим к любой системе координат. Я также предлагаю вам предоставить некоторые примеры данных. Это поможет сообществу лучше понять ваш вопрос. – brainkz

Смежные вопросы