У меня есть задание сделать тору. Это мой первый раз с Matlab, и мне удалось бороться и получить 2/3 части с каким-то ужасным заглушенным кодом.matlab Оказание тора из вершин
Первый шаг задания - сделать круг как набор из 20 баллов. Для которого я произвел:
circle (IMG)
Тогда следующий шаг, чтобы повернуть и перевести этот круг и сделать это 20 раз, чтобы представить форму тора, поэтому я получил это:
torus points (IMG)
Следующий шаг - отобразить трехмерное представление этого тора из списка вершин.
Что у меня есть массивный список из вершин в 400x3 матрице, как так:
7.66478245119846 -1.84059939326890 0.292371704722737
7.53434247103331 -1.79821687453702 0.573576436351046
7.32764268084884 -1.73105604149887 0.798635510047293
7.06491629627043 -1.64569106442929 0.945518575599317
6.77188080634298 -1.55047806205660 0.999847695156391
6.47722056651889 -1.45473714644104 0.956304755963036
... ... ...
где каждый последующие 20 строк является еще один круг.
Назначение рекомендует использовать функцию серфинга для рендеринга, но я не могу понять, как это сделать. Все примеры, которые я видел, используют surf для представления двухмерных плоскостей, которые искажаются значением высоты. Который не кажется подходящим для того, чтобы сделать этот вид 3-мерной формы вообще.
Подход, который я пытаюсь, состоит в том, чтобы создать список лиц, а затем использовать функцию патча для отображения круга. Где первые 2 точки каждого круга образуют квадрат с соответствующими двумя точками следующего круга, а затем рендеринг.
Используя что-то вроде этого:
for i=1:400
face = [(i) (i+1) (i+21) (i+20)];
patch('Faces',face,'Vertices',torus_vertices,'FaceColor','r'); %Should do this at the end
end
За что я получаю что-то вроде этого:
3d Torus (IMG)
Он крутит и некоторые из боковых и внутренних боковых граней перепутались вверх. Я думаю, что это может иметь какое-то отношение к упорядочению вершин, вращающихся в какой-то момент.
Что было бы лучшим способом подойти к этой проблеме? Если это вообще возможно, я хочу сделать это с помощью функции серфинга.
Ex1.m
%Initial positions
position = [2 0 0];
normal = [0 1 0];
%Rotation matrix
rotate18 = [cos(todeg(18)) -sin(todeg(18)) 0;
sin(todeg(18)) cos(todeg(18)) 0;
0 0 1];
% translate along the x axis by 5
translate = [5 0 0];
%% iterate 20 times to get a list of all the vertices
taurus_vertices = zeros(0, 3);
for i=0:20
%rotate translation by 18 degrees
translate = translate * rotate18;
%translate
position = position + translate;
%rotate the normal so it faces the right direction
normal = normal * rotate18;
%Get vertices for the circle and append to vertices list
circle_vertices = circle_3D(1, position, normal);
taurus_vertices = cat(1, taurus_vertices, circle_vertices);
%translate back to original position
position = position - translate;
end
%scatter3(taurus_vertices(1:end, 1), taurus_vertices(1:end, 2), taurus_vertices(1:end, 3));
%% Render each face
for i=1:400
face = [(i) (i+1) (i+21) (i+20)];
patch('Faces',face,'Vertices',taurus_vertices,'FaceColor','r');
end
circle.m
function h_circle=circle_3D(r, M, n)
%% Prepare input parameters
if size(n,2)>size(n,1)
n=n';
end
if size(M,2)>size(M,1)
M=M';
end
%% Define unit vectors u and v
% u and v define a new coordinate system in a plane perpendicular to n
a=[1;0;0];
b=[0;1;0];
if isempty(find(cross(a,n), 1))==1
a=[0;0;1];
elseif isempty(find(cross(b,n), 1))==1
b=[0;0;1];
end
alpha=dot(n,a)/dot(n,n);
u=a-alpha*n;
v=cross(u,n);%b-beta*n-gamma*u;
u=u/sqrt(sum(u.*u));
v=v/sqrt(sum(v.*v));
%% Plot the circle
hold on
axis equal
degs = 0;
points = 0;
verts = zeros(20, 3);
for phi=0: pi()/180 : 2*pi()
degs=degs+1;
if (mod(degs,18) == 0)
points = points + 1;
verts(points,1)=M(1,1)+r*cos(phi)*u(1,1)+r*sin(phi)*v(1,1);
verts(points,2)=M(2,1)+r*cos(phi)*u(2,1)+r*sin(phi)*v(2,1);
verts(points,3)=M(3,1)+r*cos(phi)*u(3,1)+r*sin(phi)*v(3,1);
end
end
h_circle= verts;
Спасибо, я не добирался, чтобы включить свой подход, как мне удалось выработать мой собственный в то же время. Мне жаль, что у меня не было, хотя у вас намного элегантнее. – Callum