% Нарисуйте линейную функцию в двух измерениях на заданной триангуляции.% Из-за ошибки в plot2svg он не может хорошо экспортировать 3D-изображения.% Затем мне нужно сделать 3D-изображение, повернуть и спроецировать его вручную в 2D.% Это усложняет код.функция main () % прочитать триангуляцию из данных в конце кода dummy_arg = 0 ; узел = get_nodes ( dummy_arg ); [ np , k ] = размер ( узел ); ele = get_triangles ( dummy_arg ); [ nt , k ] = размер ( ele ); % функция, кусочно-линейная аппроксимация которой будет построена на графике f = встроенный ( '0,07 * (22-8 * x ^ 2-10 * y ^ 2) +0,14' ); % оставит здесь треугольники для построения и их цвета. P = нули ( 3 * nt , 3 ); C = нули ( nt , 3 ); % перебирать треугольники, сохранять координаты всех треугольников альфа = 0,3 ; для i = 1 : nt ; u = ele ( i , 2 ); v = ele ( i , 3 ); w = ele ( i , 4 ); y1 = узел ( u , 2 ); x1 = узел ( u , 3 ); f1 = f ( x1 , y1 ); y2 = узел ( v , 2 ); x2 = узел ( v , 3 ); f2 = f ( x2 , y2 ); y3 = узел ( w , 2 ); х3 = узел ( ш , 3 ); f3 = f ( x3 , y3 ); % цвет данного треугольника выбирается случайным образом цвет = альфа * rand ( 1 , 3 ) + ( 1 - альфа ) * [ 1 1 1 ]; % сохранить треугольник и его цвет на будущее m = 3 * i - 2 ; P ( m + 0 , 1 ) = x1 ; P ( m + 0 , 2 ) = y1 ; P ( m + 0 , 3 ) = f1 ; P ( m + 1 , 1 ) = x2 ; P ( m + 1 , 2 ) = y2 ; P ( m + 1 , 3 ) = f2 ; P ( m + 2 , 1 ) = x3 ; P ( m + 2 , 2 ) = y3 ; P ( m + 2 , 3 ) = f3 ; C ( i , :) = цвет ; конец% "база", область определения кусочно-линейной функции P0 = P ; P0 (:, 3 ) = 0 * P0 (:, 3 ); % Сделайте вращение в 3D, затем нанесите проекции на плоскость xy.% Это нужно делать вручную, так как у plot2svg проблемы с сохранением 3D-графики. а = пи / 2,5 ; b = 0 ; c = 0 ; Q = do_rotate ( P , a , b , c ); Q0 = do_rotate ( P0 , a , b , c ); % сортировать треугольники по третьей координате центра тяжести (после поворота) R = нули ( nt , 2 ); для i = 1 : nt m = 3 * i - 2 ; z1 = Q ( m , 3 ); z2 = Q ( m + 1 , 3 ); z3 = Q ( m + 2 , 3 ); R ( i , 1 ) = ( z1 + z2 + z3 ) / 3 ; R ( i , 2 ) = i ; конец R = строки сортировки ( R , 1 ); % построить проекцию повернутой фигуры и базовой формы clf ; держать на ; ось равная ; ось выключена ; lw = 0,5 ; черный = [ 0 , 0 , 0 ]; белый = [ 1 , 1 , 1 ]; для i = 1 : nt j = R ( i , 2 ); m = 3 * j - 2 ; заполнить ([ Q ( m , 1 ), Q ( m + 1 , 1 ) Q ( m + 2 , 1 )], [ Q ( m , 2 ), Q ( m + 1 , 2 ) Q ( m + 2 , 2 )], C ( i , :)); заполнить ([ Q0 ( m , 1 ), Q0 ( m + 1 , 1 ) Q0 ( m + 2 , 1 )], [ Q0 ( m , 2 ), Q0 ( m + 1 , 2 ) Q0 ( m + 2 , 2 )], белый ); сюжет ([ Q ( m , 1 ), Q ( m + 1 , 1 ) Q ( m + 2 , 1 ), Q ( m , 1 )], [ Q ( m , 2 ), Q ( m + 1 , 2) ) Q ( m + 2 , 2 ), Q ( m , 2 )], ... 'ширина линии' , lw , 'цвет' , черный ); сюжет ([ Q0 ( m , 1 ), Q0 ( m + 1 , 1 ) Q0 ( m + 2 , 1 ), Q0 ( m , 1 )], [ Q0 ( m , 2 ), Q0 ( m + 1 , 2) ) Q0 ( m + 2 , 2 ), Q0 ( m , 2 )], ... 'ширина линии' , lw , 'цвет' , черный ); конец % небольшое исправление, чтобы избежать ошибки с ограничивающей рамкой при экспорте small = 0,1 ; Sx = min ( min ( Q (:, 1 )), min ( Q0 (:, 1 ))) - маленький ; Lx = max ( max ( Q (:, 1 )), max ( Q0 (:, 1 ))) + small ; Sy = min ( min ( Q (:, 2 )), min ( Q0 (:, 2 ))) - маленький ; Ly = max ( max ( Q (:, 2 )), max ( Q0 (:, 2 ))) + small ; сюжет ( Lx , Ly , '*' , 'color' , 0,99 * белый ); сюжет ( Sx , Sy , '*' , 'color' , 0,99 * белый ); ось ([ Sx - маленький Lx + маленький , Sy - маленький , Ly + маленький ]) % экспорт в формате eps и svg% saveas (gcf, 'кусок_линеар2D_proj.eps', 'psc2') plot2svg ( ' кусочно_линейный2D_proj.svg ' ) узел функции = get_nodes ( dummy_arg ) узел = [ 1 1 0 2 0,913545 0,406737 3 0,669131 0,743145 4 0,309017 0,951057 5 - 0,104528 0,994522 6 - 0,5 0,866025 7 - 0,809017 0,587785 8 - 0,978148 0,207912 9 - 0,978148 - 0,207912 10 - 0,809017 - 0,587785 11 - 0,5 - 0,866025 12 - 0,104528 - 0,994522 13 0,309017 - 0,951057 14 0,669131 - 0,743145 15 0,913545 - 0,406737 16 - 0,161265 - 0,179103 17 0,313878 0,228046 18 - 0,314083 0,348825 19 0,40037 - 0,290886 20 0,0609951 - 0,58033 21 0,0617879 0,587873 22 - 0,587046 1,34875e-16 ]; функция ele = get_triangles ( dummy_arg ) ele = [ 1 10 11 16 2 16 18 22 3 10 22 9 4 10 16 22 5 11 12 20 6 7 22 18 7 21 3 4 8 8 9 22 9 8 22 7 10 1 19 15 11 20 13 14 12 6 18 21 13 6 21 5 14 19 1 17 15 19 16 20 16 11 20 16 17 2 17 1 18 16 17 18 19 6 7 18 20 17 16 19 21 21 4 5 22 3 17 2 23 17 3 21 24 20 12 13 25 19 20 14 26 18 17 21 27 14 15 19] ; функция Q = do_rotate ( P, a, b, c ) М = [ 1 , 0 , 0 ; 0 , cos ( а ), sin ( а ); 0 - sin ( a ), cos ( a )] * [ cos ( b ), 0 , - sin ( b ); 0 , 1 , 0 ; sin ( b ), 0 , cos ( b )] ... * [ cos ( c ), sin ( c ), 0 ; - sin ( c ), cos ( c ), 0 ; 0 , 0 , 1 ]; [ m , n ] = размер ( P ); Q = 0 * P ; для i = 1 : m X = P ( i , :) ' ; Х = М * Х ; Q ( i , 1 ) = X ( 1 ); Q ( i , 2 ) = X ( 2 ); Q ( i , 3 ) = X ( 3 ); конец