2012-05-18 5 views
4

У меня есть проблема, которая в два раза:Визуальное тороидальной поверхности в Matlab

  1. Как построить тороидальной поверхности в MATLAB, учитывая большой радиус R и малый радиус ? Чтобы избежать путаницы, это toroidal/poloidal coordinate system, как показано на рисунке ниже, о котором я говорю. Toroidal coordinate system

  2. Теперь в любой точке (фи, тета) на этой поверхности, малый радиус будет искажена некоторое значение, что я хранится в матрице. Как я рисую эту искаженную поверхность? Это может быть легко, как только я отвечу на часть 1, но это моя фактическая цель, поэтому любое решение части 1, которое не может справиться с этим, для меня совершенно бесполезно.

Если кто-нибудь может сказать мне, как сделать изображение появится здесь меньше, пожалуйста =)

ответ

10

Обращаясь к первому вопросу: сначала вам необходимо определить координаты вашего тора в тороидальных координатах (кажется естественным!), А затем преобразовать в декартовы координаты, что MATLAB ожидает, что все графики будут построены (если вы не создаете полярный график, конечно). Итак, мы начинаем с определения из нашей тороидальной координаты:

aminor = 1.; % Torus minor radius 
Rmajor = 3.; % Torus major radius 

theta = linspace(-pi, pi, 64) ; % Poloidal angle 
phi = linspace(0., 2.*pi, 64) ; % Toroidal angle 

Мы просто хотим единую поверхность тора, поэтому малый радиус является скаляром. Теперь сделать 2D сетки этих координат:

[t, p] = meshgrid(phi, theta); 

и конвертировать в 3D декартовых координат, используя формулы, приведенные на странице Википедии связаны в вопросе:

x = (Rmajor + aminor.*cos(p)) .* cos(t); 
y = (Rmajor + aminor.*cos(p)) .* sin(t); 
z = aminor.*sin(p); 

Теперь мы наш тор определен в 3D, мы можем построить его с помощью surf:

surf(x, y, z) 
axis equal 

Proof!

Редактировать: Чтобы решить свой второй вопрос, это зависит от того, как вы сохранили свои искажения, но скажите, что у вас есть матрица, определенная в каждой тороидальной и полоидальной точке, вам просто нужно будет умножить константу, которая является малым радиусом, на искажение. Ниже я создаю матрицу искажений, которая имеет те же размеры, что и мои координатные матрицы тороидальных и полоидальных углов, и которая обычно распределяется вокруг среднего значения 1 с FWHM равным 0.1:

distortion = 1. + 0.1 * randn(64, 64); 

x = (Rmajor + aminor .* distortion .*cos(p)) .* cos(t); 
y = (Rmajor + aminor .* distortion .* cos(p)) .* sin(t); 
z = aminor.* distortion .* sin(p); 

surf(x, y, z) 

В результате которого:

enter image description here

+0

+1 для векторизации это все, это лучше, чем петли я накатал. – tmpearce

+0

Это именно то, что мне нужно. Большое спасибо! –

+0

Старый пост, но я недавно использовал это. В Octave (и я также предполагаю, что Matlab) surf() принимает четвертый параметр для цвета. Я нашел, что это помогло мне выделить искажение, если я назвал surf (x, y, z, искажение). – Bovaz

1

Вы можете сделать это с помощью surf - просто создать матрицы с х, у, г координат. На странице, с которой вы связались, есть триггерные уравнения для этого (они именно то, что вы придумали сами по себе - я написал код ниже, прежде чем проверять вашу ссылку).

R = 10; 
a = 3; 
tx=nan(41,21); 
ty=nan(41,21); 
tz=nan(41,21); 
for j=1:21 
    for i=1:41 
    phi = (i-1)*2*pi/40; 
    theta = (j-1)*2*pi/20; 
    tx(i,j)= cos(phi) * (R+cos(theta)*a); 
    ty(i,j)= sin(phi) * (R+cos(theta)*a); 
    tz(i,j)= sin(theta)*a; 
    end 
end 
figure 
surf(tx,ty,tz) 
axis equal 

Для того, чтобы деформировать поверхность, заменить постоянную a с матрицей желаемых незначительных значений радиуса, и индекс в этой матрице - т.е. tz(i,j) = sin(theta)*distortion(i,j) (но во всех измерениях, очевидно).

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