Обращаясь к первому вопросу: сначала вам необходимо определить координаты вашего тора в тороидальных координатах (кажется естественным!), А затем преобразовать в декартовы координаты, что 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
Редактировать: Чтобы решить свой второй вопрос, это зависит от того, как вы сохранили свои искажения, но скажите, что у вас есть матрица, определенная в каждой тороидальной и полоидальной точке, вам просто нужно будет умножить константу, которая является малым радиусом, на искажение. Ниже я создаю матрицу искажений, которая имеет те же размеры, что и мои координатные матрицы тороидальных и полоидальных углов, и которая обычно распределяется вокруг среднего значения 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)
В результате которого:
+1 для векторизации это все, это лучше, чем петли я накатал. – tmpearce
Это именно то, что мне нужно. Большое спасибо! –
Старый пост, но я недавно использовал это. В Octave (и я также предполагаю, что Matlab) surf() принимает четвертый параметр для цвета. Я нашел, что это помогло мне выделить искажение, если я назвал surf (x, y, z, искажение). – Bovaz