├── .DS_Store ├── .gitattributes ├── README.md ├── data ├── cat0.off ├── cat1.off ├── tr_reg_000.off └── tr_reg_001.off ├── examples ├── .DS_Store ├── example_shapePair.m ├── example_shapeWithLandmarks.m └── example_singeShape.m ├── func_other ├── +MESH_IO │ ├── .DS_Store │ ├── generate_tex_coords.m │ ├── private │ │ ├── readObj.m │ │ ├── readOff.m │ │ ├── readPly.m │ │ ├── readobj_fast.m │ │ ├── writeOFF.m │ │ ├── writeObj.m │ │ └── write_obj.m │ ├── read_shape.m │ ├── shape_name.m │ ├── wobj_with_texture.m │ ├── writeOFF.m │ └── writeObj.m ├── .DS_Store ├── calc_tri_areas.m ├── compute_vtx_and_face_normals.m ├── fps_euclidean.m ├── get_edge_list.m ├── mesh_with_consistent_fields.m ├── my_plywrite.m ├── normalize_mesh_area.m └── pMap_NNinterp.m ├── func_render ├── .DS_Store ├── add_shadow.m ├── assign_color_for_scalar_func.m ├── get_mapped_face_color_withNaN.m ├── get_mesh_face_color.m ├── merge_mesh_with_landmarks.m ├── private │ ├── add_isolines.m │ ├── add_shadow.m │ ├── isolines.m │ ├── isolines_map.m │ ├── load_MeshPlot_default_params.m │ ├── matrixnormalize.m │ ├── normalize_function.m │ ├── parse_MeshPlot_params.m │ └── set_overlay_axis.m ├── render_map.m ├── render_mesh.m ├── sphere.obj └── texture_transfer_pMap.m └── results ├── .DS_Store ├── eg_shapePair.png ├── eg_shapeWithLandmarks.png ├── eg_singleShape_allEdges.png ├── eg_singleShape_colorFromVertex.png ├── eg_singleShape_colorFromVertex_v2.png ├── eg_singleShape_singleCol.png ├── eg_singleShape_subsetEdges.png ├── eg_singleShape_vectorField.png ├── eg_singleShape_visualizeFunction.png └── overview.png /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MatlabRenderToolbox 2 | 3 | 4 | 5 | This is a simple render toolbox in Matlab. 6 | 1. ```./examples/example_singlePair.m``` shows how to 7 | * *render a shape* (with adjustable rotations to align the shape first) 8 | * *visualize some edges* 9 | * *color the mesh with per-vertex color assginment* 10 | * *visualize a per-vertex scalar fuction* (e.g., some descriptor) 11 | * *visualize a vector field* 12 | 2. ```./examples/example_shapeWithLandmarks.m``` shows how to add some landmarks as spheres to the given shape and render them altogether 13 | 3. ```./examples/example_shapePair.m``` shows to how to visualize a given point-wise map on a shape pair via color transfer. Two meshes are ploted in the same axis, and some corresponding landmarks or connecting lines can be visualized as well optionally. 14 | 15 | ## Comments 16 | - This toolbox gives so-so renderings (as shown above), but it is very fast and easy to play with (I feel so :) 17 | - In this toolbox, I used some functions from [gptoolbox](https://github.com/alecjacobson/gptoolbox) by [Alec Jacobson](https://github.com/alecjacobson). This blog [Paper-worthy rendering in MATLAB](https://www.alecjacobson.com/weblog/?p=4732) by Alec might also be helpful. 18 | - If you are looking for paper-level rendering toolbox, I found [this one](https://github.com/HTDerekLiu/BlenderToolbox), a blender toolbox with python scripts provided by [Hsueh-Ti Derek Liu](https://github.com/HTDerekLiu) extremely helpful. 19 | - update (2019-11-03): just find this [Matlab render toolbox](https://github.com/hexygen/SPRender) by [Yanir Kleiman](https://github.com/hexygen/) that might be helpful as well 20 | - Please feel free to contact me (jing.ren@kaust.edu.sa) if you have any questions or suggestions to this toolbox ;) 21 | 22 | -------------------------------------------------------------------------------- /examples/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/examples/.DS_Store -------------------------------------------------------------------------------- /examples/example_shapePair.m: -------------------------------------------------------------------------------- 1 | clc; clear; close all; 2 | addpath('../func_render/'); 3 | addpath('../func_other/'); 4 | mesh_dir = '../data/'; 5 | s1_name = 'tr_reg_000.off'; 6 | s2_name = 'tr_reg_001.off'; 7 | %% Given a pair of shapes, and a computed pair from S1 to S2 8 | % we want to visualize the map by color transfer 9 | S1 = MESH_IO.read_shape([mesh_dir, s1_name]); 10 | S2 = MESH_IO.read_shape([mesh_dir, s2_name]); 11 | T12 = 1:length(S1.surface.X); 12 | 13 | % its fine that some correspondences are missing (with value NaN) 14 | % T12(randi([1, S1.nv],500,1)) = NaN; 15 | %% get the color of the two shapes from the given map 16 | % the last argument controls the color-scheme of the shape 17 | % try any permutation of [1,2,3] with different signs, e.g., [1,2,3], [-3,-2,1] 18 | [S1_col,S2_col]= get_mapped_face_color_withNaN(S1,S2,T12,[-2,-1,3]); 19 | %% render the two shapes sperately to find the proper rotations 20 | figure(1); 21 | [~,~, S1_new] = render_mesh(S1,'MeshVtxColor',S1_col,... 22 | 'RotationOps',{[-90,0,0],[0,0,30]},... 23 | 'CameraPos',[-10,10],... 24 | 'FaceAlpha',0.9); hold on; 25 | 26 | 27 | translation = [1.2,-0.1,0]; % translate the second shape 28 | [~,~, S2_new] = render_mesh(S2,'MeshVtxColor',S1_col,... 29 | 'RotationOps',{[-90,0,0],[0,0,30]},... 30 | 'VtxPos',S2.surface.VERT + repmat(translation,S2.nv,1),... % translate the second shape such that S1 and S2 are not overlapped 31 | 'CameraPos',[-10,10],... 32 | 'FaceAlpha',0.9); 33 | 34 | %% add some landmarks 35 | lmk1 = fps_euclidean(S1, 15); % sample some vtx on S1 36 | lmk2 = T12(lmk1); % they are mapped to lmk2 by the given map 37 | 38 | [S1_combined, S1_col_combined] = merge_mesh_with_landmarks(S1_new, lmk1, S1_col, S1_col(lmk1,:)); 39 | [S2_combined, S2_col_combined] = merge_mesh_with_landmarks(S2_new, lmk2, S2_col, S2_col(lmk1,:)); 40 | 41 | figure(2); 42 | render_mesh(S1_combined,'MeshVtxColor',S1_col_combined,... 43 | 'CameraPos',[-10,10],... 44 | 'FaceAlpha',0.9); hold on; 45 | 46 | 47 | render_mesh(S2_combined,'MeshVtxColor',S2_col_combined,... 48 | 'CameraPos',[-10,10],... 49 | 'FaceAlpha',0.9); hold off; 50 | 51 | %% add some lines to connect the landmarks 52 | figure(3); 53 | render_mesh(S1_combined,'MeshVtxColor',S1_col_combined,... 54 | 'CameraPos',[-10,10],... 55 | 'FaceAlpha',0.9,... 56 | 'BackgroundColor',[0.5, 0.5, 0.5]); hold on; 57 | 58 | render_mesh(S2_combined,'MeshVtxColor',S2_col_combined,... 59 | 'CameraPos',[-10,10],... 60 | 'FaceAlpha',0.9,... 61 | 'BackgroundColor',[0.5, 0.5, 0.5]); hold on; 62 | 63 | X1 = S1_combined.surface.VERT; 64 | X2 = S2_combined.surface.VERT; 65 | 66 | Xstart = X1(lmk1,1)'; Xend = X2(lmk2,1)'; 67 | Ystart = X1(lmk1,2)'; Yend = X2(lmk2,2)'; 68 | Zstart = X1(lmk1,3)'; Zend = X2(lmk2,3)'; 69 | 70 | ColorSet = S1_col(lmk1,:); 71 | set(gca, 'ColorOrder', ColorSet); 72 | plot3([Xstart; Xend], [Ystart; Yend], [Zstart; Zend],'LineWidth',1.2); hold off; 73 | 74 | 75 | set(gcf,'Position', [50 50 600 600]); 76 | set(gcf,'Color', [0.5,0.5,0.5],'InvertHardcopy','off'); % to preserve the bgcolor when saving it 77 | saveas(gcf,'../results/eg_shapePair.png') 78 | -------------------------------------------------------------------------------- /examples/example_shapeWithLandmarks.m: -------------------------------------------------------------------------------- 1 | clc; clear; close all; 2 | addpath('../func_render/'); 3 | addpath('../func_other/'); 4 | mesh_dir = '../data/'; 5 | %% 6 | % load the shape 7 | S1 = MESH_IO.read_shape([mesh_dir, 'cat0.off']); 8 | % specify the landmark ID 9 | lmk_id = [1000,5500,10000]; 10 | % define the mesh color 11 | S1_col = S1.surface.VERT; 12 | % define the color for each landmark (can be different) 13 | lmk_col = repmat([0.98,0.98,0.98], length(lmk_id), 1); 14 | % define the radius of the landmarks 15 | radius = 10; % by default, the radius is average edge length :) 16 | 17 | %% construct a new mesh with the shape and the landmark spheres 18 | [S_combined, col_combined] = merge_mesh_with_landmarks(S1, lmk_id, S1_col, lmk_col, radius); 19 | 20 | % rendering 21 | figure(1); 22 | render_mesh(S_combined,... 23 | 'MeshVtxColor',col_combined,... 24 | 'RotationOps',{[0,0,-20]},... 25 | 'CameraPos',[-15,10],... 26 | 'FaceAlpha',0.98); 27 | set(gcf,'Position', [50 50 600 600]); 28 | saveas(gcf,'../results/eg_shapeWithLandmarks.png') 29 | %% rendering: different transparancy for the shape and the landmarks 30 | figure(2); clf; 31 | render_mesh(S_combined,... 32 | 'MeshVtxColor',col_combined,... % [R G B] for each of the vertex 33 | 'CameraPos',[-40,3],... 34 | 'FaceAlpha',0.99); hold on; 35 | 36 | render_mesh(S1,... 37 | 'MeshVtxColor',S1_col,... % [R G B] for each of the vertex 38 | 'CameraPos',[-40,3],... 39 | 'FaceAlpha',0.3); hold on; 40 | 41 | -------------------------------------------------------------------------------- /examples/example_singeShape.m: -------------------------------------------------------------------------------- 1 | clc; clear; close all; 2 | addpath('../func_render/'); 3 | addpath('../func_other/'); 4 | mesh_dir = '../data/'; 5 | 6 | % load the shape 7 | S1 = MESH_IO.read_shape([mesh_dir, 'tr_reg_001.off']); 8 | %% mesh with color from the vertex position 9 | % the 2nd argument controls the color-scheme of the shape 10 | % try any permutation of [1,2,3] with different signs, e.g., [1,2,3], [-3,-2,1] 11 | S1_col = get_mesh_face_color(S1, [-2,-1,3]); 12 | figure(1); 13 | [~, ~, S1_new] = render_mesh(S1,... 14 | 'MeshVtxColor', S1_col,... 15 | 'RotationOps',{[-90,0,0],[0,0,20]},... % apply rotations to S1, the return S1_new is the rotated version of S1 16 | 'CameraPos',[-10,10],... 17 | 'FaceAlpha',0.9); 18 | 19 | set(gcf,'Position', [50 50 600 600]); 20 | saveas(gcf,'../results/eg_singleShape_colorFromVertex.png') 21 | 22 | %% mesh with a single color 23 | renderOptions = {'RotationOps',{[-90,0,0],[0,0,20]},... 24 | 'CameraPos',[-10,10],... 25 | 'FaceAlpha',0.9,... 26 | 'BackgroundColor',[0.5,0.5,0.5]}; % you can change the background color here 27 | 28 | figure(1); clf; 29 | S1_col = repmat([0.98, 0.98, 0.98], S1.nv, 1); 30 | render_mesh(S1,... 31 | 'MeshVtxColor', S1_col,... 32 | renderOptions{:}); 33 | 34 | set(gcf,'Position', [50 50 600 600]); 35 | set(gcf,'Color', [0.5,0.5,0.5],'InvertHardcopy','off'); 36 | saveas(gcf,'../results/eg_singleShape_singleCol.png') 37 | 38 | %% visaulize a function on the mesh 39 | f1 = S1.surface.X; % a function defined on the shape 40 | 41 | f_min = min(f1); f_max = max(f1); % for consistent/comparable color axis 42 | 43 | color_min = [14,77,146]/255; 44 | color_ave = [1,1,1]; 45 | color_max = [213,94,0]/255; 46 | 47 | range_col = [color_min; color_ave; color_max]; 48 | 49 | S1_col = assign_color_for_scalar_func(f1,f_min,f_max,range_col); 50 | 51 | figure(1); clf; 52 | render_mesh(S1,... 53 | 'MeshVtxColor', S1_col,... 54 | renderOptions{:}); 55 | 56 | set(gcf,'Position', [50 50 600 600]); 57 | set(gcf,'Color', [0.5,0.5,0.5],'InvertHardcopy','off'); % to preserve the bgcolor when saving it 58 | saveas(gcf,'../results/eg_singleShape_visualizeFunction.png') 59 | %% visualize all the edges: can be very slow if mesh is large!! 60 | figure(1); clf; 61 | S1_col = repmat([0.98, 0.98, 0.98], S1.nv, 1); 62 | [~,~, S1_new] = render_mesh(S1,... 63 | 'MeshVtxColor', S1_col,... 64 | renderOptions{:}); hold on; 65 | 66 | all_edges = get_edge_list(S1); % get the edge list 67 | vertex = S1_new.surface.VERT'; % get the vertex positions after the rotations! 68 | 69 | % visualize all the edges - can be really slow if the mesh is large 70 | edges = all_edges; 71 | % visualize a subset: 72 | edges = all_edges(1:1800,:); 73 | x = [ vertex(1,edges(:,1)); vertex(1,edges(:,2))]; 74 | y = [ vertex(2,edges(:,1)); vertex(2,edges(:,2))]; 75 | z = [ vertex(3,edges(:,1)); vertex(3,edges(:,2))]; 76 | line(x,y,z, 'color', [0.2,0.2,0.2], 'LineWidth',0.2); hold off; % change the edge color here 77 | 78 | set(gcf,'Position', [50 50 600 600]); 79 | set(gcf,'Color', [0.5,0.5,0.5],'InvertHardcopy','off'); % to preserve the bgcolor when saving it 80 | saveas(gcf,'../results/eg_singleShape_subsetEdges.png') 81 | %% visualize a vector filed on a mesh 82 | [Nv, Nf] = compute_vtx_and_face_normals(S1); 83 | 84 | figure(1); clf; 85 | S1_col = repmat([0.98, 0.98, 0.98], S1.nv, 1); 86 | render_mesh(S1,... 87 | 'MeshVtxColor', S1_col,... 88 | 'VecField', Nv,... 89 | renderOptions{:}); 90 | 91 | set(gcf,'Position', [50 50 600 600]); 92 | set(gcf,'Color', [0.5,0.5,0.5],'InvertHardcopy','off'); % to preserve the bgcolor when saving it 93 | saveas(gcf,'../results/eg_singleShape_vectorField.png') 94 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/func_other/+MESH_IO/.DS_Store -------------------------------------------------------------------------------- /func_other/+MESH_IO/generate_tex_coords.m: -------------------------------------------------------------------------------- 1 | % generate texture coordinates per vertex by projecting to the plane of 2 | % col1, col2 coordinates (signed) and stretch so that the texture appears 3 | % mult_const times. 4 | function vt = generate_tex_coords(v, col1, col2, mult_const) 5 | 6 | vt = [sign(col1)*v(:, abs(col1)), sign(col2)*v(:, abs(col2))]; 7 | vt = bsxfun(@minus, vt, min(vt)); 8 | 9 | max_vt = max(vt(:)); 10 | vt = mult_const * vt / max_vt; 11 | end 12 | 13 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/readObj.m: -------------------------------------------------------------------------------- 1 | function [VERT, TRIV] = readObj(filename) 2 | 3 | if length(strsplit(filename,'.')) > 1 4 | fid = fopen(filename,'r'); 5 | else % without file extension 6 | fid = fopen([filename, '.obj'],'r'); 7 | end 8 | 9 | if fid==-1 10 | error('Cannot open the file: %s\n',filename); 11 | end 12 | 13 | %C = textscan(fid,'%s %f %f %f','Whitespace',' //','commentStyle','#'); 14 | C = textscan(fid,'%s %f %f %f','commentStyle','#'); 15 | 16 | 17 | fclose(fid); 18 | 19 | vertices = strcmp(C{1}(:), 'v'); 20 | 21 | X = C{2}(vertices); 22 | Y = C{3}(vertices); 23 | Z = C{4}(vertices); 24 | 25 | VERT = [X,Y,Z]; 26 | 27 | triangles = strcmp(C{1}(:),'f'); 28 | 29 | ntriangles = sum(triangles); 30 | 31 | T1 = C{2}(triangles); 32 | T2 = C{3}(triangles); 33 | T3 = C{4}(triangles); 34 | TRIV = [T1 T2 T3]; 35 | 36 | %trisurf(T,X,Y,Z); 37 | 38 | end 39 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/readOff.m: -------------------------------------------------------------------------------- 1 | function [X,T] = readOff(filename) 2 | 3 | if length(strsplit(filename,'.')) > 1 4 | fid = fopen(filename,'r'); 5 | else % without file extension 6 | fid = fopen([filename, '.off'],'r'); 7 | end 8 | 9 | if( fid==-1 ) 10 | error('Cannot open the file: %s\n',filename); 11 | end 12 | 13 | str = fgets(fid); % -1 if eof 14 | 15 | if strcmp(str(1:4), 'COFF') 16 | [X,T,~] = readCoff(filename,4); % assume 4 color channels 17 | return; 18 | end 19 | 20 | if ~strcmp(str(1:3), 'OFF') 21 | error('The file is not a valid OFF one.'); 22 | end 23 | 24 | str = fgets(fid); 25 | sizes = sscanf(str, '%d %d', 2); 26 | while length(sizes) ~= 2 27 | str = fgets(fid); 28 | sizes = sscanf(str, '%d %d', 2); 29 | end 30 | nv = sizes(1); 31 | nf = sizes(2); 32 | 33 | % Read vertices 34 | [X,cnt] = fscanf(fid,'%lf %lf %lf\n', [3,nv]); 35 | if cnt~=3*nv 36 | warning('Problem in reading vertices.'); 37 | end 38 | X = X'; 39 | 40 | [T,cnt] = fscanf(fid,'3 %ld %ld %ld\n', [3,inf]); 41 | if isempty(T) 42 | [T,cnt] = fscanf(fid,'4 %ld %ld %ld %ld\n', [4,inf]); 43 | end 44 | T = double(T'+1); 45 | 46 | fclose(fid); -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/readPly.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/func_other/+MESH_IO/private/readPly.m -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/readobj_fast.m: -------------------------------------------------------------------------------- 1 | function [T,X,Y,Z] = readobj_fast(filename) 2 | 3 | if length(strsplit(filename,'.')) > 1 4 | fid = fopen(filename,'r'); 5 | else % without file extension 6 | fid = fopen([filename, '.obj'],'r'); 7 | end 8 | 9 | if fid==-1 10 | error('Cannot open the file: %s\n',filename); 11 | end 12 | 13 | %C = textscan(fid,'%s %f %f %f','Whitespace',' //','commentStyle','#'); 14 | C = textscan(fid,'%s %f %f %f','commentStyle','#'); 15 | 16 | 17 | fclose(fid); 18 | 19 | vertices = strcmp(C{1}(:), 'v'); 20 | 21 | X = C{2}(vertices); 22 | Y = C{3}(vertices); 23 | Z = C{4}(vertices); 24 | 25 | triangles = strcmp(C{1}(:),'f'); 26 | 27 | ntriangles = sum(triangles); 28 | 29 | T1 = C{2}(triangles); 30 | T2 = C{3}(triangles); 31 | T3 = C{4}(triangles); 32 | T = [T1 T2 T3]; 33 | 34 | %trisurf(T,X,Y,Z); 35 | 36 | end 37 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/writeOFF.m: -------------------------------------------------------------------------------- 1 | function writeOFF(filename, V,F,UV,C,N) 2 | % WRITEOFF writes an OFF file with vertex/face information 3 | % 4 | % writeOFF(filename,V,F) 5 | % writeOFF(filename,V,F,UV,C,N) 6 | % 7 | % Input: 8 | % filename path to .obj file 9 | % V #V by 3 list of vertices 10 | % F #F by 3 list of triangle indices 11 | % UV #V by 2 list of texture coordinates 12 | % C #V by 3 list of colors 13 | % N #V by 3 list of normals 14 | 15 | %disp(['writing: ',filename]); 16 | 17 | hasN = exist('N','var') && ~isempty(N); 18 | hasUV = exist('UV','var') && ~isempty(UV); 19 | hasC = exist('C','var') && ~isempty(C); 20 | 21 | OFFheader = 'OFF'; 22 | 23 | OFFV = V; 24 | 25 | if hasN 26 | OFFheader = ['N',OFFheader]; 27 | OFFV = [OFFV N]; 28 | end 29 | 30 | if hasC 31 | OFFheader = ['C',OFFheader]; 32 | OFFV = [OFFV C]; 33 | end 34 | 35 | if hasUV 36 | OFFheader = ['ST',OFFheader]; 37 | OFFV = [OFFV UV]; 38 | end 39 | 40 | f = fopen( filename, 'wt' ); 41 | fprintf(f, [OFFheader,'\n']); 42 | fprintf(f, '%d %d 0\n', size(V,1), size(F, 1)); 43 | 44 | switch size(OFFV, 2) 45 | case 3; fprintf(f, '%0.17g %0.17g %0.17g\n', OFFV'); 46 | case 5; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 47 | case 6; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 48 | case 7; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 49 | case 8; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 50 | case 9; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 51 | case 10; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 52 | case 11; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 53 | otherwise; error('Unsupported number of vertex entries'); 54 | end 55 | 56 | if (~isempty(F)) F; F = F - 1; end 57 | 58 | switch size(F, 2) 59 | case 0; 60 | case 1; fprintf( f, '1 %d\n', F'); 61 | case 2; fprintf( f, '2 %d %d\n', F'); 62 | case 3; fprintf( f, '3 %d %d %d\n', F'); 63 | case 4; fprintf( f, '4 %d %d %d %d\n', F'); 64 | case 5; fprintf( f, '5 %d %d %d %d %d\n', F'); 65 | otherwise; error('Unsupported number of vertex entries'); 66 | end 67 | 68 | fclose(f); 69 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/writeObj.m: -------------------------------------------------------------------------------- 1 | function writeObj(filename, mesh) 2 | 3 | fid = fopen(filename,'wt'); 4 | if( fid==-1 ), error('Can''t open the file.'); end 5 | 6 | vertex = [mesh.surface.X,mesh.surface.Y,mesh.surface.Z]; 7 | face = mesh.surface.TRIV; 8 | 9 | % vertex position 10 | fprintf(fid,'# nv = %d\n',size(vertex,1)); 11 | fprintf(fid, 'v %f %f %f\n', vertex'); 12 | 13 | % face 14 | fprintf(fid,'# nf = %d\n',size(face,1)); 15 | fprintf(fid, 'f %d %d %d\n', face'); 16 | fclose(fid); 17 | 18 | end 19 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/private/write_obj.m: -------------------------------------------------------------------------------- 1 | function write_obj(path, filename, vertex, face, options) 2 | 3 | % write_off - write a mesh to an OBJ file 4 | % 5 | % write_obj(filename, vertex, face, options) 6 | % 7 | % vertex must be of size [n,3] 8 | % face must be of size [p,3] 9 | % 10 | % Copyright (c) 2004 Gabriel Peyr 11 | 12 | if nargin<0 13 | options.null = 0; 14 | end 15 | 16 | if size(vertex,2)~=3 17 | vertex=vertex'; 18 | end 19 | if size(vertex,2)~=3 20 | error('vertex does not have the correct format.'); 21 | end 22 | 23 | 24 | if size(face,2)~=3 25 | face=face'; 26 | end 27 | if size(face,2)~=3 28 | error('face does not have the correct format.'); 29 | end 30 | 31 | fid = fopen([path, filename],'wt'); 32 | if( fid==-1 ) 33 | error('Can''t open the file.'); 34 | return; 35 | end 36 | 37 | object_name = filename(1:end-4); 38 | 39 | fprintf(fid, '# write_obj (c) 2004 Gabriel Peyr\n'); 40 | if isfield(options, 'nm_file') 41 | fprintf(fid, 'mtllib ./%s.mtl\n', object_name); 42 | end 43 | 44 | %object_name = 'curobj'; 45 | 46 | fprintf(fid, ['g\n# object ' object_name ' to come\n']); 47 | 48 | % vertex position 49 | fprintf(fid, '# %d vertex\n', size(vertex,1)); 50 | fprintf(fid, 'v %f %f %f\n', vertex'); 51 | 52 | % use mtl 53 | fprintf(fid, ['g ' object_name '_export\n']); 54 | mtl_bump_name = 'material_0'; 55 | fprintf(fid, ['usemtl ' mtl_bump_name '\n']); 56 | 57 | % face 58 | fprintf(fid, '# %d faces\n', size(face,1)); 59 | if isfield(options, 'face_texcorrd') 60 | face_texcorrd = [face(:,1), options.face_texcorrd(:,1), face(:,2), options.face_texcorrd(:,2), face(:,3), options.face_texcorrd(:,3)]; 61 | else 62 | face_texcorrd = [face(:,1), face(:,1), face(:,2), face(:,2), face(:,3), face(:,3)]; 63 | end 64 | fprintf(fid, 'f %d/%d %d/%d %d/%d\n', face_texcorrd'); 65 | 66 | % vertex texture 67 | if isfield(options, 'nm_file') 68 | fprintf(fid, 'vt %f %f\n', options.object_texture'); 69 | else 70 | % create dummy vertex texture 71 | vertext = vertex(:,1:2)*0 - 1; 72 | % vertex position 73 | fprintf(fid, '# %d vertex texture\n', size(vertext,1)); 74 | fprintf(fid, 'vt %f %f\n', vertext'); 75 | end 76 | 77 | fclose(fid); 78 | 79 | 80 | % MTL generation 81 | if isfield(options, 'nm_file') 82 | mtl_file = [object_name '.mtl']; 83 | fid = fopen([path, mtl_file],'wt'); 84 | if( fid==-1 ) 85 | error('Can''t open the file.'); 86 | return; 87 | end 88 | 89 | Ka = [0.2 0.2 0.2]; 90 | Kd = [1 1 1]; 91 | Ks = [1 1 1]; 92 | Tr = 1; 93 | Ns = 0; 94 | illum = 2; 95 | 96 | fprintf(fid, '# write_obj (c) 2004 Gabriel Peyr\n'); 97 | 98 | fprintf(fid, 'newmtl %s\n', mtl_bump_name); 99 | fprintf(fid, 'Ka %f %f %f\n', Ka); 100 | fprintf(fid, 'Kd %f %f %f\n', Kd); 101 | fprintf(fid, 'Ks %f %f %f\n', Ks); 102 | fprintf(fid, 'Tr %d\n', Tr); 103 | fprintf(fid, 'Ns %d\n', Ns); 104 | fprintf(fid, 'illum %d\n', illum); 105 | fprintf(fid, 'map_Kd %s\n', options.nm_file); 106 | 107 | fprintf(fid, '#\n# EOF\n'); 108 | 109 | fclose(fid); 110 | end -------------------------------------------------------------------------------- /func_other/+MESH_IO/read_shape.m: -------------------------------------------------------------------------------- 1 | function S = read_shape(filename) 2 | import MESH_IO.* 3 | fprintf('Reading mesh...'); tic; 4 | fname = strsplit(filename,'.'); 5 | if length(fname) > 1 6 | if strcmp(fname{end},'obj') 7 | [X,T] = readObj(filename); 8 | elseif strcmp(fname{end},'off') 9 | [X,T] = readOff(filename); 10 | else 11 | error('cannot read .%s file',fname{end}); 12 | end 13 | else % no input file extension 14 | if exist([filename,'.obj'],'file') 15 | [X,T] = readObj(filename); 16 | elseif exist([filename,'.off'],'file') 17 | [X,T] = readOff(filename); 18 | else 19 | error('file not found: %s\n',filename) 20 | end 21 | end 22 | 23 | S.surface.TRIV = double(T); 24 | S.surface.X = X(:,1); 25 | S.surface.Y = X(:,2); 26 | S.surface.Z = X(:,3); 27 | S.surface.VERT = X; 28 | S.nf = size(T,1); 29 | S.nv = size(X,1); 30 | S.name = shape_name(filename); 31 | t = toc; fprintf('done:%.4fs\n',t); 32 | end -------------------------------------------------------------------------------- /func_other/+MESH_IO/shape_name.m: -------------------------------------------------------------------------------- 1 | function mesh_name = shape_name(filename) 2 | mesh_name = strsplit(filename,'\'); 3 | mesh_name = strsplit(mesh_name{end},'/'); 4 | mesh_name = strsplit(mesh_name{end},'.'); 5 | mesh_name = mesh_name{1}; 6 | end -------------------------------------------------------------------------------- /func_other/+MESH_IO/wobj_with_texture.m: -------------------------------------------------------------------------------- 1 | % Output M to an obj file 2 | % uv - texture coordinates. 3 | % iname - filename for texture image 4 | % fname - output file name 5 | function wobj_with_texture(M, uv, iname, fname) 6 | 7 | options.object_texture = uv; 8 | options.nm_file = iname; 9 | 10 | [pathstr,name] = fileparts(fname); 11 | write_obj([pathstr,'/'], [name '.obj'], M.surface.VERT, M.surface.TRIV, options); 12 | end -------------------------------------------------------------------------------- /func_other/+MESH_IO/writeOFF.m: -------------------------------------------------------------------------------- 1 | function writeOFF(filename, V,F,UV,C,N) 2 | % WRITEOFF writes an OFF file with vertex/face information 3 | % 4 | % writeOFF(filename,V,F) 5 | % writeOFF(filename,V,F,UV,C,N) 6 | % 7 | % Input: 8 | % filename path to .obj file 9 | % V #V by 3 list of vertices 10 | % F #F by 3 list of triangle indices 11 | % UV #V by 2 list of texture coordinates 12 | % C #V by 3 list of colors 13 | % N #V by 3 list of normals 14 | 15 | %disp(['writing: ',filename]); 16 | 17 | hasN = exist('N','var') && ~isempty(N); 18 | hasUV = exist('UV','var') && ~isempty(UV); 19 | hasC = exist('C','var') && ~isempty(C); 20 | 21 | OFFheader = 'OFF'; 22 | 23 | OFFV = V; 24 | 25 | if hasN 26 | OFFheader = ['N',OFFheader]; 27 | OFFV = [OFFV N]; 28 | end 29 | 30 | if hasC 31 | OFFheader = ['C',OFFheader]; 32 | OFFV = [OFFV C]; 33 | end 34 | 35 | if hasUV 36 | OFFheader = ['ST',OFFheader]; 37 | OFFV = [OFFV UV]; 38 | end 39 | 40 | f = fopen( filename, 'wt' ); 41 | fprintf(f, [OFFheader,'\n']); 42 | fprintf(f, '%d %d 0\n', size(V,1), size(F, 1)); 43 | 44 | switch size(OFFV, 2) 45 | case 3; fprintf(f, '%0.17g %0.17g %0.17g\n', OFFV'); 46 | case 5; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 47 | case 6; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 48 | case 7; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 49 | case 8; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 50 | case 9; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 51 | case 10; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 52 | case 11; fprintf(f, '%0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g %0.17g\n', OFFV'); 53 | otherwise; error('Unsupported number of vertex entries'); 54 | end 55 | 56 | if (~isempty(F)) F; F = F - 1; end 57 | 58 | switch size(F, 2) 59 | case 0; 60 | case 1; fprintf( f, '1 %d\n', F'); 61 | case 2; fprintf( f, '2 %d %d\n', F'); 62 | case 3; fprintf( f, '3 %d %d %d\n', F'); 63 | case 4; fprintf( f, '4 %d %d %d %d\n', F'); 64 | case 5; fprintf( f, '5 %d %d %d %d %d\n', F'); 65 | otherwise; error('Unsupported number of vertex entries'); 66 | end 67 | 68 | fclose(f); 69 | -------------------------------------------------------------------------------- /func_other/+MESH_IO/writeObj.m: -------------------------------------------------------------------------------- 1 | function writeObj(filename, mesh) 2 | 3 | fid = fopen(filename,'wt'); 4 | if( fid==-1 ), error('Can''t open the file.'); end 5 | 6 | vertex = [mesh.surface.X,mesh.surface.Y,mesh.surface.Z]; 7 | face = mesh.surface.TRIV; 8 | 9 | % vertex position 10 | fprintf(fid,'# nv = %d\n',size(vertex,1)); 11 | fprintf(fid, 'v %f %f %f\n', vertex'); 12 | 13 | % face 14 | fprintf(fid,'# nf = %d\n',size(face,1)); 15 | fprintf(fid, 'f %d %d %d\n', face'); 16 | fclose(fid); 17 | end 18 | -------------------------------------------------------------------------------- /func_other/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/func_other/.DS_Store -------------------------------------------------------------------------------- /func_other/calc_tri_areas.m: -------------------------------------------------------------------------------- 1 | function S_tri = calc_tri_areas(M) 2 | 3 | getDiff = @(a,b)M.VERT(M.TRIV(:,a),:) - M.VERT(M.TRIV(:,b),:); 4 | getTriArea = @(X,Y).5*sqrt(sum(cross(X,Y).^2,2)); 5 | S_tri = getTriArea(getDiff(1,2),getDiff(1,3)); 6 | 7 | 8 | % S_tri = zeros(size(M.TRIV,1),1); 9 | % 10 | % for k=1:size(M.TRIV,1) 11 | % e1 = M.VERT(M.TRIV(k,3),:) - M.VERT(M.TRIV(k,1),:); 12 | % e2 = M.VERT(M.TRIV(k,2),:) - M.VERT(M.TRIV(k,1),:); 13 | % S_tri(k) = 0.5*norm(cross(e1,e2)); 14 | % end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /func_other/compute_vtx_and_face_normals.m: -------------------------------------------------------------------------------- 1 | function [Nv, Nf] = compute_vtx_and_face_normals(mesh) 2 | % computes mesh normals per face and per vertex 3 | 4 | fprintf('Compute vtx and face normals...'); tic; 5 | F = mesh.surface.TRIV'; 6 | V = [mesh.surface.X'; mesh.surface.Y'; mesh.surface.Z']; 7 | 8 | Nf = cross(V(1:3,F(2,:)) - V(1:3,F(1,:)), V(1:3,F(3,:)) - V(1:3, F(1,:))); 9 | Fa = 0.5 * sqrt( sum( Nf.^2, 1) ); 10 | for i = 1:size(F,2) 11 | Nf(:, i) = Nf(:, i) ./ sqrt( sum(Nf(:, i).^2 ) ); 12 | end 13 | 14 | Nv = zeros(3, size(V, 2)); 15 | 16 | for i = 1:size(F,2) 17 | for j = 1:3 18 | if j == 1 19 | la = sum((V( 1:3, F(1, i) ) - V( 1:3, F(2, i) )).^2); 20 | lb = sum((V( 1:3, F(1, i) ) - V( 1:3, F(3, i) )).^2); 21 | W = Fa(i) / (la * lb); 22 | if (isinf(W) || isnan(W)) W = 0; end 23 | elseif j == 2 24 | la = sum((V( 1:3, F(2, i) ) - V( 1:3, F(1, i) )).^2); 25 | lb = sum((V( 1:3, F(2, i) ) - V( 1:3, F(3, i) )).^2); 26 | W = Fa(i) / (la * lb); 27 | if (isinf(W) || isnan(W)), W = 0; end 28 | else 29 | la = sum((V( 1:3, F(3, i) ) - V( 1:3, F(1, i) )).^2); 30 | lb = sum((V( 1:3, F(3, i) ) - V( 1:3, F(2, i) )).^2); 31 | W = Fa(i) / (la * lb); 32 | if (isinf(W) || isnan(W)), W = 0; end 33 | end 34 | Nv(1:3, F(j, i) ) = Nv(1:3, F(j, i)) + Nf(1:3, i) * W; 35 | end 36 | end 37 | 38 | % normalize the normal vectors so that they are unit length 39 | for i = 1:size(V,2) 40 | Nv(:, i) = Nv(:, i) ./ sqrt( sum(Nv(:, i).^2 ) ); 41 | end 42 | 43 | Nv = Nv'; 44 | Nf = Nf'; 45 | 46 | t = toc; fprintf('done: %.4fs\n',t); 47 | 48 | end 49 | 50 | -------------------------------------------------------------------------------- /func_other/fps_euclidean.m: -------------------------------------------------------------------------------- 1 | function idx = fps_euclidean(S,k,seed) 2 | % Euclidean farthest point sampling. 3 | % Input: can be a surface, or data matrix (each row is one sample) 4 | if isstruct(S) 5 | C = [S.surface.X, S.surface.Y, S.surface.Z]; 6 | else 7 | C = S; 8 | end 9 | nv = size(C,1); 10 | 11 | if(nargin<3) 12 | idx = randi(nv,1); 13 | else 14 | idx = seed; 15 | end 16 | 17 | dists = bsxfun(@minus,C,C(idx,:)); 18 | dists = sum(dists.^2,2); 19 | 20 | for i = 1:k 21 | maxi = find(dists == max(dists)); 22 | maxi = maxi(1); 23 | idx = [idx; maxi]; 24 | newdists = bsxfun(@minus,C,C(maxi,:)); 25 | newdists = sum(newdists.^2,2); 26 | dists = min(dists,newdists); 27 | end 28 | 29 | idx = idx(2:end); 30 | end -------------------------------------------------------------------------------- /func_other/get_edge_list.m: -------------------------------------------------------------------------------- 1 | % get the edge list and the corresponding edge weight 2 | function [Elist,K] = get_edge_list(S) 3 | T = S.surface.TRIV; 4 | 5 | I = [T(:,1);T(:,2);T(:,3)]; 6 | J = [T(:,2);T(:,3);T(:,1)]; 7 | 8 | Elisto = [I,J]; 9 | sElist = sort(Elisto,2); 10 | [Elist,~] = unique(sElist, 'rows'); 11 | 12 | if nargout > 1 % get edge weight 13 | n = size(S.A,1); % num of vtx 14 | ind = sub2ind([n,n],Elist(:,1),Elist(:,2)); 15 | if isfield(S,'W') 16 | W = S.W; 17 | K = -W(ind); % true edge weights 18 | else 19 | W = cotLaplacian([S.surface.X, S.surface.Y, S.surface.Z], S.surface.TRIV); 20 | K = -W(ind); 21 | end 22 | end 23 | end -------------------------------------------------------------------------------- /func_other/mesh_with_consistent_fields.m: -------------------------------------------------------------------------------- 1 | function S = mesh_with_consistent_fields(S) 2 | if ~isstruct(S) 3 | error('The input should be a mesh with cell structure') 4 | else 5 | names = fieldnames(S); 6 | if isfield(S,'T') 7 | [~,id1] = ismember('T',fieldnames(S)); 8 | else 9 | id1 = find(~cellfun(@isempty,... 10 | cellfun(@(x) findstr('TRI',x) == 1,upper(names),'UniformOutput',false))); %#ok 11 | end 12 | if isfield(S,'X') 13 | [~,id2] = ismember('X',fieldnames(S)); 14 | else 15 | id2 = find(~cellfun(@isempty,... 16 | cellfun(@(x) findstr('VER',x) == 1,upper(names),'UniformOutput',false))); %#ok 17 | end 18 | if ~isfield(S,'surface') 19 | if isempty(id1) || isempty(id2) 20 | error('The input should be a mesh!') 21 | end 22 | end 23 | 24 | end 25 | if isfield(S,'surface') % case 01: mesh has structure S.surface.{X,Y,Z,TRIV} 26 | if ~isfield(S,'VERT') 27 | S.VERT = [S.surface.X,S.surface.Y,S.surface.Z]; 28 | end 29 | if ~isfield(S,'TRIV') 30 | S.TRIV = S.surface.TRIV; 31 | end 32 | if ~isfield(S.surface,'VERT') 33 | S.surface.VERT = S.VERT; 34 | end 35 | else % case 02: mesh has structure S.VERT + S.TRIV 36 | if ~strcmp(names{id1},'TRIV') 37 | S.TRIV = getfield(S, names{id1}); 38 | end 39 | 40 | if ~strcmp(names{id2},'VERT') 41 | S.VERT = getfield(S, names{id2}); 42 | end 43 | S.surface.X = S.VERT(:,1); 44 | S.surface.Y = S.VERT(:,2); 45 | S.surface.Z = S.VERT(:,3); 46 | S.surface.TRIV = S.TRIV; 47 | S.surface.VERT = S.VERT; 48 | end 49 | 50 | S.nv = length(S.surface.X); 51 | S.n = S.nv; 52 | S.nf = size(S.surface.TRIV,1); 53 | S.m = S.nf; 54 | if ~isfield(S,'name'), S.name = ''; end 55 | end 56 | 57 | -------------------------------------------------------------------------------- /func_other/my_plywrite.m: -------------------------------------------------------------------------------- 1 | function my_plywrite(filename,faces,verts,rgb) 2 | % plywrite(filename,faces,verts) 3 | % Will write a face vertex mesh data in ply format. 4 | % faces -> polygonal descriptions in terms of vertex indices 5 | % verts -> list of vertex coordinate triplets 6 | % faces and verts can be obtained by using the MATLAB isosurface function. 7 | % 8 | % plywrite(filename,faces,verts,rgb) 9 | % Will add color information. 10 | % rgb -> optional list of RGB triplets per vertex 11 | % 12 | % A by-product of ongoing computational materials science research 13 | % at MINED@Gatech.(http://mined.gatech.edu/) 14 | % 15 | % Copyright (c) 2015, Ahmet Cecen and MINED@Gatech - All rights reserved. 16 | 17 | % Create File 18 | fileID = fopen(filename,'w'); 19 | 20 | 21 | % Plain Mesh 22 | if nargin == 3 23 | 24 | % Insert Header 25 | fprintf(fileID, ... 26 | ['ply\n', ... 27 | 'format ascii 1.0\n', ... 28 | 'element vertex %u\n', ... 29 | 'property double x\n', ... 30 | 'property double y\n', ... 31 | 'property double z\n', ... 32 | 'element face %u\n', ... 33 | 'property list uint8 int32 vertex_indices\n', ... 34 | 'end_header\n'], ... 35 | length(verts),size(faces,1)); 36 | 37 | % Insert Colored Vertices 38 | for i=1:length(verts) 39 | fprintf(fileID, ... 40 | ['%.16f ', ... 41 | '%.16f ', ... 42 | '%.16f\n'], ... 43 | verts(i,1),verts(i,2),verts(i,3)); 44 | end 45 | 46 | % Insert Faces 47 | dlmwrite(filename,[size(faces,2)*ones(size(faces,1),1),faces-1],'-append','delimiter',' ','precision',10); 48 | 49 | % Colored Mesh 50 | elseif nargin == 4 51 | 52 | % rgb=varargin{1}; 53 | 54 | % Insert Header 55 | fprintf(fileID, ... 56 | ['ply\n', ... 57 | 'format ascii 1.0\n', ... 58 | 'element vertex %u\n', ... 59 | 'property double x\n', ... 60 | 'property double y\n', ... 61 | 'property double z\n', ... 62 | 'property uchar red\n', ... 63 | 'property uchar green\n', ... 64 | 'property uchar blue\n', ... 65 | 'property uchar alpha\n', ... 66 | 'element face %u\n', ... 67 | 'property list uint8 int32 vertex_indices\n', ... 68 | 'end_header\n'], ... 69 | length(verts),size(faces,1)); 70 | 71 | % Insert Colored Vertices 72 | for i=1:length(verts) 73 | fprintf(fileID, ... 74 | ['%.16f ', ... 75 | '%.16f ', ... 76 | '%.16f ', ... 77 | '%u ', ... 78 | '%u ', ... 79 | '%u ', ... 80 | '%u\n'], ... 81 | verts(i,1),verts(i,2),verts(i,3),rgb(i,1),rgb(i,2),rgb(i,3), 255); 82 | end 83 | 84 | % Insert Faces 85 | dlmwrite(filename,[size(faces,2)*ones(size(faces,1),1),faces-1],'-append','delimiter',' ','precision',10); 86 | 87 | end -------------------------------------------------------------------------------- /func_other/normalize_mesh_area.m: -------------------------------------------------------------------------------- 1 | function S = normalize_mesh_area(S_,a) 2 | if nargin < 2, a = 1; end 3 | S = S_; 4 | S.surface.TRIV = S_.surface.TRIV; 5 | S.surface.VERT = S_.surface.VERT/sqrt(sum(calc_tri_areas(S_.surface)))*sqrt(a); % rescale such that the mesh_area = 0.5 6 | S.surface.VERT = S.surface.VERT - mean(S.surface.VERT); 7 | S.surface.X = S.surface.VERT(:,1); 8 | S.surface.Y = S.surface.VERT(:,2); 9 | S.surface.Z = S.surface.VERT(:,3); 10 | 11 | end 12 | 13 | function S_tri = calc_tri_areas(M) 14 | 15 | getDiff = @(a,b)M.VERT(M.TRIV(:,a),:) - M.VERT(M.TRIV(:,b),:); 16 | getTriArea = @(X,Y).5*sqrt(sum(cross(X,Y).^2,2)); 17 | S_tri = getTriArea(getDiff(1,2),getDiff(1,3)); 18 | end 19 | -------------------------------------------------------------------------------- /func_other/pMap_NNinterp.m: -------------------------------------------------------------------------------- 1 | % 2018-05-09 2 | % T12_in: S1 -> S2 has NaN entries, i.e., no correspondences 3 | % assign them the same target as their nearest neighbor 4 | function [T12] = pMap_NNinterp(T12_in,S1) 5 | s1_mapped = find(~isnan(T12_in)); 6 | s1_unmapped = find(isnan(T12_in)); 7 | [~, vid] = min(S1.Gamma(s1_unmapped, s1_mapped),[],2); 8 | T12 = T12_in; 9 | T12(s1_unmapped) = T12_in(s1_mapped(vid)); 10 | end -------------------------------------------------------------------------------- /func_render/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/func_render/.DS_Store -------------------------------------------------------------------------------- /func_render/add_shadow.m: -------------------------------------------------------------------------------- 1 | function [h,L,M,ground] = add_shadow(T,L,varargin) 2 | % ADD_SHADOW Add a shadow for plotted mesh (t) according to light (l) 3 | % 4 | % h = add_shadow() % Apply to all 5 | % h = add_shadow(T,L) 6 | % h = add_shadow(T,L,'ParameterName',ParameterValue,...) 7 | % h = add_shadow([],[],'ParameterName',ParameterValue,...) % apply to all 8 | % 9 | % Inputs: 10 | % T #T list of trisurf handles {[] --> find all trisurf in `gca`} 11 | % L #L list of lights {[] --> find all light in `gca`} 12 | % Optional: 13 | % 'Ground' ground plane equation {[0 0 -1 min(Z)]} 14 | % 'Nudge' nudge the ground plane down a bit 15 | % 'Color' followed by 3-vector color {[0.21 0.21 0.21]} 16 | % 'BackgroundColor' followed by 3-vector color {[1 1 1]} 17 | % 'Fade' followed by: 18 | % 'none' constant shadow color 19 | % 'local' fade darker away from contact with ground (ape a spotlight) 20 | % 'infinite' fade lighter away from contact ground (ape infinite 21 | % light) 22 | % Outputs: 23 | % h #T*#L list of output shadow trisurf handles 24 | % L #L list of lights 25 | % M 4 by 4 by #T*#L shadow projection matrices 26 | % 27 | % Example: 28 | % t = tsurf(F,V,'EdgeColor','none',fphong,'SpecularStrength',0.1); 29 | % l = [ 30 | % light('Position',[-10 -10 13],'Style','local'); 31 | % light('Position',[10 -10 13],'Style','local')]; 32 | % camproj('persp'); 33 | % axis equal; 34 | % h = add_shadow(t,l); 35 | % apply_ambient_occlusion(t); 36 | % 37 | 38 | % default values 39 | ground = []; 40 | nudge = 0; 41 | color = [0.21 0.21 0.21]; 42 | background_color = [1 1 1]; 43 | fade = 'none'; 44 | % Map of parameter names to variable names 45 | params_to_variables = containers.Map( ... 46 | {'Ground','Nudge','BackgroundColor','Color','Fade'}, ... 47 | {'ground','nudge','background_color','color','fade'}); 48 | v = 1; 49 | while v <= numel(varargin) 50 | param_name = varargin{v}; 51 | if isKey(params_to_variables,param_name) 52 | assert(v+1<=numel(varargin)); 53 | v = v+1; 54 | % Trick: use feval on anonymous function to use assignin to this workspace 55 | feval(@()assignin('caller',params_to_variables(param_name),varargin{v})); 56 | else 57 | error('Unsupported parameter: %s',varargin{v}); 58 | end 59 | v=v+1; 60 | end 61 | 62 | if ~exist('T','var') || isempty(T) 63 | c = get(gca,'Children'); 64 | T = c(arrayfun(@(x) isa(x,'matlab.graphics.primitive.Patch'),c)); 65 | end 66 | if iscell(T) 67 | T = [T{:}]'; 68 | end 69 | T = T(:); 70 | 71 | if ~exist('L','var') || isempty(L) 72 | c = get(gca,'Children'); 73 | L = c(arrayfun(@(x) isa(x,'matlab.graphics.primitive.Light'),c)); 74 | if isempty(L) 75 | L = camlight; 76 | end 77 | end 78 | 79 | if isempty(ground) 80 | minZ = inf; 81 | for t = T' 82 | V = t.Vertices; 83 | minZ = min([V(:,3);minZ]); 84 | end 85 | ground = [0 0 -1 minZ-nudge]; 86 | end 87 | 88 | h = []; 89 | % need to specify that there are 0 "tubes" 90 | M = zeros([0,0,0]); 91 | for t = T' 92 | V = t.Vertices; 93 | for l = L' 94 | % plane equation 95 | % 0 = ax + by + cz + d 96 | light_pos = [l.Position strcmp(l.Style,'local')]; 97 | d = ground * light_pos'; 98 | shadow_mat = d*eye(4) - light_pos'*ground; 99 | U = [V ones(size(V,1),1)]*shadow_mat'; 100 | U = bsxfun(@rdivide,U(:,1:3),U(:,4)); 101 | 102 | hold on; 103 | tsh = trisurf(t.Faces,U(:,1),U(:,2),U(:,3), ... 104 | 'FaceColor',color, ... 105 | 'DiffuseStrength',0,'SpecularStrength',0, ... 106 | 'AmbientStrength',1, ... 107 | 'EdgeColor','none'); 108 | hold off; 109 | switch fade 110 | case {'local','infinite'} 111 | D = matrixnormalize( ... 112 | sum(bsxfun(@times,tsh.Vertices(:,1:2),l.Position(1:2)),2)); 113 | switch fade 114 | case 'infinite' 115 | D = 1.0-D; 116 | end 117 | tsh.FaceVertexCData = ... 118 | bsxfun(@plus,color,bsxfun(@times,D,background_color-color)); 119 | tsh.FaceColor = 'interp'; 120 | end 121 | h = [h;tsh]; 122 | M(:,:,end+1) = shadow_mat; 123 | end 124 | end 125 | end 126 | -------------------------------------------------------------------------------- /func_render/assign_color_for_scalar_func.m: -------------------------------------------------------------------------------- 1 | function mesh_col = assign_color_for_scalar_func(f,f_min,f_max,range_col) 2 | color_min = [0.88,0.88,0.88]; 3 | color_min = [14,77,146]/255; 4 | color_ave = [220,255,241]/255; 5 | color_max = [213,94,0]/255; 6 | 7 | 8 | if nargin < 2 9 | f_min = min(f); 10 | f_max = max(f); 11 | end 12 | 13 | if nargin > 3 14 | color_min = range_col(1,:); 15 | color_ave = range_col(2,:); 16 | color_max = range_col(3,:); 17 | end 18 | 19 | c_min = quantile(f,0.01); c_max= quantile(f,0.99); 20 | c_ave = (f_min+f_max)/2; 21 | 22 | if c_min ~= f_min 23 | c1 = interp1([f_min,c_min,c_ave,c_max,f_max],[color_min(1),color_min(1),color_ave(1),color_max(1),color_max(1)],f); 24 | c2 = interp1([f_min,c_min,c_ave,c_max,f_max],[color_min(2),color_min(2),color_ave(2),color_max(2),color_max(2)],f); 25 | c3 = interp1([f_min,c_min,c_ave,c_max,f_max],[color_min(3),color_min(3),color_ave(3),color_max(3),color_max(3)],f); 26 | else 27 | c1 = interp1([f_min,c_ave,f_max],[color_min(1),color_ave(1),color_max(1)],f); 28 | c2 = interp1([f_min,c_ave,f_max],[color_min(2),color_ave(2),color_max(2)],f); 29 | c3 = interp1([f_min,c_ave,f_max],[color_min(3),color_ave(3),color_max(3)],f); 30 | end 31 | mesh_col = [c1, c2, c3]; 32 | end -------------------------------------------------------------------------------- /func_render/get_mapped_face_color_withNaN.m: -------------------------------------------------------------------------------- 1 | function [S1_col,S2_col]= get_mapped_face_color_withNaN(S1, S2, map, col_idx, IFaddcoverage) 2 | if nargin < 5, IFaddcoverage = 0; end 3 | 4 | if nargin < 4, col_idx = [1,2,3]; end 5 | 6 | col_nan = [0.05,0.05,0.05]; 7 | 8 | 9 | X = S2.surface.VERT; 10 | X_new = X*diag(sign(col_idx)); 11 | X_new = X_new(:,abs(col_idx)); 12 | 13 | g1 = X_new(:,1); 14 | g2 = X_new(:,2); 15 | g3 = X_new(:,3); 16 | 17 | 18 | g1 = normalize_function(0,1,g1); 19 | g2 = normalize_function(0,1,g2); 20 | g3 = normalize_function(0,1,g3); 21 | 22 | g1 = cos(g1); 23 | g2 = cos(g2); 24 | g3 = cos(g3); 25 | 26 | g1 = normalize_function(0,1,g1); 27 | g2 = normalize_function(0,1,g2); 28 | g3 = normalize_function(0,1,g3); 29 | 30 | ind = find(~isnan(map)); 31 | 32 | f1 = col_nan(1)*ones(length(map),1); 33 | f2 = col_nan(2)*ones(length(map),1); 34 | f3 = col_nan(3)*ones(length(map),1); 35 | 36 | f1(ind) = g1(map(ind)); 37 | f2(ind) = g2(map(ind)); 38 | f3(ind) = g3(map(ind)); 39 | S1_col = [f1,f2,f3]; % S1 face color f 40 | S2_col = [g1,g2,g3]; % S2 face color g 41 | 42 | if IFaddcoverage 43 | n2 = size(S2.surface.X,1); 44 | mask = zeros(n2,1); 45 | mask(unique(map)) = 1; 46 | S2_col = [mask.*g1, mask.*g2, mask.*g3]; 47 | end 48 | 49 | end -------------------------------------------------------------------------------- /func_render/get_mesh_face_color.m: -------------------------------------------------------------------------------- 1 | function S2_col = get_mesh_face_color(S2, col_idx) 2 | if nargin < 2, col_idx = [1,2,3]; end 3 | 4 | 5 | X = S2.surface.VERT; 6 | X_new = X*diag(sign(col_idx)); 7 | X_new = X_new(:,abs(col_idx)); 8 | 9 | g1 = X_new(:,1); 10 | g2 = X_new(:,2); 11 | g3 = X_new(:,3); 12 | 13 | 14 | g1 = normalize_function(0,1,g1); 15 | g2 = normalize_function(0,1,g2); 16 | g3 = normalize_function(0,1,g3); 17 | 18 | g1 = cos(g1); 19 | g2 = cos(g2); 20 | g3 = cos(g3); 21 | 22 | g1 = normalize_function(0,1,g1); 23 | g2 = normalize_function(0,1,g2); 24 | g3 = normalize_function(0,1,g3); 25 | 26 | S2_col = [g1,g2,g3]; 27 | 28 | end -------------------------------------------------------------------------------- /func_render/merge_mesh_with_landmarks.m: -------------------------------------------------------------------------------- 1 | function [S_combined, col_combined] = merge_mesh_with_landmarks(S1, lmk_id, S1_col, lmk_col, radius) 2 | if nargin < 4 3 | lmk_col = repmat([0.8,0.8,0.8], length(lmk_id), 1); 4 | end 5 | if nargin < 5 6 | edge = get_edge_list(S1); 7 | radius = mean(sum((S1.surface.VERT(edge(:,1),:) - S1.surface.VERT(edge(:,2),:)).^2,2)); 8 | end 9 | sphere_base = MESH_IO.read_shape('sphere.obj'); 10 | lmk_spheres = cell(length(lmk_id),1); 11 | col_combined = S1_col; 12 | 13 | X1_new = S1.surface.VERT; 14 | 15 | for i = 1:length(lmk_id) 16 | sphere1 = normalize_mesh_area(sphere_base, radius*4*pi^2); 17 | sphere1.surface.VERT = sphere1.surface.VERT + X1_new(lmk_id(i),:); 18 | lmk_spheres{i} = sphere1; 19 | col_combined = [col_combined; repmat(lmk_col(i,:), sphere_base.nv,1)]; 20 | end 21 | %% combine the original mesh + landmark spheres to get nice shaddows for the lmks as well 22 | S_combined = S1; 23 | for i = 1:length(lmk_id) 24 | sphere1 = lmk_spheres{i}; 25 | S_combined.surface.TRIV = [S_combined.surface.TRIV; sphere1.surface.TRIV + size(S_combined.surface.VERT,1)]; 26 | S_combined.surface.VERT = [S_combined.surface.VERT; sphere1.surface.VERT]; 27 | end 28 | S_combined.surface.X = S_combined.surface.VERT(:,1); 29 | S_combined.surface.Y = S_combined.surface.VERT(:,2); 30 | S_combined.surface.Z = S_combined.surface.VERT(:,3); 31 | S_combined.nv = size(S_combined.surface.VERT,1); 32 | S_combined.nf = size(S_combined.surface.TRIV,1); 33 | 34 | end -------------------------------------------------------------------------------- /func_render/private/add_isolines.m: -------------------------------------------------------------------------------- 1 | function p = add_isolines(T,varargin); 2 | % ADD_ISOLINES Add isolines for plotted mesh (t) with scalar per-vertex 3 | % pseudocolor data 4 | % 5 | % p = add_isolines() % Apply to all 6 | % h = add_shadow(T) 7 | % h = add_shadow(T,ParametersPassedToPlot, ...) 8 | % 9 | % InpuT: 10 | % T #T list of trisurf handles {[] --> find all trisurf in `gca`} 11 | % OutpuT: 12 | % p #T list of isolines plot handles 13 | % 14 | if ~exist('T','var') || isempty(T) 15 | c = get(gca,'Children'); 16 | T = c(arrayfun(@(x) isa(x,'matlab.graphics.primitive.Patch'),c)); 17 | end 18 | if iscell(T) 19 | T = [T{:}]; 20 | end 21 | p = {}; 22 | for ti = 1:numel(T) 23 | t = T(ti); 24 | n = size(colormap,1)+1; 25 | a = caxis; 26 | iso = linspace(a(1),a(2),n); 27 | V = t.Vertices; 28 | F = t.Faces; 29 | S = t.FaceVertexCData; 30 | assert(size(S,2) == 1); 31 | [LS,LD,I] = isolines(V,F,S,iso); 32 | hold on; 33 | p{end+1} = plot3([LS(:,1) LD(:,1)]',[LS(:,2) LD(:,2)]',[LS(:,3) LD(:,3)]','Color','k',varargin{:}); 34 | hold off; 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /func_render/private/add_shadow.m: -------------------------------------------------------------------------------- 1 | function [h,L,M,ground] = add_shadow(T,L,varargin) 2 | % ADD_SHADOW Add a shadow for plotted mesh (t) according to light (l) 3 | % 4 | % h = add_shadow() % Apply to all 5 | % h = add_shadow(T,L) 6 | % h = add_shadow(T,L,'ParameterName',ParameterValue,...) 7 | % h = add_shadow([],[],'ParameterName',ParameterValue,...) % apply to all 8 | % 9 | % Inputs: 10 | % T #T list of trisurf handles {[] --> find all trisurf in `gca`} 11 | % L #L list of lights {[] --> find all light in `gca`} 12 | % Optional: 13 | % 'Ground' ground plane equation {[0 0 -1 min(Z)]} 14 | % 'Nudge' nudge the ground plane down a bit 15 | % 'Color' followed by 3-vector color {[0.21 0.21 0.21]} 16 | % 'BackgroundColor' followed by 3-vector color {[1 1 1]} 17 | % 'Fade' followed by: 18 | % 'none' constant shadow color 19 | % 'local' fade darker away from contact with ground (ape a spotlight) 20 | % 'infinite' fade lighter away from contact ground (ape infinite 21 | % light) 22 | % Outputs: 23 | % h #T*#L list of output shadow trisurf handles 24 | % L #L list of lights 25 | % M 4 by 4 by #T*#L shadow projection matrices 26 | % 27 | % Example: 28 | % t = tsurf(F,V,'EdgeColor','none',fphong,'SpecularStrength',0.1); 29 | % l = [ 30 | % light('Position',[-10 -10 13],'Style','local'); 31 | % light('Position',[10 -10 13],'Style','local')]; 32 | % camproj('persp'); 33 | % axis equal; 34 | % h = add_shadow(t,l); 35 | % apply_ambient_occlusion(t); 36 | % 37 | 38 | % default values 39 | ground = []; 40 | nudge = 0; 41 | color = [0.21 0.21 0.21]; 42 | background_color = [1 1 1]; 43 | fade = 'none'; 44 | % Map of parameter names to variable names 45 | params_to_variables = containers.Map( ... 46 | {'Ground','Nudge','BackgroundColor','Color','Fade'}, ... 47 | {'ground','nudge','background_color','color','fade'}); 48 | v = 1; 49 | while v <= numel(varargin) 50 | param_name = varargin{v}; 51 | if isKey(params_to_variables,param_name) 52 | assert(v+1<=numel(varargin)); 53 | v = v+1; 54 | % Trick: use feval on anonymous function to use assignin to this workspace 55 | feval(@()assignin('caller',params_to_variables(param_name),varargin{v})); 56 | else 57 | error('Unsupported parameter: %s',varargin{v}); 58 | end 59 | v=v+1; 60 | end 61 | 62 | if ~exist('T','var') || isempty(T) 63 | c = get(gca,'Children'); 64 | T = c(arrayfun(@(x) isa(x,'matlab.graphics.primitive.Patch'),c)); 65 | end 66 | if iscell(T) 67 | T = [T{:}]'; 68 | end 69 | T = T(:); 70 | 71 | if ~exist('L','var') || isempty(L) 72 | c = get(gca,'Children'); 73 | L = c(arrayfun(@(x) isa(x,'matlab.graphics.primitive.Light'),c)); 74 | if isempty(L) 75 | L = camlight; 76 | end 77 | end 78 | 79 | if isempty(ground) 80 | minZ = inf; 81 | for t = T' 82 | V = t.Vertices; 83 | minZ = min([V(:,3);minZ]); 84 | end 85 | ground = [0 0 -1 minZ-nudge]; 86 | end 87 | 88 | h = []; 89 | % need to specify that there are 0 "tubes" 90 | M = zeros([0,0,0]); 91 | for t = T' 92 | V = t.Vertices; 93 | for l = L' 94 | % plane equation 95 | % 0 = ax + by + cz + d 96 | light_pos = [l.Position strcmp(l.Style,'local')]; 97 | d = ground * light_pos'; 98 | shadow_mat = d*eye(4) - light_pos'*ground; 99 | U = [V ones(size(V,1),1)]*shadow_mat'; 100 | U = bsxfun(@rdivide,U(:,1:3),U(:,4)); 101 | 102 | hold on; 103 | tsh = trisurf(t.Faces,U(:,1),U(:,2),U(:,3), ... 104 | 'FaceColor',color, ... 105 | 'DiffuseStrength',0,'SpecularStrength',0, ... 106 | 'AmbientStrength',1, ... 107 | 'EdgeColor','none'); 108 | hold off; 109 | switch fade 110 | case {'local','infinite'} 111 | D = matrixnormalize( ... 112 | sum(bsxfun(@times,tsh.Vertices(:,1:2),l.Position(1:2)),2)); 113 | switch fade 114 | case 'infinite' 115 | D = 1.0-D; 116 | end 117 | tsh.FaceVertexCData = ... 118 | bsxfun(@plus,color,bsxfun(@times,D,background_color-color)); 119 | tsh.FaceColor = 'interp'; 120 | end 121 | h = [h;tsh]; 122 | M(:,:,end+1) = shadow_mat; 123 | end 124 | end 125 | end 126 | -------------------------------------------------------------------------------- /func_render/private/isolines.m: -------------------------------------------------------------------------------- 1 | function [LS,LD,I] = isolines(V,F,S,iso) 2 | % ISOLINES compute a list of isolines for a scalar field S defined on the 3 | % mesh (V,F) 4 | % 5 | % [LS,LD,I] = isolines(V,F,S,iso) 6 | % 7 | % Inputs: 8 | % V #V by dim list of vertex positions 9 | % F #F by 3 list of triangle indices 10 | % S #V list of scalar values defined on V 11 | % iso #iso list of iso values 12 | % Outputs: 13 | % LS #L by dim list of isoline start positions 14 | % LD #L by dim list of isoline destination positions 15 | % I #L list of indices into iso revealing corresponding iso value 16 | % 17 | % alternative: tracing isolines should result in smaller plot data (every 18 | % vertex only appears once 19 | % 20 | % Example: 21 | % iso = linspace(min(S),max(S),10); 22 | % [LS,LD] = isolines(V,F,S,iso); 23 | % colormap(jet(numel(iso)-1)); 24 | % tsurf(F,V,'CData',S,fphong); 25 | % hold on; 26 | % plot([LS(:,1) LD(:,1)]',[LS(:,2) LD(:,2)]', ... 27 | % 'Color','k','LineWidth',10); 28 | % hold off; 29 | % 30 | 31 | % make sure iso is a ROW vector 32 | iso = iso(:)'; 33 | % number of isolines 34 | niso = numel(iso); 35 | 36 | % number of domain positions 37 | n = size(V,1); 38 | % number of dimensions 39 | dim = size(V,2); 40 | 41 | % number of faces 42 | m = size(F,1); 43 | 44 | % Rename for convenience 45 | S1 = S(F(:,1),:); 46 | S2 = S(F(:,2),:); 47 | S3 = S(F(:,3),:); 48 | 49 | % t12(i,j) reveals parameter t where isovalue j falls on the line from 50 | % corner 1 to corner 2 of face i 51 | t12 = bsxfun(@rdivide,bsxfun(@minus,iso,S1),S2-S1); 52 | t23 = bsxfun(@rdivide,bsxfun(@minus,iso,S2),S3-S2); 53 | t31 = bsxfun(@rdivide,bsxfun(@minus,iso,S3),S1-S3); 54 | 55 | % replace values outside [0,1] with NaNs 56 | t12( (t12<-eps)|(t12>(1+eps)) ) = NaN; 57 | t23( (t23<-eps)|(t23>(1+eps)) ) = NaN; 58 | t31( (t31<-eps)|(t31>(1+eps)) ) = NaN; 59 | 60 | % masks for line "parallel" to 12 61 | l12 = ~isnan(t23) & ~isnan(t31); 62 | l23 = ~isnan(t31) & ~isnan(t12); 63 | l31 = ~isnan(t12) & ~isnan(t23); 64 | 65 | % find non-zeros (lines) from t23 to t31 66 | [F12,I12,~] = find(l12); 67 | [F23,I23,~] = find(l23); 68 | [F31,I31,~] = find(l31); 69 | % indices directly into t23 and t31 corresponding to F12 and I12 70 | %ti12 = sub2ind(size(l12),F12,I12); 71 | %ti23 = sub2ind(size(l23),F23,I23); 72 | %ti31 = sub2ind(size(l31),F31,I31); 73 | % faster sub2ind 74 | ti12 = F12+(I12-1)*size(l12,1); 75 | ti23 = F23+(I23-1)*size(l23,1); 76 | ti31 = F31+(I31-1)*size(l31,1); 77 | 78 | % compute actual position values 79 | LS = [ ... 80 | ... % average of vertex positions between 2 and 3 81 | bsxfun(@times,1-t23(ti12), V(F(F12,2),:)) + ... 82 | bsxfun(@times, t23(ti12), V(F(F12,3),:)) ... 83 | ; ... % average of vertex positions between 2 and 3 84 | bsxfun(@times,1-t31(ti23), V(F(F23,3),:)) + ... 85 | bsxfun(@times, t31(ti23), V(F(F23,1),:)) ... 86 | ;... % average of vertex positions between 2 and 3 87 | bsxfun(@times,1-t12(ti31), V(F(F31,1),:)) + ... 88 | bsxfun(@times, t12(ti31), V(F(F31,2),:)) ... 89 | ]; 90 | LD = [... 91 | ... % hcat with average of vertex positions between 3 and 1 92 | bsxfun(@times,1-t31(ti12), V(F(F12,3),:)) + ... 93 | bsxfun(@times, t31(ti12), V(F(F12,1),:)) ... 94 | ;... % hcat with average of vertex positions between 3 and 1 95 | bsxfun(@times,1-t12(ti23), V(F(F23,1),:)) + ... 96 | bsxfun(@times, t12(ti23), V(F(F23,2),:)) ... 97 | ;... % hcat with average of vertex positions between 3 and 1 98 | bsxfun(@times,1-t23(ti31), V(F(F31,2),:)) + ... 99 | bsxfun(@times, t23(ti31), V(F(F31,3),:)) ... 100 | ]; 101 | 102 | % I is just concatenation of each I12 103 | I = [I12;I23;I31]; 104 | 105 | end 106 | -------------------------------------------------------------------------------- /func_render/private/isolines_map.m: -------------------------------------------------------------------------------- 1 | function M = isolines_map(varargin) 2 | % ISOLINES_MAP Create a colormap that can be used to create "isolines". That 3 | % is colored intervals where everyother interval is a thin black interval. 4 | % 5 | % M = isolines_map(n) 6 | % M = isolines_map(N) 7 | % M = isolines_map(...,'ParameterName',ParameterValue, ...) 8 | % 9 | % Inputs: 10 | % n number of *isolines* (thus there will be n+1 colored intervals), using 11 | % default colormap 12 | % or 13 | % N #N by 3 input colormap, (thus there will be #N-1 isolines) 14 | % Optional: 15 | % 'LineColor' followed by {1|#N-1} by 3 color of isolines {[0 0 0]} 16 | % 'Thickness' ratio of isointerval thick to isoline, where thick is 17 | % measured on the color axis {10} 18 | % 19 | % Note: Remember to use 'FaceLighting','phong' in your trisurf plot to get 20 | % crisp isointervals (and isolines) 21 | % 22 | 23 | if numel(varargin{1}) == 1 24 | n = varargin{1}; 25 | N = parula(n+1); 26 | else 27 | N = varargin{1}; 28 | assert(size(N,2) == 3,'Number columns in colormap (%d) not 3',size(N,2)); 29 | n = size(N,1) - 1; 30 | end 31 | 32 | % Default optional parameters 33 | thick = 10; 34 | line_color = zeros([n 3]); 35 | 36 | ii = 2; 37 | while ii <= nargin 38 | switch varargin{ii} 39 | case 'Thickness' 40 | ii = ii + 1; 41 | assert(ii<=nargin); 42 | thick = varargin{ii}; 43 | assert(thick == round(thick),'Thickness (%d) ot an integer',thick); 44 | case 'LineColor' 45 | ii = ii + 1; 46 | assert(ii<=nargin); 47 | line_color = varargin{ii}; 48 | assert(size(line_color,2) == 3, ... 49 | 'Number of columns in LineColor %d not 3',size(line_color,2)); 50 | if size(line_color,1) == 1 51 | line_color = repmat(line_color,[n 1]); 52 | else 53 | assert(size(line_color,1) == n, ... 54 | 'Number of rows in LineColor (%d) not n (%d)',size(line_color,1),n); 55 | end 56 | otherwise 57 | error(['Unsupported parameter: ' varargin{ii}]); 58 | end 59 | ii = ii+1; 60 | end 61 | 62 | % append phony color to line_color to make it match N 63 | line_color = [line_color;[1 0 0]]; 64 | assert(size(N,1) == size(line_color,1)) 65 | 66 | % repeat N thick times 67 | N = repmat(N,[1 1 thick]); 68 | M = reshape(permute(cat(3,N,line_color),[3 1 2]),(n+1)*(thick + 1),3); 69 | % drop phony color 70 | M = M(1:(end-1),:); 71 | 72 | end 73 | -------------------------------------------------------------------------------- /func_render/private/load_MeshPlot_default_params.m: -------------------------------------------------------------------------------- 1 | function default_param = load_MeshPlot_default_params(S) 2 | default_param.Title = S.name; 3 | 4 | % If visualize a function on mesh 5 | default_param.IfShowFunc = false; 6 | default_param.func = []; 7 | default_param.checkFunc = @(T) length(T)==S.nv; % check if the input function has the correct length 8 | 9 | % If visualize a set of vertices 10 | default_param.IfShowVtx = false; 11 | default_param.landmarks = []; 12 | default_param.Size_lmk = 50; 13 | % default_param.Col_lmk = [1, 0.7, 0]; % orange 14 | default_param.Col_lmk = [0.4, 0.58, 0.93]; % blue 15 | % If visualize a set of edges 16 | default_param.IfShowEdge = false; 17 | default_param.edgeList = []; 18 | default_param.checkEdgeList = @(edgeList) isnumeric(edgeList) && size(edgeList,2) == 2; 19 | default_param.edgeID = []; 20 | default_param.CameraPos = [0,0]; 21 | default_param.LineWidth = 1.2; 22 | 23 | % parameters for trimesh 24 | default_param.FaceColor = 'interp'; 25 | validFaceColor = {'interp','flat'}; 26 | default_param.checkFaceColor = @(x) any(validatestring(x,validFaceColor)) || isnumeric(x); 27 | 28 | default_param.EdgeColor = 'none'; 29 | validEdgeColor = {'none','flat','interp'}; 30 | default_param.checkEdgeColor = @(x) any(validatestring(x,validEdgeColor)); 31 | default_param.FaceAlpha = 0.6; 32 | 33 | % parameters for rendering 34 | default_param.LightPos = [-0.2, -0.5, 0.5]; 35 | default_param.BackgroundColor = [1,1,1]; 36 | default_param.RotationOps = {}; 37 | default_param.MeshVtxColor = get_meshVtxColor(S); 38 | default_param.checkMeshVtxColor = @(f) isnumeric(f) && (size(f,1) == S.nv) && (size(f,2) == 1 || size(f,2) == 3); 39 | default_param.IfPlotIsolines = false; 40 | default_param.VtxPos = S.surface.VERT; 41 | default_param.checkVtxPos = @(X) isnumeric(X) && size(X,1) == S.nv && size(X,2) == 3; 42 | default_param.MeshSepDist = [1.5,0,0]; 43 | default_param.VecField = []; 44 | end 45 | 46 | 47 | function col = get_meshVtxColor(S) 48 | g1 = S.surface.X; 49 | g2 = S.surface.Y; 50 | g3 = S.surface.Z; 51 | 52 | g1 = normalize_function(0,1,g1); 53 | g2 = normalize_function(0,1,g2); 54 | g3 = normalize_function(0,1,g3); 55 | col = [g1,g2,g3]; 56 | end 57 | 58 | function fnew = normalize_function(min_new,max_new,f) 59 | fnew = f - min(f); 60 | fnew = (max_new-min_new)*fnew/max(fnew) + min_new; 61 | end -------------------------------------------------------------------------------- /func_render/private/matrixnormalize.m: -------------------------------------------------------------------------------- 1 | function N = matrixnormalize(M) 2 | % MATRIXNORMALIZE Normalize matrix values to be between the range 0 and 1. 3 | % Current just works with matrices of type double. 4 | % 5 | % N = matrixnormalize(M) 6 | % 7 | % Inputs: 8 | % M original input matrix 9 | % Output: 10 | % N normalized matrix 11 | % 12 | % Example: 13 | % imshow(matrixnormalize(im)) 14 | % % Equivalent to 15 | % imshow(im,[]) 16 | % 17 | switch class(M) 18 | case {'double','single'} 19 | N = (M-min(M(:)))./(max(M(:))-min(M(:))); 20 | case 'logical' 21 | N = M; 22 | case 'uint8' 23 | N = (M-min(M(:)))*(255/double((max(M(:))-min(M(:))))); 24 | otherwise 25 | error('Class not supported'); 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /func_render/private/normalize_function.m: -------------------------------------------------------------------------------- 1 | function fnew = normalize_function(min_new,max_new,f) 2 | fnew = f - min(f); 3 | fnew = (max_new-min_new)*fnew/max(fnew) + min_new; 4 | end -------------------------------------------------------------------------------- /func_render/private/parse_MeshPlot_params.m: -------------------------------------------------------------------------------- 1 | function [param, p] = parse_MeshPlot_params(default_param, varargin) 2 | p = inputParser; 3 | addParameter(p, 'Title', default_param.Title, @isstr); 4 | addParameter(p,'IfShowFunc',default_param.IfShowFunc, @islogical); 5 | addParameter(p,'func', default_param.func, default_param.checkFunc); 6 | addParameter(p,'IfShowVtx',default_param.IfShowVtx, @islogical); 7 | addParameter(p, 'landmarks', default_param.landmarks, @isnumeric); 8 | addParameter(p,'Color_Landmarks',default_param.Col_lmk,@isnumeric); 9 | addParameter(p,'Size_Landmarks',default_param.Size_lmk,@isnumeric); 10 | 11 | addParameter(p,'FaceColor',default_param.FaceColor,default_param.checkFaceColor); 12 | addParameter(p,'EdgeColor',default_param.EdgeColor,default_param.checkEdgeColor); 13 | addParameter(p,'FaceAlpha', default_param.FaceAlpha, @isnumeric); 14 | addParameter(p,'BackgroundColor',default_param.BackgroundColor, @isnumeric); 15 | 16 | addParameter(p,'IfShowEdge',default_param.IfShowEdge, @islogical); 17 | addParameter(p,'edgeList', default_param.edgeList, default_param.checkEdgeList); 18 | addParameter(p,'edgeID', default_param.edgeID, @isnumeric); 19 | addParameter(p,'LineWidth', default_param.LineWidth, @isnumeric); 20 | 21 | addParameter(p,'CameraPos', default_param.CameraPos,@isnumeric); 22 | addParameter(p,'LightPos', default_param.LightPos,@isnumeric); 23 | addParameter(p,'RotationOps', default_param.RotationOps,@iscell); 24 | addParameter(p,'MeshVtxColor',default_param.MeshVtxColor, default_param.checkMeshVtxColor); 25 | addParameter(p,'IfPlotIsolines',default_param.IfPlotIsolines,@islogical); 26 | addParameter(p,'VtxPos',default_param.VtxPos,default_param.checkVtxPos); 27 | addParameter(p,'MeshSepDist',default_param.MeshSepDist,@isnumeric); 28 | addParameter(p,'VecField',default_param.VecField,@isnumeric); 29 | 30 | parse(p,varargin{:}); 31 | param = p.Results; 32 | param.Col_lmk = p.Results.Color_Landmarks; 33 | param.Size_lmk = p.Results.Size_Landmarks; 34 | 35 | if ~isempty(param.func) 36 | param.IfShowFunc = true; 37 | param.FaceAlpha = 0.9; 38 | end 39 | if ~isempty(param.landmarks) 40 | param.IfShowVtx = true; 41 | if ~param.IfShowFunc 42 | param.FaceColor = [0.7, 0.7, 0.7]; 43 | end 44 | end 45 | if ~isempty(param.edgeList) || ~isempty(param.edgeID) 46 | param.IfShowEdge = true; 47 | end 48 | 49 | 50 | end -------------------------------------------------------------------------------- /func_render/private/set_overlay_axis.m: -------------------------------------------------------------------------------- 1 | function [xdiam, ydiam, zdiam] = set_overlay_axis(xdiam, ydiam, zdiam, overlay_axis) 2 | switch lower(overlay_axis) 3 | case 'x' 4 | ydiam = 0; zdiam = 0; 5 | case 'y' 6 | xdiam = 0; zdiam = 0; 7 | case 'z' 8 | xdiam = 0; ydiam = 0; 9 | case 'xy' 10 | zdiam = 0; 11 | case 'xz' 12 | ydiam = 0; 13 | case 'yz' 14 | xdiam = 0; 15 | case 'xyz' 16 | otherwise 17 | error('invalid overlay_axis type') 18 | end 19 | end -------------------------------------------------------------------------------- /func_render/render_map.m: -------------------------------------------------------------------------------- 1 | function render_map(S1,S2,map,col_idx,samples,varargin) 2 | default_param = load_MeshPlot_default_params(S1); 3 | param = parse_MeshPlot_params(default_param, varargin{:}); 4 | 5 | xdiam = param.MeshSepDist(1)*(max(S2.surface.X)-min(S2.surface.X)); 6 | ydiam = param.MeshSepDist(2)*(max(S2.surface.Y)-min(S2.surface.Y)); 7 | zdiam = param.MeshSepDist(3)*(max(S2.surface.Z)-min(S2.surface.Z)); 8 | %% 9 | [S1_col,S2_col]= get_mapped_face_color_withNaN(S1,S2,map,col_idx); 10 | 11 | 12 | [~,new_X1] = render_mesh(S1,'MeshVtxCol',S1_col,varargin{:}); 13 | axis equal; axis off; hold on; 14 | 15 | [~,new_X2] = render_mesh(S2,'MeshVtxCol',S2_col,... 16 | 'VtxPos',S2.surface.VERT + repmat([xdiam,ydiam,zdiam],S2.nv,1),... 17 | varargin{:}); 18 | axis equal; axis off; hold on; 19 | 20 | if (~isempty(samples)) 21 | target_samples = map(samples); 22 | 23 | Xstart = new_X1(samples,1)'; Xend = new_X2(target_samples,1)'; 24 | Ystart = new_X1(samples,2)'; Yend = new_X2(target_samples,2)'; 25 | Zstart = new_X1(samples,3)'; Zend = new_X2(target_samples,3)'; 26 | 27 | Colors = S1_col; 28 | ColorSet = Colors(samples,:); 29 | set(gca, 'ColorOrder', ColorSet); 30 | plot3([Xstart; Xend], [Ystart; Yend], [Zstart; Zend],'LineWidth',1.2); hold off; 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /func_render/render_mesh.m: -------------------------------------------------------------------------------- 1 | % 2018-10-17: rendering a mesh, using **gptoolbox** 2 | % 'MeshVtxColor': 3 | % same as 'FaceVertexCData', n-by-1 or n-by-3 matrix 4 | % note that, if we want to add the isolines (i.e., set IfPlotIsolines to true) 5 | % this needs to be a n-by-1 vector (a scalar function to find the isolines) 6 | % 'LightPos': the 3D position of the light 7 | % 'CameraPos': the position of the camera/view 8 | % 'BackgroundColor': the background color 9 | % 'RotationOps': a cell of rotation vectors (apply the rotations in a seq) 10 | % 'VecField': vector field 11 | function [t,X, S_new] = render_mesh(S,varargin) 12 | default_param = load_MeshPlot_default_params(S); 13 | param = parse_MeshPlot_params(default_param, varargin{:}); 14 | 15 | X = param.VtxPos; 16 | T = S.surface.TRIV; 17 | f = param.MeshVtxColor; 18 | 19 | if ~isempty(param.RotationOps) 20 | center = mean(X); 21 | X = X - center; 22 | for i = 1:length(param.RotationOps) 23 | R = param.RotationOps{i}; 24 | X = X*rotx(R(1))*roty(R(2))*rotz(R(3)); 25 | end 26 | X = X + center; 27 | end 28 | % construct the rotated new mesh 29 | if nargout > 2 30 | S_new = S; 31 | S_new.surface.VERT = X; 32 | S_new.surface.X = X(:,1); 33 | S_new.surface.Y = X(:,2); 34 | S_new.surface.Z = X(:,3); 35 | end 36 | 37 | % plot the mesh 38 | t = trimesh(T, X(:,1), X(:,2), X(:,3),... 39 | 'FaceColor',param.FaceColor,... 40 | 'FaceAlpha',param.FaceAlpha,... 41 | 'EdgeColor','none'); 42 | axis equal; axis off; hold on; 43 | view(param.CameraPos); 44 | 45 | teal = [144 216 196]/255; 46 | pink = [254 194 194]/255; 47 | orange = [249,198,7]/255; 48 | 49 | if ~isempty(param.VecField) 50 | J = param.VecField; 51 | if size(J,1) == S.nv 52 | quiver3(X(:,1),X(:,2),X(:,3),J(:,1),J(:,2),J(:,3),'Color',[0.2,0.2,0.2],'LineWidth',0.6); 53 | elseif size(J,1) == S.nf 54 | T = S.surface.TRIV; 55 | Fc = (X(T(:,1),:) + X(T(:,2),:) + X(T(:,3),:))/3; 56 | quiver3(Fc(:,1),Fc(:,2),Fc(:,3),J(:,1),J(:,2),J(:,3),'Color',[0.5,0.3,0.3],'LineWidth',0.8); 57 | else 58 | error('Wrong: size of the vector field') 59 | end 60 | end 61 | 62 | set(t,'FaceColor','interp','FaceLighting','phong',... 63 | 'FaceVertexCData',f); 64 | set(t,'SpecularStrength',0.2,'DiffuseStrength',0.2,'AmbientStrength',0.8); 65 | 66 | 67 | l = light('Position',param.LightPos); 68 | bg_color = param.BackgroundColor; 69 | set(gca,'Visible','off'); 70 | set(gcf,'Color',bg_color); 71 | 72 | % add isolines if MeshVtxColor is a scalar function 73 | if param.IfPlotIsolines 74 | p = add_isolines(t,'LineWidth',0.8,'LineStyle','--'); 75 | end 76 | 77 | % add the shadows 78 | s = add_shadow(t,l,'Color',bg_color*0.8,'BackgroundColor',bg_color,'Fade','infinite'); 79 | 80 | end -------------------------------------------------------------------------------- /func_render/sphere.obj: -------------------------------------------------------------------------------- 1 | v 0.39750224351882935 -0.88814014196395874 -0.18837209045886993 2 | v 0.87229442596435547 -0.44368830323219299 -0.12369003146886826 3 | v 0.90587824583053589 0.3680042028427124 0.12385314702987671 4 | v 0.79750627279281616 -0.41017836332321167 0.40943625569343567 5 | v 0.54435837268829346 0.09583631157875061 0.8152199387550354 6 | v -0.1092359721660614 0.92867815494537354 0.32916438579559326 7 | v -0.45511218905448914 -0.016316462308168411 0.8730970025062561 8 | v -0.56776338815689087 -0.55020391941070557 0.59132832288742065 9 | v -0.64723879098892212 -0.5617755651473999 -0.48875218629837036 10 | v -0.0051572192460298538 -0.57019984722137451 -0.80591821670532227 11 | v 0.20584964752197266 -0.37311431765556335 -0.88923776149749756 12 | v 0.49911388754844666 0.50341242551803589 -0.68633842468261719 13 | v 0.34090530872344971 0.84772670269012451 -0.38103386759757996 14 | v 0.47276011109352112 -0.6492619514465332 -0.57559764385223389 15 | v 0.74537110328674316 -0.12112487107515335 -0.63169902563095093 16 | v 0.49711930751800537 -0.80085104703903198 -0.30104184150695801 17 | v 0.54804527759552002 -0.81718206405639648 -0.11027997732162476 18 | v 0.61934870481491089 -0.77091634273529053 0.047525547444820404 19 | v 0.74846124649047852 -0.5265728235244751 0.36987787485122681 20 | v 0.90225750207901001 0.036402765661478043 0.39249220490455627 21 | v 0.39019995927810669 -0.8062211275100708 0.42034187912940979 22 | v 0.36796444654464722 0.15044963359832764 0.90021985769271851 23 | v -0.021105160936713219 0.71919244527816772 0.67903691530227661 24 | v -0.14110489189624786 0.89035087823867798 0.41144120693206787 25 | v -0.14795772731304169 0.18025265634059906 0.95606666803359985 26 | v -0.2566794753074646 0.78898274898529053 0.5398942232131958 27 | v -0.50041252374649048 -0.84817886352539063 0.10102619230747223 28 | v -0.91652441024780273 0.36118513345718384 0.030814677476882935 29 | v -0.56450021266937256 -0.81244009733200073 0.02013876847922802 30 | v -0.83138930797576904 -0.51062220335006714 -0.14782440662384033 31 | v -0.61662542819976807 -0.7703738808631897 -0.065978042781352997 32 | v -0.87296837568283081 -0.12345800548791885 -0.4380761981010437 33 | v -0.68008637428283691 -0.092184379696846008 -0.70534670352935791 34 | v -0.65912377834320068 0.38890868425369263 -0.6217803955078125 35 | v -0.40970242023468018 -0.84991878271102905 -0.30280980467796326 36 | v -0.080487057566642761 0.35564303398132324 -0.9150884747505188 37 | v 0.60099667310714722 -0.43361583352088928 -0.65033501386642456 38 | v 0.84017074108123779 -0.45162290334701538 -0.24819457530975342 39 | v 0.93362295627593994 0.26489156484603882 -0.17053902149200439 40 | v 0.056745164096355438 -0.60746002197265625 0.77625495195388794 41 | v -0.19929637014865875 -0.5090559720993042 0.82151401042938232 42 | v -0.10936953872442245 -0.96407234668731689 0.21163605153560638 43 | v -0.74354434013366699 -0.28671875596046448 0.57826530933380127 44 | v -0.27478864789009094 -0.95235496759414673 -0.046238336712121964 45 | v -0.84435164928436279 0.43116360902786255 -0.27048054337501526 46 | v -0.77148211002349854 -0.44361922144889832 -0.42380964756011963 47 | v -0.57773387432098389 0.76529544591903687 -0.2442406564950943 48 | v -0.32471561431884766 0.60374146699905396 -0.71072226762771606 49 | v -0.27485683560371399 -0.4030643105506897 -0.85716903209686279 50 | v 0.13901647925376892 0.50944852828979492 -0.83290493488311768 51 | v 0.24509766697883606 0.44151303172111511 -0.84726214408874512 52 | v 0.14868971705436707 -0.30047383904457092 -0.9266316294670105 53 | v 0.068972520530223846 0.3787156343460083 -0.90688431262969971 54 | v 0.31253761053085327 0.19537888467311859 -0.91348785161972046 55 | v 0.28689256310462952 -0.75421196222305298 -0.57201766967773438 56 | v 0.10318738967180252 0.95354700088500977 -0.25682902336120605 57 | v 0.34366849064826965 0.7414059042930603 -0.55779463052749634 58 | v 0.50550025701522827 -0.058349419385194778 -0.84275388717651367 59 | v 0.54418051242828369 0.56658130884170532 -0.59851062297821045 60 | v 0.68354499340057373 -0.091763928532600403 -0.70160257816314697 61 | v 0.57642525434494019 0.71970939636230469 -0.35579022765159607 62 | v 0.82200932502746582 -0.27130767703056335 -0.46976658701896667 63 | v 0.65371757745742798 -0.59128004312515259 -0.4446464478969574 64 | v 0.76382386684417725 0.33788949251174927 -0.52229976654052734 65 | v 0.85411208868026733 -0.38151517510414124 -0.31125524640083313 66 | v 0.61695611476898193 0.76420283317565918 -0.11575736105442047 67 | v 0.94926673173904419 -0.19124948978424072 -0.17666357755661011 68 | v 0.81457126140594482 0.55579036474227905 -0.03705955296754837 69 | v 0.88790220022201538 0.42341187596321106 0.065421536564826965 70 | v 0.81612265110015869 -0.55039411783218384 -0.069913662970066071 71 | v 0.60750192403793335 0.75800848007202148 0.18928614258766174 72 | v 0.8533063530921936 0.46949231624603271 0.15310662984848022 73 | v 0.82534241676330566 -0.49811562895774841 0.20759864151477814 74 | v 0.82136052846908569 0.43229007720947266 0.33168008923530579 75 | v 0.64976191520690918 -0.69115263223648071 0.27870392799377441 76 | v 0.67682081460952759 -0.55103546380996704 0.46145826578140259 77 | v 0.86209619045257568 0.16011987626552582 0.44697189331054688 78 | v 0.63900959491729736 -0.283344566822052 0.69423002004623413 79 | v 0.6355520486831665 -0.41502034664154053 0.62854349613189697 80 | v 0.41395583748817444 -0.8313480019569397 0.34366104006767273 81 | v 0.76336544752120972 -0.2594948410987854 0.56655299663543701 82 | v 0.24397413432598114 0.63193154335021973 0.71905016899108887 83 | v 0.50091338157653809 -0.42293933033943176 0.73657643795013428 84 | v 0.4117966890335083 0.68019765615463257 0.58608251810073853 85 | v 0.22535824775695801 0.41303476691246033 0.8663017749786377 86 | v 0.059955835342407227 0.18991546332836151 0.96405768394470215 87 | v -0.019790694117546082 0.80115193128585815 0.58042764663696289 88 | v -0.26140683889389038 0.68696367740631104 0.66032779216766357 89 | v -0.43840757012367249 -0.10405854880809784 0.87573868036270142 90 | v -0.35287407040596008 -0.38311958312988281 0.83630079030990601 91 | v -0.22764821350574493 -0.84190207719802856 0.46985110640525818 92 | v -0.10537811368703842 0.67966079711914063 0.70939928293228149 93 | v -0.54529213905334473 0.29057928919792175 0.76733094453811646 94 | v -0.56810355186462402 0.10837879031896591 0.79616004228591919 95 | v -0.48441952466964722 -0.50683289766311646 0.69469380378723145 96 | v -0.39862039685249329 -0.75788974761962891 0.49566850066184998 97 | v -0.65158575773239136 0.37299719452857971 0.63781899213790894 98 | v -0.611297607421875 -0.44888773560523987 0.63100981712341309 99 | v -0.53862255811691284 -0.68329155445098877 0.46983397006988525 100 | v -0.57049286365509033 0.78983134031295776 0.17543347179889679 101 | v -0.79224437475204468 -0.55439949035644531 0.19742158055305481 102 | v -0.90471112728118896 0.026901211589574814 0.38642081618309021 103 | v -0.5613742470741272 0.81577610969543457 0.0024155732244253159 104 | v -0.93075144290924072 -0.24215854704380035 -0.21028167009353638 105 | v -0.6354404091835022 -0.7430039644241333 -0.15078660845756531 106 | v -0.90148806571960449 -0.16894452273845673 -0.35675403475761414 107 | v -0.56682819128036499 -0.71928155422210693 -0.37116515636444092 108 | v -0.66420763731002808 -0.38392949104309082 -0.61860460042953491 109 | v -0.46090182662010193 0.47676163911819458 -0.73017561435699463 110 | v -0.5379607081413269 0.13887271285057068 -0.81325817108154297 111 | v -0.44132992625236511 -0.58959978818893433 -0.65832751989364624 112 | v -0.33896464109420776 -0.83145314455032349 -0.41766399145126343 113 | v -0.3715246319770813 -0.19935265183448792 -0.88927233219146729 114 | v -0.46251946687698364 -0.21073576807975769 -0.84356081485748291 115 | v -0.16605553030967712 -0.56369805335998535 -0.79275459051132202 116 | v 0.021383721381425858 -0.72862100601196289 -0.66788607835769653 117 | v 0.20262895524501801 0.97236114740371704 0.030218448489904404 118 | v -0.11431578546762466 0.17393049597740173 -0.96212947368621826 119 | v 0.038517002016305923 0.56070846319198608 -0.8118024468421936 120 | v 0.13499630987644196 0.86878591775894165 -0.45594525337219238 121 | v 0.35695788264274597 -0.46619904041290283 -0.7927781343460083 122 | v 0.44680839776992798 0.40967994928359985 -0.77693164348602295 123 | v 0.60612219572067261 -0.15332485735416412 -0.76094681024551392 124 | v 0.41786423325538635 -0.79699337482452393 -0.41257384419441223 125 | v 0.52874749898910522 0.41494458913803101 -0.72083002328872681 126 | v 0.50599658489227295 -0.75184023380279541 -0.39683043956756592 127 | v 0.69878607988357544 -0.22547648847103119 -0.65671658515930176 128 | v 0.75313746929168701 -0.33936485648155212 -0.53702592849731445 129 | v 0.76811933517456055 -0.61076885461807251 -0.11384595930576324 130 | v 0.96153450012207031 0.019825421273708344 -0.21021723747253418 131 | v 0.96041524410247803 -0.095214806497097015 -0.19167473912239075 132 | v 0.86316525936126709 0.45083624124526978 -0.15629538893699646 133 | v 0.90765023231506348 -0.38163042068481445 0.041762113571166992 134 | v 0.94555944204330444 -0.16094513237476349 0.22259479761123657 135 | v 0.9294469952583313 -0.23980459570884705 0.21833319962024689 136 | v 0.78625482320785522 -0.55135500431060791 0.22888197004795074 137 | v 0.62106412649154663 -0.7465711236000061 0.18892674148082733 138 | v 0.30697694420814514 0.86770802736282349 0.36801987886428833 139 | v 0.45587033033370972 -0.33151087164878845 0.80796545743942261 140 | v 0.4354206919670105 -0.50653254985809326 0.72553497552871704 141 | v 0.15421357750892639 -0.12468740344047546 0.96443837881088257 142 | v 0.012945006601512432 -0.45639345049858093 0.87400245666503906 143 | v 0.062462709844112396 -0.70363003015518188 0.69131475687026978 144 | v 0.025636620819568634 -0.75760549306869507 0.63548463582992554 145 | v 0.040586691349744797 0.046118088066577911 0.98200386762619019 146 | v 0.043370086699724197 -0.11483605951070786 0.97634130716323853 147 | v -0.13668154180049896 0.52529478073120117 0.82412582635879517 148 | v -0.15106680989265442 0.84546416997909546 0.49278387427330017 149 | v -0.26190930604934692 0.53487998247146606 0.78753626346588135 150 | v -0.085506007075309753 -0.91211378574371338 0.37790665030479431 151 | v -0.47885048389434814 0.086338549852371216 0.85586148500442505 152 | v -0.40664470195770264 0.44385913014411926 0.78149133920669556 153 | v -0.62991368770599365 0.29917985200881958 0.695168137550354 154 | v -0.71147310733795166 0.51832222938537598 0.445832759141922 155 | v -0.85716098546981812 -0.30048078298568726 0.38148164749145508 156 | v -0.47555449604988098 -0.86937916278839111 -0.0057685580104589462 157 | v -0.97465342283248901 0.11805503070354462 0.067867927253246307 158 | v -0.29539746046066284 0.9449266791343689 0.071047469973564148 159 | v -0.98232859373092651 -0.059262104332447052 -0.0071238530799746513 160 | v -0.8104972243309021 0.53574419021606445 -0.17333309352397919 161 | v -0.54942113161087036 -0.81700479984283447 -0.10505742579698563 162 | v -0.80235970020294189 0.21925567090511322 -0.5273892879486084 163 | v -0.61851018667221069 0.51297968626022339 -0.57178616523742676 164 | v -0.73468750715255737 -0.30834025144577026 -0.57871198654174805 165 | v -0.49281498789787292 0.77563977241516113 -0.36786660552024841 166 | v -0.49615886807441711 -0.7821735143661499 -0.34726870059967041 167 | v -0.59472697973251343 0.28405293822288513 -0.73176455497741699 168 | v -0.47174590826034546 -0.44881618022918701 -0.74039286375045776 169 | v -0.37125411629676819 -0.52844256162643433 -0.74595272541046143 170 | v -0.30835869908332825 -0.59465646743774414 -0.72540527582168579 171 | v -0.25587669014930725 -0.51700598001480103 -0.80001270771026611 172 | v -0.067215777933597565 0.92149722576141357 -0.3618626594543457 173 | v -0.15185318887233734 -0.32249265909194946 -0.91879057884216309 174 | v -0.090916797518730164 -0.62421411275863647 -0.75966238975524902 175 | v 0.13646264374256134 -0.91892248392105103 -0.3453611433506012 176 | v 0.63327747583389282 0.56828761100769043 -0.50044405460357666 177 | v 0.91235297918319702 0.24978458881378174 -0.27477514743804932 178 | v 0.92875832319259644 -0.19538158178329468 -0.26100873947143555 179 | v 0.89025938510894775 -0.35535609722137451 -0.22741122543811798 180 | v 0.92767739295959473 0.25440606474876404 0.21352279186248779 181 | v 0.96962577104568481 0.06983330100774765 0.15568168461322784 182 | v 0.93729913234710693 -0.28034448623657227 0.11534422636032104 183 | v 0.50891333818435669 -0.69171124696731567 0.49005374312400818 184 | v 0.070142321288585663 -0.96745210886001587 0.21636681258678436 185 | v -0.033754255622625351 0.094828039407730103 0.9791644811630249 186 | v -0.17689238488674164 0.090022765100002289 0.96400266885757446 187 | v -0.24092662334442139 -0.0044801272451877594 0.95392495393753052 188 | v -0.44638332724571228 -0.69627505540847778 0.54105949401855469 189 | v -0.50543010234832764 0.62728297710418701 0.57221502065658569 190 | v -0.50319439172744751 0.5365375280380249 0.65821385383605957 191 | v -0.53542923927307129 -0.37854465842247009 0.73549890518188477 192 | v -0.71542221307754517 0.1191682368516922 0.66504514217376709 193 | v -0.29898861050605774 -0.94563859701156616 0.040135800838470459 194 | v -0.58708888292312622 0.79232621192932129 0.07729378342628479 195 | v -0.91309165954589844 0.23098140954971313 -0.28686174750328064 196 | v -0.48449087142944336 0.65078812837600708 -0.56399613618850708 197 | v -0.40113228559494019 -0.29286113381385803 -0.85017108917236328 198 | v -0.26729485392570496 0.076612807810306549 -0.94441163539886475 199 | v 0.0053476803004741669 0.98322492837905884 -0.14846986532211304 200 | v 0.24746178090572357 0.077298536896705627 -0.94956529140472412 201 | v 0.052265208214521408 -0.78668379783630371 -0.59859216213226318 202 | v 0.25395175814628601 0.74347645044326782 -0.60094082355499268 203 | v 0.36552515625953674 0.39266780018806458 -0.82624876499176025 204 | v 0.12785467505455017 -0.87469476461410522 -0.4470684826374054 205 | v 0.2033703476190567 0.38001829385757446 -0.88572639226913452 206 | v 0.32032141089439392 -0.35651347041130066 -0.86067461967468262 207 | v 0.10238681733608246 0.82024997472763062 -0.54408204555511475 208 | v 0.25239953398704529 -0.83168143033981323 -0.47382527589797974 209 | v 0.39855358004570007 -0.18085721135139465 -0.8820347785949707 210 | v 0.19867752492427826 0.81911253929138184 -0.5187639594078064 211 | v 0.35345900058746338 -0.84165728092193604 -0.38492870330810547 212 | v 0.63766014575958252 0.21507926285266876 -0.71939456462860107 213 | v 0.47974458336830139 -0.71951866149902344 -0.47852808237075806 214 | v 0.44829562306404114 0.79832661151885986 -0.37644168734550476 215 | v 0.70700424909591675 -0.43510282039642334 -0.53245788812637329 216 | v 0.60554850101470947 -0.66862452030181885 -0.40378692746162415 217 | v 0.67948919534683228 -0.33768245577812195 -0.62820947170257568 218 | v 0.70440042018890381 0.56581073999404907 -0.39851656556129456 219 | v 0.71982145309448242 0.13595470786094666 -0.65765166282653809 220 | v 0.92290914058685303 0.005253475159406662 -0.34307125210762024 221 | v 0.80031484365463257 -0.49513956904411316 -0.29519084095954895 222 | v 0.72908860445022583 -0.56516081094741821 -0.35034468770027161 223 | v 0.89278960227966309 0.012451126240193844 -0.41493812203407288 224 | v 0.75913119316101074 0.63207948207855225 0.026305578649044037 225 | v 0.89169991016387939 0.35398867726325989 0.22424224019050598 226 | v 0.89357471466064453 -0.32460066676139832 0.25981602072715759 227 | v 0.42738953232765198 0.87827551364898682 0.16400814056396484 228 | v 0.87953585386276245 -0.22101666033267975 0.38322913646697998 229 | v 0.88882887363433838 -0.3970055878162384 0.15553529560565948 230 | v 0.50826787948608398 0.83829516172409058 0.13974931836128235 231 | v 0.80910199880599976 0.24035057425498962 0.50757730007171631 232 | v 0.84734082221984863 -0.066136151552200317 0.49687057733535767 233 | v 0.35168623924255371 -0.88955950736999512 0.2596515417098999 234 | v 0.73483806848526001 -0.37493336200714111 0.53931117057800293 235 | v 0.48704031109809875 -0.75885099172592163 0.40608799457550049 236 | v 0.61196386814117432 -0.5216144323348999 0.57234716415405273 237 | v 0.40302538871765137 0.61603111028671265 0.65830367803573608 238 | v 0.30192264914512634 0.33902624249458313 0.87452828884124756 239 | v 0.3452201783657074 -0.36217668652534485 0.84911954402923584 240 | v 0.32431232929229736 -0.45892012119293213 0.8100435733795166 241 | v 0.11982744932174683 0.97626721858978271 0.13889616727828979 242 | v 0.38392806053161621 -0.61567586660385132 0.67061281204223633 243 | v 0.34345468878746033 0.74484890699386597 0.5524328351020813 244 | v 0.39858400821685791 -0.034105490893125534 0.89931857585906982 245 | v 0.016977641731500626 -0.89634376764297485 0.42345616221427917 246 | v 0.23154294490814209 -0.72926986217498779 0.62719660997390747 247 | v 0.099467255175113678 -0.35180693864822388 0.91509592533111572 248 | v -0.13495621085166931 0.29443058371543884 0.93078392744064331 249 | v -0.12216353416442871 0.010946626774966717 0.97666996717453003 250 | v -0.20076274871826172 -0.28131929039955139 0.92282915115356445 251 | v -0.15648689866065979 -0.60692548751831055 0.76248389482498169 252 | v -0.41157907247543335 0.15923695266246796 0.88014048337936401 253 | v -0.27892413735389709 -0.44243314862251282 0.83629542589187622 254 | v -0.26576200127601624 0.34511715173721313 0.88390016555786133 255 | v -0.29665327072143555 -0.17275126278400421 0.9232679009437561 256 | v -0.35989910364151001 0.79564309120178223 0.46691787242889404 257 | v -0.53933042287826538 0.41705936193466187 0.71269184350967407 258 | v -0.46495383977890015 0.35638836026191711 0.79200619459152222 259 | v -0.54808288812637329 -0.28032782673835754 0.76856780052185059 260 | v -0.48385187983512878 -0.25690644979476929 0.81797921657562256 261 | v -0.41339367628097534 0.59475946426391602 0.67098033428192139 262 | v -0.72448021173477173 0.20647841691970825 0.63469904661178589 263 | v -0.67602360248565674 -0.34383267164230347 0.62925213575363159 264 | v -0.45928725600242615 -0.77226269245147705 0.41399183869361877 265 | v -0.56203848123550415 0.019433407112956047 0.80737483501434326 266 | v -0.7424735426902771 -0.035758797079324722 0.64547818899154663 267 | v -0.81372058391571045 0.1171024814248085 0.54156935214996338 268 | v -0.77419006824493408 -0.32754376530647278 0.51463669538497925 269 | v -0.45502492785453796 0.80237883329391479 0.35927951335906982 270 | v -0.48741909861564636 0.69928163290023804 0.5010266900062561 271 | v -0.72575736045837402 0.41031929850578308 0.52673566341400146 272 | v -0.49578815698623657 0.84819591045379639 0.12548917531967163 273 | v -0.90342217683792114 0.1319107711315155 0.36800727248191833 274 | v -0.78884619474411011 -0.4961860179901123 0.32427495718002319 275 | v -0.93068391084671021 0.24403345584869385 0.20816083252429962 276 | v -0.93903487920761108 -0.23702313005924225 0.17683443427085876 277 | v -0.84778422117233276 -0.39722123742103577 0.30976900458335876 278 | v -0.65165239572525024 0.74354970455169678 0.003079624380916357 279 | v -0.79156529903411865 0.58913612365722656 -0.041093088686466217 280 | v -0.96810024976730347 -0.18136771023273468 0.0011355355381965637 281 | v -0.61469709873199463 0.76815640926361084 -0.10623277723789215 282 | v -0.86282157897949219 0.45642820000648499 -0.14341256022453308 283 | v -0.89703667163848877 -0.3721432089805603 -0.16670294106006622 284 | v -0.86215978860855103 -0.41892287135124207 -0.2280246913433075 285 | v -0.88548147678375244 -0.25007098913192749 -0.35191112756729126 286 | v -0.68759864568710327 0.47962039709091187 -0.52013182640075684 287 | v -0.73785126209259033 0.39061376452445984 -0.52294570207595825 288 | v -0.80971676111221313 -0.29246732592582703 -0.47911593317985535 289 | v -0.82198494672775269 -0.36001792550086975 -0.40643474459648132 290 | v -0.85647785663604736 0.18335384130477905 -0.45092716813087463 291 | v -0.5640074610710144 0.62397223711013794 -0.51793599128723145 292 | v -0.69012194871902466 -0.2652900218963623 -0.65015566349029541 293 | v -0.47772708535194397 -0.0077216736972332001 -0.86124938726425171 294 | v -0.56462037563323975 0.41537237167358398 -0.69297069311141968 295 | v -0.19162905216217041 0.79906022548675537 -0.55073392391204834 296 | v -0.29121741652488708 0.76343697309494019 -0.55738615989685059 297 | v -0.36017438769340515 0.50324338674545288 -0.76837849617004395 298 | v -0.36728376150131226 0.17469558119773865 -0.89684110879898071 299 | v -0.30365937948226929 -0.32737025618553162 -0.87784737348556519 300 | v -0.1791272908449173 0.74658536911010742 -0.62316608428955078 301 | v -0.11706998944282532 0.60680365562438965 -0.77007651329040527 302 | v -0.16151474416255951 -0.76236015558242798 -0.60881650447845459 303 | v -0.078440763056278229 -0.79555612802505493 -0.58298546075820923 304 | v 0.031998205929994583 -0.82757586240768433 -0.54248678684234619 305 | v 0.11716866493225098 -0.47736850380897522 -0.85528743267059326 306 | v 0.027430815622210503 -0.63983547687530518 -0.75162476301193237 307 | v 0.097792722284793854 0.45068678259849548 -0.87157678604125977 308 | v 0.030995512381196022 -0.87455815076828003 -0.46395987272262573 309 | v 0.17664158344268799 -0.74495363235473633 -0.62550812959671021 310 | v 0.29978221654891968 -0.021017322316765785 -0.93704932928085327 311 | v 0.23962333798408508 -0.6660810112953186 -0.69014477729797363 312 | v 0.44866454601287842 -0.26329284906387329 -0.83616936206817627 313 | v 0.38237962126731873 -0.54148709774017334 -0.73031127452850342 314 | v 0.35972344875335693 -0.69236218929290771 -0.60605001449584961 315 | v 0.37670287489891052 0.47370785474777222 -0.77879339456558228 316 | v 0.12872420251369476 0.91538560390472412 -0.35878339409828186 317 | v 0.35416215658187866 0.65060853958129883 -0.65416437387466431 318 | v 0.65043932199478149 0.47757723927497864 -0.56699824333190918 319 | v 0.81274932622909546 0.07603812962770462 -0.55087542533874512 320 | v 0.766895592212677 -0.026298757642507553 -0.61607003211975098 321 | v 0.25361230969429016 0.93074977397918701 -0.23010087013244629 322 | v 0.87496668100357056 0.11839991807937622 -0.43459978699684143 323 | v 0.41060885787010193 0.88398581743240356 -0.17833027243614197 324 | v 0.72834563255310059 -0.51806044578552246 -0.41759577393531799 325 | v 0.65431886911392212 0.68718618154525757 -0.2778618335723877 326 | v 0.94446533918380737 -0.27858933806419373 -0.029934726655483246 327 | v 0.90500760078430176 -0.38505116105079651 -0.054609127342700958 328 | v 0.59053879976272583 0.78948843479156494 0.08392411470413208 329 | v 0.73687487840652466 -0.64884501695632935 0.10628367960453033 330 | v 0.94064849615097046 0.28808364272117615 0.056936122477054596 331 | v 0.25840398669242859 -0.95356607437133789 0.098596066236495972 332 | v 0.9405357837677002 0.118828184902668 0.26706305146217346 333 | v 0.39120253920555115 0.90897393226623535 0.06296982616186142 334 | v 0.65943920612335205 -0.63624131679534912 0.36837407946586609 335 | v 0.72304618358612061 0.51786983013153076 0.42755243182182312 336 | v 0.47074881196022034 -0.83824354410171509 0.23879578709602356 337 | v 0.76261109113693237 0.51678335666656494 0.35309764742851257 338 | v 0.54448235034942627 0.76169615983963013 0.31845101714134216 339 | v 0.64643567800521851 0.62414342164993286 0.40864229202270508 340 | v 0.21637414395809174 -0.94157695770263672 0.22844851016998291 341 | v 0.42077857255935669 -0.7254067063331604 0.52406811714172363 342 | v 0.28412890434265137 0.91197991371154785 0.2661382257938385 343 | v 0.19873824715614319 0.90655112266540527 0.34881106019020081 344 | v 0.43863841891288757 0.73843741416931152 0.49043568968772888 345 | v 0.31684949994087219 0.81627339124679565 0.46288657188415527 346 | v 0.32831257581710815 -0.55675852298736572 0.74592208862304688 347 | v 0.18443819880485535 0.84589821100234985 0.4814143180847168 348 | v 0.088689103722572327 0.64024728536605835 0.74770969152450562 349 | v 0.10075656324625015 -0.030290460214018822 0.97828066349029541 350 | v 0.13581401109695435 0.1401885449886322 0.96557116508483887 351 | v -0.024682076647877693 -0.032745160162448883 0.98347651958465576 352 | v -0.15699484944343567 -0.059413615614175797 0.96944630146026611 353 | v -0.16256482899188995 0.75057286024093628 0.62366455793380737 354 | v -0.0638718381524086 0.61595755815505981 0.76910489797592163 355 | v -0.081735789775848389 -0.78595167398452759 0.59494709968566895 356 | v -0.054998800158500671 0.36174356937408447 0.91474270820617676 357 | v -0.19823373854160309 -0.76552921533584595 0.59490251541137695 358 | v -0.17459309101104736 0.42225468158721924 0.87357449531555176 359 | v -0.29013335704803467 0.44501456618309021 0.83091521263122559 360 | v -0.3257344663143158 -0.041506782174110413 0.92773246765136719 361 | v -0.44841662049293518 0.26293379068374634 0.83600330352783203 362 | v -0.54179400205612183 -0.15882337093353271 0.8066939115524292 363 | v -0.44665113091468811 -0.36242386698722839 0.80047595500946045 364 | v -0.29405072331428528 0.61855870485305786 0.71131908893585205 365 | v -0.29157790541648865 -0.75653010606765747 0.56636804342269897 366 | v -0.60224467515945435 -0.20384620130062103 0.75231438875198364 367 | v -0.24125461280345917 -0.95425814390182495 0.13001343607902527 368 | v -0.67054033279418945 -0.10331840813159943 0.71332412958145142 369 | v -0.75067025423049927 -0.19732476770877838 0.60585051774978638 370 | v -0.71259218454360962 -0.44191369414329529 0.51878625154495239 371 | v -0.62412565946578979 -0.59784096479415894 0.47673419117927551 372 | v -0.59057039022445679 0.68230557441711426 0.402631014585495 373 | v -0.8552202582359314 -0.23582781851291656 0.42747634649276733 374 | v -0.38532340526580811 0.90498465299606323 0.12367232143878937 375 | v -0.91528254747390747 0.20854365825653076 0.29589971899986267 376 | v -0.95376962423324585 0.23954424262046814 0.051613759249448776 377 | v -0.95075637102127075 -0.23579862713813782 0.10278311371803284 378 | v -0.8845977783203125 -0.41185945272445679 0.13679622113704681 379 | v -0.72493267059326172 -0.6544872522354126 0.15171961486339569 380 | v -0.89663124084472656 -0.40746855735778809 -0.052757930010557175 381 | v -0.77135163545608521 0.53410232067108154 -0.30612275004386902 382 | v -0.92014592885971069 -0.066321372985839844 -0.34312376379966736 383 | v -0.59350329637527466 -0.73850661516189575 -0.28407388925552368 384 | v -0.90059554576873779 0.050862774252891541 -0.39353367686271667 385 | v -0.83160156011581421 0.088830426335334778 -0.5201643705368042 386 | v -0.75439846515655518 -0.062965825200080872 -0.62895512580871582 387 | v -0.34728115797042847 0.87474864721298218 -0.30827808380126953 388 | v -0.58174681663513184 -0.60793668031692505 -0.51713073253631592 389 | v -0.51549285650253296 -0.71126788854598999 -0.4540218710899353 390 | v -0.54982477426528931 0.52680331468582153 -0.62781405448913574 391 | v -0.27869173884391785 -0.89020001888275146 -0.33370611071586609 392 | v -0.60068392753601074 -0.017326723784208298 -0.77991384267807007 393 | v -0.4778934121131897 0.19751812517642975 -0.83805477619171143 394 | v -0.37492424249649048 -0.37761962413787842 -0.82948839664459229 395 | v -0.40415170788764954 0.63598757982254028 -0.63801819086074829 396 | v -0.24058282375335693 -0.77840369939804077 -0.56165933609008789 397 | v -0.19218046963214874 -0.65707838535308838 -0.71315884590148926 398 | v -0.14307823777198792 -0.84711408615112305 -0.49307653307914734 399 | v -0.41650471091270447 0.076930209994316101 -0.88906466960906982 400 | v -0.15749070048332214 0.91674917936325073 -0.34291622042655945 401 | v -0.022134251892566681 -0.33814948797225952 -0.92527741193771362 402 | v -0.136788010597229 -0.49684137105941772 -0.84172588586807251 403 | v -0.13935847580432892 -0.41708210110664368 -0.88225096464157104 404 | v -0.067872248589992523 -0.70935481786727905 -0.68574762344360352 405 | v 0.043986450880765915 -0.96247607469558716 -0.24266371130943298 406 | v 0.00356283038854599 0.96364784240722656 -0.24050030112266541 407 | v 0.22243620455265045 -0.10138267278671265 -0.95376414060592651 408 | v 0.023359466344118118 0.87511956691741943 -0.46437272429466248 409 | v 0.078281447291374207 -0.5380253791809082 -0.82325202226638794 410 | v -0.0039880312979221344 -0.45827946066856384 -0.87334245443344116 411 | v 0.11460927873849869 -0.68503135442733765 -0.70349884033203125 412 | v 0.1768803745508194 -0.80953842401504517 -0.54236263036727905 413 | v 0.18190069496631622 0.18305537104606628 -0.95003563165664673 414 | v 0.22164127230644226 -0.506977379322052 -0.81638073921203613 415 | v 0.16683927178382874 0.7418249249458313 -0.63316959142684937 416 | v 0.20760184526443481 0.64760082960128784 -0.71662598848342896 417 | v 0.3653741180896759 -0.76201403141021729 -0.51479899883270264 418 | v 0.22235727310180664 -0.88460314273834229 -0.38824194669723511 419 | v 0.43922466039657593 0.29463419318199158 -0.83149486780166626 420 | v 0.44358944892883301 -0.067420028150081635 -0.87567490339279175 421 | v 0.51305127143859863 -0.20982612669467926 -0.81485080718994141 422 | v 0.61311829090118408 0.32453027367591858 -0.69978982210159302 423 | v 0.55326944589614868 0.042721968144178391 -0.81304651498794556 424 | v 0.6605217456817627 -0.0082072513177990913 -0.72996938228607178 425 | v 0.48401832580566406 -0.53469753265380859 -0.67405962944030762 426 | v 0.44617363810539246 0.65880763530731201 -0.5854378342628479 427 | v 0.53006863594055176 0.64226871728897095 -0.53104472160339355 428 | v 0.42290478944778442 0.84331440925598145 -0.30036509037017822 429 | v 0.56803059577941895 -0.63818365335464478 -0.49629569053649902 430 | v 0.5550847053527832 0.67724865674972534 -0.45772060751914978 431 | v 0.69460874795913696 0.37244835495948792 -0.59243404865264893 432 | v 0.76476705074310303 0.18377886712551117 -0.59120422601699829 433 | v 0.1548035740852356 -0.96626633405685425 -0.16938322782516479 434 | v 0.82027095556259155 -0.071869611740112305 -0.53961837291717529 435 | v 0.85221511125564575 -0.15847951173782349 -0.46738937497138977 436 | v 0.86433804035186768 -0.045150376856327057 -0.46795809268951416 437 | v 0.25607654452323914 0.95320701599121094 -0.10397972166538239 438 | v 0.3414454460144043 0.88903599977493286 -0.27471128106117249 439 | v 0.64960604906082153 -0.65910220146179199 -0.34522590041160583 440 | v 0.77022862434387207 0.57244640588760376 -0.23539862036705017 441 | v 0.42113164067268372 -0.89393746852874756 -0.082149840891361237 442 | v 0.85954612493515015 0.25063389539718628 -0.41024506092071533 443 | v 0.82691127061843872 0.40032282471656799 -0.35735484957695007 444 | v 0.87246924638748169 0.31412264704704285 -0.33090907335281372 445 | v 0.97528398036956787 -0.0093096084892749786 -0.12827575206756592 446 | v 0.81093364953994751 0.55374902486801147 -0.099410369992256165 447 | v 0.86615484952926636 0.46874752640724182 -0.047940324991941452 448 | v 0.95834267139434814 0.16776716709136963 -0.1525668203830719 449 | v 0.91991317272186279 0.34101197123527527 -0.089758791029453278 450 | v 0.84430509805679321 -0.51109951734542847 0.012479484081268311 451 | v 0.82102149724960327 0.54389858245849609 0.063101634383201599 452 | v 0.52557373046875 -0.83936864137649536 -0.0025604534894227982 453 | v 0.90884774923324585 0.37979251146316528 -0.012702520005404949 454 | v 0.3848034143447876 -0.91387110948562622 0.026455776765942574 455 | v 0.97822988033294678 0.076667197048664093 0.072216972708702087 456 | v 0.97836524248123169 -0.093707755208015442 -0.05960354208946228 457 | v 0.98407632112503052 0.0026435451582074165 -0.018908930942416191 458 | v 0.96291637420654297 -0.17061024904251099 0.1112063005566597 459 | v 0.96646827459335327 -0.18535237014293671 0.022014666348695755 460 | v 0.55560594797134399 0.81850862503051758 -0.032577067613601685 461 | v 0.9470098614692688 -0.0045741093344986439 0.26707330346107483 462 | v 0.9048580527305603 -0.069915615022182465 0.38147887587547302 463 | v 0.71893453598022461 -0.61480849981307983 0.28207471966743469 464 | v 0.76761436462402344 0.60262185335159302 0.15278801321983337 465 | v 0.69465643167495728 0.66429740190505981 0.22850793600082397 466 | v 0.65900087356567383 -0.72875708341598511 0.1113431304693222 467 | v 0.68807238340377808 0.63229846954345703 0.32041281461715698 468 | v 0.34781274199485779 -0.91847097873687744 0.1377471536397934 469 | v 0.84254276752471924 0.29674068093299866 0.41537326574325562 470 | v 0.86592864990234375 -0.15782082080841064 0.44010850787162781 471 | v 0.8551255464553833 -0.32396045327186584 0.3651617169380188 472 | v 0.8193047046661377 -0.29463061690330505 0.46170306205749512 473 | v 0.3560793399810791 0.89912956953048706 0.21625101566314697 474 | v 0.79688560962677002 -0.017453305423259735 0.57713079452514648 475 | v 0.49359318614006042 0.78196388483047485 0.3536929190158844 476 | v 0.59425240755081177 -0.67560780048370361 0.40979292988777161 477 | v 0.58556300401687622 0.53132820129394531 0.59013909101486206 478 | v 0.67300325632095337 0.46695607900619507 0.54863119125366211 479 | v 0.77982383966445923 0.122031569480896 0.58885198831558228 480 | v 0.7334708571434021 0.25815650820732117 0.60553169250488281 481 | v 0.71171623468399048 0.11511535942554474 0.66945993900299072 482 | v 0.68959468603134155 -0.17912277579307556 0.67989182472229004 483 | v 0.5879477858543396 -0.18918977677822113 0.76691395044326782 484 | v 0.71843653917312622 0.011611288413405418 0.67340934276580811 485 | v 0.48009952902793884 -0.21312719583511353 0.83316761255264282 486 | v 0.49124285578727722 0.59993523359298706 0.61158472299575806 487 | v 0.40060365200042725 -0.26970371603965759 0.85863107442855835 488 | v 0.23313866555690765 0.75422871112823486 0.59683936834335327 489 | v 0.25790894031524658 -0.63576620817184448 0.71019518375396729 490 | v 0.30739143490791321 0.68917751312255859 0.63750076293945313 491 | v 0.33418720960617065 0.61414432525634766 0.69679611921310425 492 | v 0.20271646976470947 -0.80481469631195068 0.53885656595230103 493 | v 0.43418103456497192 0.084983371198177338 0.87903392314910889 494 | v 0.48556238412857056 -0.025062724947929382 0.85537177324295044 495 | v 0.47442498803138733 -0.126023069024086 0.85396939516067505 496 | v 0.16606047749519348 -0.89088797569274902 0.40041443705558777 497 | v 0.33830258250236511 0.080489613115787506 0.92126381397247314 498 | v 0.28908726572990417 -0.0052008051425218582 0.94068372249603271 499 | v 0.16867370903491974 0.014857428148388863 0.96969878673553467 500 | v 0.24599955976009369 -0.096997253596782684 0.94773542881011963 501 | v 0.19711419939994812 -0.21748800575733185 0.93984794616699219 502 | v 0.29125982522964478 -0.19799657166004181 0.91950720548629761 503 | v 0.28349560499191284 -0.29345414042472839 0.89615720510482788 504 | v 0.17952948808670044 -0.70755243301391602 0.66663694381713867 505 | v 0.11443520337343216 -0.78791749477386475 0.5878291130065918 506 | v 0.093667671084403992 -0.85599386692047119 0.4892973005771637 507 | v 0.15439854562282562 0.29151996970176697 0.92856818437576294 508 | v -0.025458607822656631 0.91787713766098022 0.37483566999435425 509 | v -0.039342381060123444 -0.97391122579574585 0.19191053509712219 510 | v -0.044141426682472229 -0.66222786903381348 0.73157846927642822 511 | v -0.16651266813278198 -0.3901558518409729 0.88999289274215698 512 | v -0.31977152824401855 -0.54358792304992676 0.75875890254974365 513 | v -0.20433281362056732 -0.68676668405532837 0.68075716495513916 514 | v -0.2825794517993927 0.11863011866807938 0.93602252006530762 515 | v -0.30276203155517578 -0.29842093586921692 0.88886523246765137 516 | v -0.403685063123703 -0.49219724535942078 0.75406903028488159 517 | v -0.34921610355377197 -0.61908310651779175 0.68597984313964844 518 | v -0.33765622973442078 -0.69618713855743408 0.61545175313949585 519 | v -0.41151320934295654 -0.63190567493438721 0.63732397556304932 520 | v -0.37963029742240906 0.54187470674514771 0.73173719644546509 521 | v -0.17865501344203949 -0.87404578924179077 0.43077558279037476 522 | v -0.35863602161407471 0.71647179126739502 0.5795866847038269 523 | v -0.50421243906021118 -0.60912960767745972 0.59137165546417236 524 | v -0.15412262082099915 -0.93312209844589233 0.29765167832374573 525 | v -0.6474306583404541 0.13066785037517548 0.7292097806930542 526 | v -0.5766945481300354 -0.071577161550521851 0.79409533739089966 527 | v -0.27557575702667236 0.89752781391143799 0.31962347030639648 528 | v -0.67434024810791016 -0.22289837896823883 0.68152278661727905 529 | v -0.48204299807548523 0.82356470823287964 0.26498091220855713 530 | v -0.67304831743240356 0.59326499700546265 0.41191604733467102 531 | v -0.66104918718338013 0.4714755117893219 0.55919063091278076 532 | v -0.78729820251464844 0.27164465188980103 0.52614682912826538 533 | v -0.67594695091247559 -0.59967488050460815 0.39677104353904724 534 | v -0.81195420026779175 0.37214654684066772 0.41704255342483521 535 | v -0.81432199478149414 -0.16871543228626251 0.52763283252716064 536 | v -0.87410813570022583 -0.092463880777359009 0.44397976994514465 537 | v -0.94074529409408569 -0.039057955145835876 0.28615134954452515 538 | v -0.71739017963409424 -0.60857152938842773 0.30060943961143494 539 | v -0.78591752052307129 -0.59006589651107788 0.096157409250736237 540 | v -0.66998070478439331 0.69912582635879517 0.1987275630235672 541 | v -0.5943906307220459 -0.75839215517044067 0.22169511020183563 542 | v -0.93253189325332642 0.29395908117294312 0.11610720306634903 543 | v -0.94823437929153442 0.073748722672462463 0.25526902079582214 544 | v -0.95255053043365479 -0.12667737901210785 0.21271200478076935 545 | v -0.97182738780975342 -0.11347457021474838 0.11147109419107437 546 | v -0.67087638378143311 0.71960687637329102 0.094663359224796295 547 | v -0.87845265865325928 -0.4461931586265564 0.037521619349718094 548 | v -0.64499175548553467 -0.74832040071487427 0.058298315852880478 549 | v -0.94241541624069214 0.2769550085067749 -0.076250612735748291 550 | v -0.9793848991394043 0.095073282718658447 -0.01339314877986908 551 | v -0.96702563762664795 0.14265282452106476 -0.11391996592283249 552 | v -0.9826166033744812 0.029519690200686455 -0.058095812797546387 553 | v -0.87427949905395508 0.26711702346801758 -0.36539113521575928 554 | v -0.9052046537399292 0.1402534693479538 -0.36059108376502991 555 | v -0.95679843425750732 -0.027510050684213638 -0.231209397315979 556 | v -0.7589266300201416 -0.6008681058883667 -0.1942690908908844 557 | v -0.75680327415466309 0.61209529638290405 -0.1665520966053009 558 | v -0.71666741371154785 0.62337237596511841 -0.26868817210197449 559 | v -0.74836814403533936 -0.55054992437362671 -0.33376801013946533 560 | v -0.82120651006698608 -0.43108680844306946 -0.3332294225692749 561 | v -0.71628439426422119 -0.49417361617088318 -0.46455091238021851 562 | v -0.64649629592895508 0.70816385746002197 -0.2420593798160553 563 | v -0.48728856444358826 0.83042216300964355 -0.23108823597431183 564 | v -0.72334086894989014 0.54622840881347656 -0.39104199409484863 565 | v -0.6368374228477478 0.65320789813995361 -0.38042834401130676 566 | v -0.78013217449188232 0.44956895709037781 -0.40282019972801208 567 | v -0.64962011575698853 0.31002920866012573 -0.67350107431411743 568 | v -0.30086863040924072 -0.93373745679855347 -0.14523041248321533 569 | v -0.69168770313262939 0.09655144065618515 -0.69336968660354614 570 | v -0.43367215991020203 0.82410472631454468 -0.33545172214508057 571 | v -0.64044266939163208 -0.4766172468662262 -0.57959753274917603 572 | v -0.49084237217903137 0.72258585691452026 -0.46294233202934265 573 | v -0.63192403316497803 -0.17823909223079681 -0.7343909740447998 574 | v -0.48027971386909485 -0.358904629945755 -0.78146809339523315 575 | v -0.25966119766235352 0.9098132848739624 -0.29695248603820801 576 | v -0.51439231634140015 -0.6080547571182251 -0.5837780237197876 577 | v -0.45438331365585327 -0.68130660057067871 -0.55256348848342896 578 | v -0.5009770393371582 0.39630860090255737 -0.75047492980957031 579 | v -0.6085582971572876 0.18915878236293793 -0.75069361925125122 580 | v -0.51459336280822754 0.28660038113594055 -0.78929662704467773 581 | v -0.67962068319320679 -0.012682782486081123 -0.71133458614349365 582 | v -0.62130147218704224 0.084565669298171997 -0.75810533761978149 583 | v -0.54157340526580811 -0.097420185804367065 -0.81614077091217041 584 | v 0.027505544945597649 -0.98533076047897339 -0.1300647109746933 585 | v -0.36372411251068115 -0.73346394300460815 -0.55547982454299927 586 | v -0.25521576404571533 -0.81675761938095093 -0.49709621071815491 587 | v -0.23871564865112305 0.45911732316017151 -0.83967185020446777 588 | v -0.17746242880821228 0.28342258930206299 -0.92647510766983032 589 | v -0.33216306567192078 -0.12144125252962112 -0.91875243186950684 590 | v -0.012144500389695168 0.17000120878219604 -0.96940100193023682 591 | v -0.17142796516418457 -0.028398441150784492 -0.96850705146789551 592 | v -0.061346292495727539 0.01088019460439682 -0.98236256837844849 593 | v -0.088137440383434296 -0.23151008784770966 -0.95279872417449951 594 | v -0.074759125709533691 0.74880248308181763 -0.64187765121459961 595 | v 0.021540209650993347 0.80535304546356201 -0.57466727495193481 596 | v -0.02692774124443531 -0.92898392677307129 -0.34681889414787292 597 | v -0.16897721588611603 0.41897168755531311 -0.87629538774490356 598 | v 0.058660600334405899 0.26802954077720642 -0.94553768634796143 599 | v 0.082732893526554108 0.1710965633392334 -0.96572196483612061 600 | v 0.1250767856836319 0.057256106287240982 -0.97490996122360229 601 | v 0.082729250192642212 -0.21180267632007599 -0.95817023515701294 602 | v 0.18356327712535858 0.0017721932381391525 -0.96680819988250732 603 | v 0.11117570847272873 -0.098560407757759094 -0.97282147407531738 604 | v 0.061959195882081985 -0.3380381166934967 -0.92389148473739624 605 | v 0.0028312429785728455 0.69166058301925659 -0.70658421516418457 606 | v 0.099422648549079895 0.68169546127319336 -0.70897567272186279 607 | v 0.14205636084079742 -0.60164260864257813 -0.76994144916534424 608 | v 0.24344807863235474 0.28632652759552002 -0.91026127338409424 609 | v 0.36541092395782471 -0.12021304666996002 -0.90706491470336914 610 | v 0.30882909893989563 -0.62366175651550293 -0.70086544752120972 611 | v 0.16229155659675598 0.5808289647102356 -0.78126049041748047 612 | v 0.28931999206542969 0.59628301858901978 -0.73179876804351807 613 | v 0.2888348400592804 0.52497714757919312 -0.78452497720718384 614 | v 0.45272007584571838 -0.35710036754608154 -0.7997584342956543 615 | v 0.3339325487613678 0.79697602987289429 -0.483437180519104 616 | v 0.43955960869789124 0.190994992852211 -0.85972487926483154 617 | v 0.48758378624916077 0.11248277872800827 -0.84750241041183472 618 | v 0.52953064441680908 0.20702674984931946 -0.80372220277786255 619 | v 0.58243441581726074 0.13714534044265747 -0.78130495548248291 620 | v 0.65357953310012817 0.078756235539913177 -0.73126751184463501 621 | v 0.5971643328666687 -0.070900760591030121 -0.77890616655349731 622 | v 0.16791506111621857 0.96206337213516235 -0.17752783000469208 623 | v 0.54223924875259399 -0.56734508275985718 -0.59828484058380127 624 | v 0.43977203965187073 0.73595064878463745 -0.49259907007217407 625 | v 0.39622032642364502 -0.62935680150985718 -0.64983350038528442 626 | v 0.40942037105560303 0.57067358493804932 -0.69349449872970581 627 | v 0.61318677663803101 0.43179807066917419 -0.64030081033706665 628 | v 0.62729966640472412 -0.48038187623023987 -0.58957678079605103 629 | v 0.64375096559524536 -0.53072977066040039 -0.52699172496795654 630 | v 0.50769567489624023 0.73619377613067627 -0.4213482141494751 631 | v 0.74728912115097046 0.43404915928840637 -0.47484791278839111 632 | v 0.79738342761993408 0.25391408801078796 -0.51995635032653809 633 | v 0.82819700241088867 0.15214261412620544 -0.50940734148025513 634 | v 0.90833002328872681 0.1533554345369339 -0.34826579689979553 635 | v 0.85072177648544312 -0.29696264863014221 -0.39928671717643738 636 | v 0.52139127254486084 0.7921566367149353 -0.28251641988754272 637 | v 0.73340415954589844 -0.60805982351303101 -0.26126366853713989 638 | v 0.6422685980796814 0.64099210500717163 -0.39046445488929749 639 | v 0.48673692345619202 -0.83933234214782715 -0.19692909717559814 640 | v 0.77024626731872559 0.47982925176620483 -0.38646242022514343 641 | v 0.42452913522720337 -0.85119760036468506 -0.2742074728012085 642 | v 0.81618332862854004 -0.52087324857711792 -0.18740662932395935 643 | v 0.61083877086639404 0.7516249418258667 -0.20180128514766693 644 | v 0.7823939323425293 0.5394100546836853 -0.26661980152130127 645 | v 0.58264338970184326 -0.74435657262802124 -0.29015663266181946 646 | v 0.63659018278121948 -0.75367856025695801 -0.080599263310432434 647 | v 0.56390058994293213 -0.79019123315811157 -0.18989674746990204 648 | v 0.94336539506912231 0.12699617445468903 -0.25074481964111328 649 | v 0.13167981803417206 0.98187273740768433 -0.088106334209442139 650 | v 0.93831533193588257 -0.083758227527141571 -0.2844347357749939 651 | v 0.90012532472610474 -0.26403537392616272 -0.29912969470024109 652 | v 0.97512602806091309 0.13235607743263245 0.0014131378848105669 653 | v 0.97643089294433594 0.087936364114284515 -0.086531400680541992 654 | v 0.48186305165290833 0.8659711480140686 0.013143366202712059 655 | v 0.72143948078155518 0.6686023473739624 -0.098101645708084106 656 | v 0.69599151611328125 -0.69831180572509766 -0.071456849575042725 657 | v 0.95782846212387085 0.2213970422744751 -0.052497871220111847 658 | v 0.74275606870651245 -0.65151023864746094 0.021301468834280968 659 | v 0.68737268447875977 0.70312511920928955 0.10214928537607193 660 | v 0.46151551604270935 -0.86916369199752808 0.11715197563171387 661 | v 0.96318280696868896 0.18547171354293823 0.08193235844373703 662 | v 0.98018419742584229 -0.056344076991081238 0.07314542680978775 663 | v 0.96473187208175659 -0.060568016022443771 0.18544241786003113 664 | v 0.8041343092918396 -0.56135296821594238 0.11084536463022232 665 | v 0.9006461501121521 0.14057724177837372 0.37141865491867065 666 | v 0.92852967977523804 -0.1202901229262352 0.30417576432228088 667 | v 0.90676814317703247 -0.22468605637550354 0.30998861789703369 668 | v 0.94677925109863281 0.1790388822555542 0.20095917582511902 669 | v 0.86274051666259766 0.35256242752075195 0.31803154945373535 670 | v 0.53853070735931396 -0.77070504426956177 0.30770546197891235 671 | v 0.099499888718128204 -0.98480457067489624 0.088081814348697662 672 | v 0.40894734859466553 0.85718148946762085 0.28037473559379578 673 | v 0.23587708175182343 0.95261269807815552 0.15026634931564331 674 | v 0.70452755689620972 -0.46114376187324524 0.51387327909469604 675 | v 0.56284713745117188 -0.61953228712081909 0.52341049909591675 676 | v 0.67187821865081787 0.3932684063911438 0.60390430688858032 677 | v 0.64399540424346924 0.19492806494235992 0.71940374374389648 678 | v 0.4892515242099762 0.32009169459342957 0.7930905818939209 679 | v 0.59518551826477051 0.24402917921543121 0.74603563547134399 680 | v 0.59259521961212158 -0.00043227290734648705 0.78559416532516479 681 | v 0.033328603953123093 0.98536878824234009 0.12953601777553558 682 | v 0.64384990930557251 -0.072325311601161957 0.74056112766265869 683 | v 0.5703696608543396 -0.083079524338245392 0.79744410514831543 684 | v 0.54430514574050903 -0.29112401604652405 0.76691418886184692 685 | v 0.57263475656509399 -0.36641794443130493 0.71279597282409668 686 | v 0.40386974811553955 0.80707055330276489 0.40713039040565491 687 | v 0.52476972341537476 0.64614874124526978 0.53251463174819946 688 | v 0.41362559795379639 -0.4337596595287323 0.78234618902206421 689 | v 0.22771641612052917 -0.83578395843505859 0.48026075959205627 690 | v 0.46629324555397034 0.50716429948806763 0.70614355802536011 691 | v 0.48063209652900696 0.19078846275806427 0.83830922842025757 692 | v 0.28334718942642212 0.24899600446224213 0.90959763526916504 693 | v 0.19579923152923584 0.087094150483608246 0.96075016260147095 694 | v 0.35080134868621826 -0.13866706192493439 0.90946215391159058 695 | v 0.24410012364387512 -0.47421565651893616 0.82990598678588867 696 | v 0.17287491261959076 -0.55256599187850952 0.79982006549835205 697 | v 0.14566595852375031 -0.66271775960922241 0.71836394071578979 698 | v 0.11406984180212021 -0.25385373830795288 0.94417822360992432 699 | v 0.011973792687058449 -0.32794931530952454 0.92895799875259399 700 | v 0.13576485216617584 -0.44498422741889954 0.86890220642089844 701 | v 0.096653908491134644 0.41621515154838562 0.88899880647659302 702 | v 0.16004352271556854 0.53588414192199707 0.81364184617996216 703 | v 0.041867997497320175 0.55181211233139038 0.81784248352050781 704 | v 0.0019366182386875153 -0.22149860858917236 0.95993310213088989 705 | v -0.086582742631435394 -0.4980664849281311 0.84703058004379272 706 | v -0.18792763352394104 0.63682830333709717 0.7312818169593811 707 | v -0.35586047172546387 0.23743817210197449 0.88713204860687256 708 | v -0.23281019926071167 -0.12741199135780334 0.94819694757461548 709 | v -0.51825982332229614 0.20343056321144104 0.81162077188491821 710 | v -0.056653693318367004 0.96093523502349854 0.24515189230442047 711 | v -0.39470270276069641 -0.23971252143383026 0.87041836977005005 712 | v -0.29744252562522888 -0.80500185489654541 0.49225008487701416 713 | v -0.41370415687561035 0.76502764225006104 0.47076964378356934 714 | v -0.61410248279571533 0.20733754336833954 0.74117845296859741 715 | v -0.62176513671875 0.018580552190542221 0.76315683126449585 716 | v -0.066270560026168823 0.99110150337219238 0.044045209884643555 717 | v -0.61745345592498779 -0.32908320426940918 0.69316822290420532 718 | v -0.22962875664234161 -0.93989640474319458 0.21786060929298401 719 | v -0.77294248342514038 0.080444782972335815 0.6041749119758606 720 | v -0.69629442691802979 0.043473195284605026 0.69424045085906982 721 | v -0.83790469169616699 -0.0072983624413609505 0.51690679788589478 722 | v -0.78893148899078369 -0.080705367028713226 0.58246546983718872 723 | v -0.62332290410995483 0.56337696313858032 0.51755046844482422 724 | v -0.57387000322341919 0.64037400484085083 0.4852219820022583 725 | v -0.43230614066123962 -0.82514059543609619 0.33683094382286072 726 | v -0.70767438411712646 0.28855079412460327 0.62102437019348145 727 | v -0.76303207874298096 0.32674777507781982 0.5301971435546875 728 | v -0.68308156728744507 0.64564239978790283 0.30341070890426636 729 | v -0.53470730781555176 -0.77223479747772217 0.31112468242645264 730 | v -0.78084653615951538 0.46591538190841675 0.38182607293128967 731 | v -0.75404995679855347 0.57274407148361206 0.28068572282791138 732 | v -0.86522632837295532 0.25914499163627625 0.39301654696464539 733 | v -0.86940735578536987 0.096825204789638519 0.45023968815803528 734 | v -0.40853419899940491 0.87378787994384766 0.22431398928165436 735 | v -0.90912729501724243 -0.068458192050457001 0.3705403208732605 736 | v -0.91353112459182739 -0.24421733617782593 0.27530288696289063 737 | v -0.89688903093338013 -0.3556067943572998 0.20117232203483582 738 | v -0.65714567899703979 -0.69423127174377441 0.25049296021461487 739 | v -0.71845102310180664 0.65432465076446533 0.17749039828777313 740 | v -0.65352344512939453 -0.72040945291519165 0.17650191485881805 741 | v -0.81968355178833008 0.46782127022743225 0.28800776600837708 742 | v -0.8378748893737793 0.47795987129211426 0.2032431960105896 743 | v -0.43501541018486023 -0.86693155765533447 0.2037094384431839 744 | v -0.87503647804260254 0.3308834433555603 0.30953547358512878 745 | v -0.89576983451843262 0.35457965731620789 0.20778845250606537 746 | v -0.9536052942276001 0.16437871754169464 0.18304590880870819 747 | v -0.87680333852767944 0.43598377704620361 0.11813568323850632 748 | v -0.80028504133224487 0.5572168231010437 0.15292473137378693 749 | v -0.82099407911300659 0.546092689037323 0.030729582533240318 750 | v -0.97890704870223999 0.029518131166696548 0.098946228623390198 751 | v -0.92780733108520508 -0.32634490728378296 0.058167748153209686 752 | v -0.8439640998840332 -0.47807100415229797 0.1804671436548233 753 | v -0.97632360458374023 -0.058928228914737701 -0.1103024035692215 754 | v -0.96646958589553833 -0.1649274080991745 -0.08531554788351059 755 | v -0.72618389129638672 0.66999495029449463 -0.028644517064094543 756 | v -0.69536560773849487 0.68710929155349731 -0.14562132954597473 757 | v -0.7896924614906311 -0.59099376201629639 -0.049991346895694733 758 | v -0.71734786033630371 -0.67699950933456421 -0.065412767231464386 759 | v -0.14163641631603241 -0.98452907800674438 -0.011639101430773735 760 | v -0.90732836723327637 0.32111617922782898 -0.20906972885131836 761 | v -0.94645202159881592 0.1471935510635376 -0.22822639346122742 762 | v -0.93499892950057983 0.032903064042329788 -0.30378517508506775 763 | v -0.94669198989868164 -0.16346733272075653 -0.2184440940618515 764 | v -0.8994826078414917 -0.31091406941413879 -0.25309237837791443 765 | v -0.4190768301486969 0.8923335075378418 -0.10578062385320663 766 | v -0.85484480857849121 -0.37114819884300232 -0.32068097591400146 767 | v -0.81035840511322021 -0.4976692795753479 -0.26119345426559448 768 | v -0.69665533304214478 -0.67304998636245728 -0.19434857368469238 769 | v -0.57309186458587646 0.71337407827377319 -0.3742777407169342 770 | v -0.64725685119628906 0.58501505851745605 -0.46140420436859131 771 | v -0.50388872623443604 -0.82333695888519287 -0.22197726368904114 772 | v -0.8776925802230835 -0.019514944404363632 -0.44424781203269958 773 | v -0.8204612135887146 -0.027861744165420532 -0.54263556003570557 774 | v -0.82666653394699097 -0.20997501909732819 -0.49219140410423279 775 | v -0.2173609733581543 -0.93106919527053833 -0.26272884011268616 776 | v -0.74007123708724976 0.025457628071308136 -0.64790040254592896 777 | v -0.74965190887451172 -0.19738446176052094 -0.60751265287399292 778 | v -0.62512856721878052 -0.29071664810180664 -0.70355302095413208 779 | v -0.34119808673858643 0.84001213312149048 -0.3997943103313446 780 | v -0.40310344099998474 0.73797869682312012 -0.52139192819595337 781 | v -0.53918188810348511 -0.53289902210235596 -0.63211852312088013 782 | v -0.42118942737579346 -0.7718498706817627 -0.45406335592269897 783 | v -0.2305670827627182 -0.86851048469543457 -0.41656953096389771 784 | v -0.39039456844329834 0.29786494374275208 -0.85387927293777466 785 | v -0.45083525776863098 -0.10742104053497314 -0.86815911531448364 786 | v -0.52490502595901489 -0.25056007504463196 -0.79512953758239746 787 | v -0.31329420208930969 0.70089536905288696 -0.62305068969726563 788 | v -0.36134710907936096 0.40802097320556641 -0.82076740264892578 789 | v -0.29128506779670715 0.53211492300033569 -0.77769458293914795 790 | v -0.21758626401424408 0.66472798585891724 -0.69804787635803223 791 | v -0.18767516314983368 0.56864291429519653 -0.78509920835494995 792 | v -0.26902332901954651 0.35802152752876282 -0.87809020280838013 793 | v -0.27779608964920044 -0.23895449936389923 -0.91422861814498901 794 | v -0.12303326278924942 0.85423672199249268 -0.48577007651329041 795 | v -0.0079892389476299286 0.073062941431999207 -0.98189103603363037 796 | v -0.095746167004108429 -0.10957827419042587 -0.97383975982666016 797 | v 0.02751532755792141 -0.070130228996276855 -0.98158323764801025 798 | v -0.0097298519685864449 -0.19717144966125488 -0.96436542272567749 799 | v -0.12329110503196716 0.66861683130264282 -0.71642661094665527 800 | v 0.0014658945146948099 0.61835247278213501 -0.76975071430206299 801 | v -0.090948387980461121 0.47569093108177185 -0.8593132495880127 802 | v -0.007625676691532135 0.40972161293029785 -0.89656805992126465 803 | v -0.21831245720386505 0.17280259728431702 -0.94451868534088135 804 | v 0.18162669241428375 -0.18509998917579651 -0.94956099987030029 805 | v 0.04689924418926239 -0.91763979196548462 -0.37161910533905029 806 | v 0.24773024022579193 0.86988341808319092 -0.40511828660964966 807 | v 0.41627833247184753 0.028124639764428139 -0.89114677906036377 808 | v 0.2639278769493103 -0.56677180528640747 -0.76355510950088501 809 | v 0.81461238861083984 0.32422804832458496 -0.44841903448104858 810 | v 0.70565605163574219 0.66980677843093872 -0.17112654447555542 811 | v 0.7101215124130249 -0.66116762161254883 -0.18480189144611359 812 | v 0.36121389269828796 0.92166149616241455 -0.048885289579629898 813 | v 0.28818348050117493 -0.94899964332580566 -0.036195792257785797 814 | v 0.96100467443466187 -0.19011156260967255 -0.096355848014354706 815 | v 0.3142414391040802 0.93413901329040527 0.11248017102479935 816 | v 0.76289767026901245 0.57224559783935547 0.25481966137886047 817 | v 0.84092593193054199 -0.43029335141181946 0.28318494558334351 818 | v 0.56084573268890381 0.68512594699859619 0.43934190273284912 819 | v 0.78599494695663452 0.40681588649749756 0.43470627069473267 820 | v 0.65634071826934814 0.09497687965631485 0.7278512716293335 821 | v 0.51083940267562866 0.42753994464874268 0.72606140375137329 822 | v 0.35665294528007507 -0.6908075213432312 0.60961759090423584 823 | v 0.26309916377067566 0.56564992666244507 0.76465797424316406 824 | v 0.17675696313381195 0.68298792839050293 0.69165444374084473 825 | v 0.25022190809249878 0.18149358034133911 0.93459469079971313 826 | v -0.049103222787380219 -0.5782548189163208 0.79868233203887939 827 | v -0.068107195198535919 -0.40508365631103516 0.89543181657791138 828 | v -0.22307431697845459 -0.90829038619995117 0.32892733812332153 829 | v -0.35671669244766235 0.86463445425033569 0.32672956585884094 830 | v -0.61274600028991699 -0.68606185913085938 0.36257347464561462 831 | v -0.72561353445053101 -0.53083038330078125 0.4068472683429718 832 | v -0.96712422370910645 -0.012909349054098129 0.18078871071338654 833 | v -0.96799129247665405 0.17859253287315369 -0.019141234457492828 834 | v -0.73110342025756836 -0.66379237174987793 0.013629132881760597 835 | v -0.6874234676361084 -0.66396945714950562 -0.2544669508934021 836 | v -0.71147817373275757 0.19890274107456207 -0.65131330490112305 837 | v -0.73795944452285767 -0.39600905776023865 -0.52023392915725708 838 | v 0.13572521507740021 0.30387008190155029 -0.92737495899200439 839 | v 0.31662052869796753 0.32349911332130432 -0.87492227554321289 840 | v 0.61440503597259521 -0.31756743788719177 -0.70149290561676025 841 | v 0.72781831026077271 -0.64127391576766968 0.18484731018543243 842 | v 0.83268570899963379 0.47974243760108948 0.22329026460647583 843 | v 0.62235325574874878 0.69990038871765137 0.31793281435966492 844 | v 0.64566946029663086 0.55662673711776733 0.49789085984230042 845 | v 0.57564079761505127 0.36248853802680969 0.71336036920547485 846 | v 0.37920463085174561 0.50355035066604614 0.75903451442718506 847 | v 0.069603323936462402 0.84376955032348633 0.51353180408477783 848 | v 0.065562963485717773 -0.51142948865890503 0.84074747562408447 849 | v 0.1203448697924614 0.79309946298599243 0.58028435707092285 850 | v -0.24498380720615387 -0.59709352254867554 0.74675637483596802 851 | v -0.14531950652599335 0.97916054725646973 0.093251869082450867 852 | v -0.3741493821144104 0.66492855548858643 0.62728500366210938 853 | v -0.38418799638748169 -0.91375970840454102 -0.019095931202173233 854 | v -0.43712574243545532 0.8892592191696167 0.024892402812838554 855 | v -0.83378982543945313 -0.52812641859054565 0.0096502229571342468 856 | v -0.95805197954177856 0.080644585192203522 -0.21159732341766357 857 | v -0.63566553592681885 -0.64217311143875122 -0.39983725547790527 858 | v -0.81571865081787109 0.33819791674613953 -0.43723934888839722 859 | v -0.29632857441902161 0.25533115863800049 -0.90333020687103271 860 | v -0.18910640478134155 0.87270826101303101 -0.42946514487266541 861 | v 0.36887872219085693 0.10140996426343918 -0.90738135576248169 862 | v 0.033875204622745514 0.9178922176361084 -0.37253928184509277 863 | v 0.26395443081855774 -0.42862200736999512 -0.84709697961807251 864 | v 0.46976578235626221 -0.46890890598297119 -0.72936266660690308 865 | v 0.31762388348579407 -0.90379083156585693 -0.25714617967605591 866 | v 0.56038397550582886 -0.35648858547210693 -0.72862571477890015 867 | v 0.61278694868087769 -0.22693988680839539 -0.73617202043533325 868 | v 0.21638184785842896 0.91649925708770752 -0.30882266163825989 869 | v 0.72154855728149414 0.26242631673812866 -0.61677896976470947 870 | v 0.73252731561660767 0.044555444270372391 -0.65539330244064331 871 | v 0.83246397972106934 0.45681369304656982 -0.25975140929222107 872 | v 0.87640869617462158 0.38209092617034912 -0.23936139047145844 873 | v 0.90086454153060913 -0.14166346192359924 -0.37145704030990601 874 | v 0.92636799812316895 -0.30308869481086731 -0.14649105072021484 875 | v 0.46253690123558044 0.87074905633926392 -0.099892504513263702 876 | v 0.51483148336410522 0.82909458875656128 -0.17013843357563019 877 | v 0.66159725189208984 0.73536348342895508 -0.0074480697512626648 878 | v 0.85936534404754639 -0.4715212881565094 0.1064097136259079 879 | v 0.54170948266983032 -0.81093060970306396 0.17091047763824463 880 | v 0.8873286247253418 0.24710939824581146 0.34873008728027344 881 | v 0.11662551760673523 0.98726022243499756 0.023915573954582214 882 | v 0.5811273455619812 0.46367022395133972 0.64800405502319336 883 | v 0.34718659520149231 -0.78647458553314209 0.48997631669044495 884 | v 0.42093390226364136 0.38759779930114746 0.80279064178466797 885 | v 0.092094533145427704 -0.92418617010116577 0.34669572114944458 886 | v 0.076093614101409912 0.93051791191101074 0.33481276035308838 887 | v -0.0029124878346920013 -0.82336103916168213 0.549735426902771 888 | v -0.2243582159280777 0.24635942280292511 0.92730998992919922 889 | v -0.021480843424797058 -0.98956173658370972 0.098266586661338806 890 | v -0.094700612127780914 -0.30007386207580566 0.93325746059417725 891 | v -0.06407938152551651 0.5009801983833313 0.8470456600189209 892 | v -0.032798077911138535 0.44706526398658752 0.878226637840271 893 | v -0.12396425753831863 0.81348329782485962 0.55068647861480713 894 | v -0.26117280125617981 0.85322356224060059 0.43027079105377197 895 | v -0.65652519464492798 -0.52104192972183228 0.5198444128036499 896 | v -0.58322632312774658 0.49026143550872803 0.62710928916931152 897 | v -0.60596412420272827 0.72660601139068604 0.28860300779342651 898 | v -0.15824532508850098 -0.97765374183654785 0.084863141179084778 899 | v -0.54914242029190063 -0.80624908208847046 0.17039777338504791 900 | v -0.38596898317337036 -0.9062124490737915 0.11166795343160629 901 | v -0.10970756411552429 0.9863661527633667 -0.060175534337759018 902 | v -0.52056550979614258 0.83506041765213013 -0.11275071650743484 903 | v -0.90601283311843872 0.36870589852333069 -0.11817630380392075 904 | v -0.34896087646484375 -0.90190839767456055 -0.22037629783153534 905 | v -0.88042593002319336 0.3350643515586853 -0.28748446702957153 906 | v -0.37515902519226074 0.89182198047637939 -0.21663229167461395 907 | v -0.83194905519485474 0.37751302123069763 -0.36794751882553101 908 | v -0.75682830810546875 0.29776239395141602 -0.55600517988204956 909 | v -0.80816066265106201 -0.10372841358184814 -0.55280381441116333 910 | v -0.78360658884048462 0.096916861832141876 -0.58863639831542969 911 | v -0.54851138591766357 -0.45961055159568787 -0.67763358354568481 912 | v -0.14193850755691528 -0.92239415645599365 -0.33605185151100159 913 | v -0.44988706707954407 0.36905443668365479 -0.79527902603149414 914 | v -0.08337007462978363 0.82274150848388672 -0.54483360052108765 915 | v -0.11161582916975021 -0.89978933334350586 -0.3995029628276825 916 | v -0.17665034532546997 -0.20500940084457397 -0.94694435596466064 917 | v -0.27605706453323364 0.82182741165161133 -0.47922322154045105 918 | v -0.044377151876688004 0.28161787986755371 -0.94308775663375854 919 | v 0.042318020015954971 0.75411683320999146 -0.6380581259727478 920 | v 0.18447135388851166 -0.93474459648132324 -0.27707958221435547 921 | v 0.27502697706222534 -0.23266476392745972 -0.91656768321990967 922 | v 0.35852590203285217 -0.27946200966835022 -0.87316924333572388 923 | v 0.53551352024078369 0.29985746741294861 -0.77042621374130249 924 | v 0.7800145149230957 -0.21824364364147186 -0.56032025814056396 925 | v 0.790272057056427 -0.41514268517494202 -0.41855233907699585 926 | v 0.64264106750488281 -0.71790856122970581 -0.22265852987766266 927 | v 0.26604929566383362 -0.94609558582305908 -0.13858307898044586 928 | v 0.32595258951187134 0.92561596632003784 -0.14137460291385651 929 | v 0.27519109845161438 0.9533647894859314 -0.015910148620605469 930 | v 0.18056823313236237 -0.97696202993392944 -0.032586902379989624 931 | v 0.092016428709030151 -0.98955816030502319 -0.041367817670106888 932 | v 0.17782479524612427 -0.97369951009750366 0.090855799615383148 933 | v 0.74744617938995361 0.37746015191078186 0.52049285173416138 934 | v 0.49803060293197632 0.82241004705429077 0.23461975157260895 935 | v 0.72270381450653076 -0.089867629110813141 0.66237443685531616 936 | v 0.79972827434539795 -0.149312824010849 0.55549740791320801 937 | v 0.67254966497421265 0.31747356057167053 0.64662420749664307 938 | v 0.52815663814544678 -0.5388062596321106 0.63606524467468262 939 | v 0.67421650886535645 -0.34459054470062256 0.63067334890365601 940 | v 0.55223405361175537 -0.46788311004638672 0.66928267478942871 941 | v 0.46265655755996704 -0.62438136339187622 0.60978347063064575 942 | v 0.16048148274421692 0.94713151454925537 0.24966214597225189 943 | v 0.38765734434127808 0.254619300365448 0.86887568235397339 944 | v 0.18432262539863586 -0.92562216520309448 0.30316963791847229 945 | v 0.31267300248146057 0.46524778008460999 0.81201738119125366 946 | v 0.069427825510501862 0.96303695440292358 0.22981639206409454 947 | v 0.098574250936508179 0.88608247041702271 0.43177357316017151 948 | v 0.19936108589172363 -0.35107743740081787 0.89904528856277466 949 | v -0.015865039080381393 0.86761480569839478 0.47787103056907654 950 | v 0.083038181066513062 0.747702956199646 0.64215189218521118 951 | v -0.036851938813924789 0.20069237053394318 0.96347916126251221 952 | v -0.02312946692109108 -0.9408450722694397 0.31469738483428955 953 | v 0.026179078966379166 0.30696007609367371 0.93578404188156128 954 | v -0.097901545464992523 -0.15682896971702576 0.96736419200897217 955 | v -0.09841618686914444 -0.71084284782409668 0.68071532249450684 956 | v -0.10309699177742004 -0.85347330570220947 0.49252262711524963 957 | v -0.37207525968551636 0.062697350978851318 0.9088592529296875 958 | v -0.37363001704216003 0.32739996910095215 0.85013985633850098 959 | v -0.32924538850784302 -0.83967763185501099 0.40858927369117737 960 | v -0.073613427579402924 0.97913205623626709 0.15589761734008789 961 | v -0.19447165727615356 0.93190991878509521 0.27836859226226807 962 | v -0.31899803876876831 -0.91372501850128174 0.21398788690567017 963 | v -0.72101205587387085 -0.132546067237854 0.65635907649993896 964 | v -0.19111590087413788 0.9585411548614502 0.17345046997070313 965 | v -0.31407687067985535 0.92010194063186646 0.19520227611064911 966 | v -0.51626908779144287 0.75596362352371216 0.3751254677772522 967 | v -0.33181264996528625 -0.881256103515625 0.30864745378494263 968 | v -0.84157192707061768 0.19781523942947388 0.47176223993301392 969 | v -0.78908401727676392 -0.40670004487037659 0.42884644865989685 970 | v -0.91792947053909302 -0.1479429304599762 0.32507142424583435 971 | v -0.75537681579589844 0.63022774457931519 0.084739148616790771 972 | v -0.87449657917022705 0.45618465542793274 -0.016915176063776016 973 | v -0.31733137369155884 0.93927055597305298 -0.033624060451984406 974 | v -0.93883669376373291 -0.28493580222129822 -0.092493064701557159 975 | v -0.42922163009643555 -0.88574552536010742 -0.11725261062383652 976 | v -0.9365275502204895 0.24694448709487915 -0.17609864473342896 977 | v -0.18617166578769684 -0.9650418758392334 -0.14633330702781677 978 | v -0.22228787839412689 0.96770864725112915 -0.039720151573419571 979 | v -0.71116036176681519 -0.5655708909034729 -0.38441136479377747 980 | v -0.30017301440238953 0.93329209089279175 -0.15473921597003937 981 | v -0.57923084497451782 -0.36340877413749695 -0.71002280712127686 982 | v -0.080188296735286713 -0.98757851123809814 -0.08118235319852829 983 | v -0.15987737476825714 0.96697074174880981 -0.16204248368740082 984 | v -0.085041403770446777 -0.96859312057495117 -0.20554301142692566 985 | v -0.15909790992736816 0.94498789310455322 -0.255615234375 986 | v -0.36106640100479126 -0.4614797830581665 -0.79268169403076172 987 | v -0.34351587295532227 -0.66905289888381958 -0.64018005132675171 988 | v -0.45974665880203247 0.54981410503387451 -0.67887717485427856 989 | v -0.25884050130844116 -0.69389581680297852 -0.65502899885177612 990 | v -0.081202350556850433 0.96837329864501953 -0.20444600284099579 991 | v -0.34657418727874756 -0.020276784896850586 -0.92122071981430054 992 | v -0.23605531454086304 -0.073844321072101593 -0.95335906744003296 993 | v -0.15440733730792999 0.076573140919208527 -0.96874797344207764 994 | v -0.052439909428358078 0.54781574010848999 -0.818733811378479 995 | v -0.046450082212686539 -0.86396682262420654 -0.48205634951591492 996 | v 0.83855563402175903 0.08537253737449646 0.5086514949798584 997 | v 0.28881150484085083 -0.75102543830871582 0.57473176717758179 998 | v 0.28802973031997681 -0.87082606554031372 0.37589037418365479 999 | v 0.004671639297157526 -0.99552458524703979 -0.0030334345065057278 1000 | v 0.0060232668183743954 0.99563485383987427 -0.0094096669927239418 1001 | f 590 918 598 1002 | f 598 53 838 1003 | f 795 797 592 1004 | f 795 599 600 1005 | f 599 413 600 1006 | f 11 604 52 1007 | f 207 595 408 1008 | f 120 408 316 1009 | f 409 10 410 1010 | f 410 401 604 1011 | f 409 305 607 1012 | f 415 919 595 1013 | f 207 415 595 1014 | f 605 919 606 1015 | f 306 411 116 1016 | f 800 605 606 1017 | f 802 307 53 1018 | f 204 304 412 1019 | f 55 309 311 1020 | f 55 412 309 1021 | f 54 413 608 1022 | f 839 608 205 1023 | f 839 54 608 1024 | f 805 175 405 1025 | f 200 413 54 1026 | f 921 804 407 1027 | f 316 862 56 1028 | f 11 52 921 1029 | f 52 804 921 1030 | f 210 202 415 1031 | f 311 808 610 1032 | f 416 415 202 1033 | f 922 614 206 1034 | f 312 922 209 1035 | f 614 421 866 1036 | f 121 206 614 1037 | f 625 314 610 1038 | f 610 314 311 1039 | f 610 808 313 1040 | f 625 610 313 1041 | f 612 317 626 1042 | f 613 626 315 1043 | f 920 175 418 1044 | f 122 419 203 1045 | f 618 616 419 1046 | f 423 807 617 1047 | f 807 420 609 1048 | f 421 312 209 1049 | f 423 620 424 1050 | f 423 621 58 1051 | f 60 127 123 1052 | f 321 868 56 1053 | f 56 622 321 1054 | f 217 37 840 1055 | f 864 614 866 1056 | f 37 866 840 1057 | f 623 37 628 1058 | f 624 615 214 1059 | f 429 14 623 1060 | f 626 317 426 1061 | f 624 427 426 1062 | f 422 125 627 1063 | f 214 428 636 1064 | f 217 215 37 1065 | f 629 215 324 1066 | f 324 63 629 1067 | f 429 216 213 1068 | f 429 623 629 1069 | f 64 632 869 1070 | f 432 319 219 1071 | f 319 432 633 1072 | f 633 432 632 1073 | f 15 60 424 1074 | f 424 870 320 1075 | f 15 320 434 1076 | f 930 433 927 1077 | f 319 633 322 1078 | f 442 322 633 1079 | f 435 436 873 1080 | f 435 62 924 1081 | f 428 323 876 1082 | f 876 323 875 1083 | f 324 925 221 1084 | f 325 636 643 1085 | f 222 63 324 1086 | f 63 439 216 1087 | f 637 439 222 1088 | f 440 218 325 1089 | f 16 126 645 1090 | f 631 640 443 1091 | f 38 179 2 1092 | f 2 642 38 1093 | f 66 643 876 1094 | f 325 643 810 1095 | f 440 810 655 1096 | f 639 647 17 1097 | f 926 647 645 1098 | f 647 926 17 1099 | f 872 443 871 1100 | f 872 444 443 1101 | f 177 444 872 1102 | f 881 117 649 1103 | f 178 131 67 1104 | f 437 649 929 1105 | f 812 928 437 1106 | f 651 65 635 1107 | f 635 873 651 1108 | f 874 178 67 1109 | f 445 130 653 1110 | f 653 457 445 1111 | f 130 445 131 1112 | f 649 117 929 1113 | f 2 179 874 1114 | f 133 327 326 1115 | f 460 875 654 1116 | f 133 450 327 1117 | f 810 66 655 1118 | f 811 656 646 1119 | f 129 642 70 1120 | f 70 450 658 1121 | f 129 70 658 1122 | f 18 646 656 1123 | f 132 447 449 1124 | f 454 441 452 1125 | f 448 39 657 1126 | f 657 39 449 1127 | f 659 877 328 1128 | f 329 658 664 1129 | f 646 18 452 1130 | f 668 661 180 1131 | f 181 662 455 1132 | f 662 459 456 1133 | f 457 662 456 1134 | f 662 181 663 1135 | f 815 929 117 1136 | f 459 182 326 1137 | f 182 458 134 1138 | f 226 229 182 1139 | f 230 654 333 1140 | f 664 878 73 1141 | f 73 136 664 1142 | f 665 332 880 1143 | f 20 461 332 1144 | f 134 667 135 1145 | f 667 134 666 1146 | f 226 182 135 1147 | f 817 471 4 1148 | f 227 230 333 1149 | f 229 73 878 1150 | f 229 817 73 1151 | f 934 71 230 1152 | f 664 841 329 1153 | f 841 664 136 1154 | f 842 464 816 1155 | f 467 816 465 1156 | f 669 225 74 1157 | f 660 879 336 1158 | f 880 180 669 1159 | f 463 334 75 1160 | f 334 76 476 1161 | f 465 843 467 1162 | f 843 339 467 1163 | f 818 339 843 1164 | f 670 137 75 1165 | f 335 819 337 1166 | f 469 231 77 1167 | f 996 20 77 1168 | f 241 673 117 1169 | f 881 241 117 1170 | f 999 931 671 1171 | f 932 671 931 1172 | f 470 232 936 1173 | f 471 472 4 1174 | f 228 470 472 1175 | f 672 227 473 1176 | f 934 672 475 1177 | f 19 817 4 1178 | f 19 4 674 1179 | f 234 674 4 1180 | f 338 71 934 1181 | f 935 474 484 1182 | f 138 672 342 1183 | f 234 939 79 1184 | f 674 79 236 1185 | f 818 475 344 1186 | f 183 476 675 1187 | f 844 339 818 1188 | f 477 844 687 1189 | f 80 670 235 1190 | f 80 235 21 1191 | f 844 477 478 1192 | f 676 933 478 1193 | f 479 231 480 1194 | f 480 933 937 1195 | f 677 480 937 1196 | f 479 996 231 1197 | f 681 881 1000 1198 | f 21 235 341 1199 | f 486 882 477 1200 | f 882 486 690 1201 | f 845 882 821 1202 | f 691 679 678 1203 | f 184 932 340 1204 | f 484 820 680 1205 | f 820 677 5 1206 | f 679 5 677 1207 | f 671 932 184 1208 | f 680 683 682 1209 | f 483 683 495 1210 | f 942 673 241 1211 | f 83 685 684 1212 | f 342 343 138 1213 | f 79 940 236 1214 | f 83 940 685 1215 | f 938 140 242 1216 | f 84 344 243 1217 | f 341 183 941 1218 | f 675 236 938 1219 | f 242 941 938 1220 | f 84 486 687 1221 | f 684 139 83 1222 | f 139 684 485 1223 | f 138 343 347 1224 | f 140 346 242 1225 | f 688 140 83 1226 | f 240 688 239 1227 | f 488 345 347 1228 | f 489 242 346 1229 | f 822 242 246 1230 | f 997 341 822 1231 | f 689 997 492 1232 | f 944 496 885 1233 | f 22 493 691 1234 | f 244 493 497 1235 | f 494 680 5 1236 | f 694 485 495 1237 | f 702 945 823 1238 | f 943 238 692 1239 | f 692 238 507 1240 | f 507 825 692 1241 | f 825 22 692 1242 | f 693 497 825 1243 | f 498 500 694 1244 | f 694 502 487 1245 | f 503 501 948 1246 | f 847 347 947 1247 | f 347 847 849 1248 | f 695 700 696 1249 | f 488 347 849 1250 | f 824 488 950 1251 | f 490 488 82 1252 | f 847 947 949 1253 | f 949 947 508 1254 | f 847 949 87 1255 | f 700 948 247 1256 | f 699 142 247 1257 | f 848 142 826 1258 | f 950 849 87 1259 | f 87 849 847 1260 | f 143 40 510 1261 | f 703 348 354 1262 | f 505 504 143 1263 | f 507 701 953 1264 | f 693 350 499 1265 | f 145 499 350 1266 | f 349 499 145 1267 | f 499 349 141 1268 | f 146 141 349 1269 | f 351 349 145 1270 | f 351 146 349 1271 | f 952 245 150 1272 | f 150 245 956 1273 | f 25 951 248 1274 | f 888 25 248 1275 | f 351 185 249 1276 | f 951 186 185 1277 | f 186 951 25 1278 | f 681 716 960 1279 | f 954 146 351 1280 | f 352 351 249 1281 | f 954 352 708 1282 | f 511 890 250 1283 | f 893 949 148 1284 | f 148 949 24 1285 | f 826 142 705 1286 | f 827 705 142 1287 | f 705 827 511 1288 | f 705 511 41 1289 | f 353 23 87 1290 | f 353 87 893 1291 | f 826 510 40 1292 | f 354 147 891 1293 | f 892 358 356 1294 | f 892 891 358 1295 | f 508 6 24 1296 | f 90 253 515 1297 | f 41 253 512 1298 | f 26 353 893 1299 | f 26 893 148 1300 | f 513 955 251 1301 | f 850 512 517 1302 | f 513 850 517 1303 | f 357 355 955 1304 | f 357 955 513 1305 | f 359 254 358 1306 | f 150 521 828 1307 | f 524 42 952 1308 | f 249 186 187 1309 | f 252 514 707 1310 | f 360 514 957 1311 | f 708 360 255 1312 | f 89 255 360 1313 | f 515 253 250 1314 | f 711 515 255 1315 | f 957 252 151 1316 | f 89 7 526 1317 | f 363 711 260 1318 | f 24 894 148 1319 | f 512 253 516 1320 | f 90 516 253 1321 | f 516 363 95 1322 | f 256 26 894 1323 | f 95 519 517 1324 | f 364 88 852 1325 | f 365 357 518 1326 | f 365 518 96 1327 | f 959 91 712 1328 | f 270 522 713 1329 | f 519 188 518 1330 | f 523 519 95 1331 | f 188 523 99 1332 | f 852 522 189 1333 | f 724 189 270 1334 | f 91 959 828 1335 | f 714 709 93 1336 | f 257 153 93 1337 | f 262 714 153 1338 | f 524 828 718 1339 | f 42 524 718 1340 | f 720 715 525 1341 | f 526 366 362 1342 | f 266 715 720 1343 | f 717 366 528 1344 | f 263 717 528 1345 | f 256 829 269 1346 | f 262 719 192 1347 | f 266 719 721 1348 | f 266 721 722 1349 | f 961 964 965 1350 | f 535 43 369 1351 | f 269 829 529 1352 | f 529 829 734 1353 | f 895 8 98 1354 | f 270 713 966 1355 | f 99 523 8 1356 | f 371 99 8 1357 | f 831 371 895 1358 | f 729 264 99 1359 | f 532 726 727 1360 | f 267 262 532 1361 | f 267 532 968 1362 | f 538 533 831 1363 | f 530 372 728 1364 | f 541 729 830 1365 | f 732 532 534 1366 | f 367 962 900 1367 | f 968 273 733 1368 | f 732 273 968 1369 | f 535 721 536 1370 | f 970 536 735 1371 | f 970 373 536 1372 | f 158 964 851 1373 | f 831 370 969 1374 | f 897 372 966 1375 | f 966 269 529 1376 | f 897 966 529 1377 | f 737 277 736 1378 | f 373 970 736 1379 | f 272 734 374 1380 | f 374 854 272 1381 | f 274 277 752 1382 | f 277 737 752 1383 | f 378 752 737 1384 | f 752 101 274 1385 | f 101 379 538 1386 | f 740 541 738 1387 | f 742 741 748 1388 | f 27 743 899 1389 | f 743 27 900 1390 | f 273 375 543 1391 | f 543 375 746 1392 | f 971 739 546 1393 | f 279 971 755 1394 | f 746 542 376 1395 | f 542 747 28 1396 | f 376 542 28 1397 | f 750 832 543 1398 | f 750 543 746 1399 | f 833 550 157 1400 | f 901 978 851 1401 | f 832 545 544 1402 | f 545 832 750 1403 | f 973 158 978 1404 | f 737 276 377 1405 | f 547 751 380 1406 | f 278 194 103 1407 | f 755 546 278 1408 | f 552 753 159 1409 | f 280 974 751 1410 | f 104 974 763 1411 | f 104 283 974 1412 | f 902 103 854 1413 | f 854 765 902 1414 | f 30 283 284 1415 | f 757 30 556 1416 | f 768 105 758 1417 | f 755 557 279 1418 | f 31 548 758 1419 | f 31 758 105 1420 | f 551 833 549 1421 | f 549 28 903 1422 | f 903 760 549 1423 | f 551 549 976 1424 | f 193 853 44 1425 | f 761 551 976 1426 | f 161 31 105 1427 | f 383 105 835 1428 | f 105 383 771 1429 | f 771 975 161 1430 | f 976 760 195 1431 | f 856 762 555 1432 | f 384 762 554 1433 | f 763 382 106 1434 | f 104 764 283 1435 | f 764 284 283 1436 | f 764 285 766 1437 | f 556 30 767 1438 | f 767 766 560 1439 | f 767 560 559 1440 | f 768 556 835 1441 | f 559 556 767 1442 | f 556 559 835 1443 | f 558 557 756 1444 | f 557 381 160 1445 | f 381 557 558 1446 | f 980 978 983 1447 | f 766 289 560 1448 | f 289 285 288 1449 | f 285 106 32 1450 | f 774 285 32 1451 | f 563 906 570 1452 | f 559 560 46 1453 | f 837 46 289 1454 | f 561 46 837 1455 | f 979 561 9 1456 | f 562 47 769 1457 | f 165 563 570 1458 | f 769 47 165 1459 | f 9 857 979 1460 | f 383 857 107 1461 | f 771 166 35 1462 | f 907 566 858 1463 | f 904 771 35 1464 | f 553 858 290 1465 | f 385 290 162 1466 | f 773 385 910 1467 | f 982 759 977 1468 | f 772 32 382 1469 | f 772 382 384 1470 | f 34 287 286 1471 | f 34 286 163 1472 | f 34 908 287 1473 | f 568 904 775 1474 | f 910 386 773 1475 | f 909 773 386 1476 | f 581 386 776 1477 | f 386 777 909 1478 | f 33 777 386 1479 | f 837 288 164 1480 | f 164 777 292 1481 | f 573 292 777 1482 | f 575 387 906 1483 | f 779 570 387 1484 | f 9 571 388 1485 | f 781 388 571 1486 | f 572 769 165 1487 | f 389 857 388 1488 | f 9 388 857 1489 | f 576 389 388 1490 | f 770 565 291 1491 | f 163 770 291 1492 | f 778 786 981 1493 | f 779 387 575 1494 | f 574 168 981 1495 | f 781 168 111 1496 | f 780 779 917 1497 | f 576 388 781 1498 | f 988 390 196 1499 | f 395 196 780 1500 | f 395 780 787 1501 | f 585 782 577 1502 | f 391 112 783 1503 | f 167 567 294 1504 | f 110 579 580 1505 | f 581 776 569 1506 | f 392 581 582 1507 | f 569 579 582 1508 | f 110 582 579 1509 | f 293 392 110 1510 | f 392 33 581 1511 | f 293 583 392 1512 | f 575 985 400 1513 | f 391 783 912 1514 | f 915 912 783 1515 | f 298 393 784 1516 | f 912 984 775 1517 | f 293 110 399 1518 | f 901 1000 199 1519 | f 999 982 584 1520 | f 982 977 984 1521 | f 114 786 583 1522 | f 785 293 991 1523 | f 991 589 785 1524 | f 983 990 985 1525 | f 197 394 574 1526 | f 860 575 400 1527 | f 917 860 794 1528 | f 168 169 111 1529 | f 986 394 49 1530 | f 780 296 787 1531 | f 917 295 296 1532 | f 170 111 169 1533 | f 987 170 989 1534 | f 48 297 988 1535 | f 109 297 788 1536 | f 171 170 169 1537 | f 986 171 169 1538 | f 49 394 299 1539 | f 300 295 914 1540 | f 295 794 914 1541 | f 397 170 171 1542 | f 397 115 174 1543 | f 302 396 989 1544 | f 404 302 397 1545 | f 791 587 789 1546 | f 597 792 587 1547 | f 915 783 398 1548 | f 588 792 597 1549 | f 803 859 588 1550 | f 596 984 912 1551 | f 591 198 993 1552 | f 113 793 197 1553 | f 793 916 173 1554 | f 49 299 173 1555 | f 992 796 916 1556 | f 593 916 796 1557 | f 796 992 591 1558 | f 403 401 410 1559 | f 402 410 10 1560 | f 605 799 594 1561 | f 595 594 914 1562 | f 174 404 397 1563 | f 301 799 605 1564 | f 800 301 605 1565 | f 303 302 404 1566 | f 116 201 404 1567 | f 36 597 802 1568 | f 802 801 119 1569 | f 588 36 918 1570 | f 590 118 918 1571 | f 598 599 590 1572 | f 918 53 598 1573 | f 53 918 802 1574 | f 599 795 590 1575 | f 600 413 200 1576 | f 798 797 601 1577 | f 603 797 600 1578 | f 407 603 602 1579 | f 603 600 602 1580 | f 603 407 804 1581 | f 172 406 862 1582 | f 52 604 601 1583 | f 601 804 52 1584 | f 604 305 410 1585 | f 919 415 606 1586 | f 607 411 306 1587 | f 606 119 800 1588 | f 611 606 416 1589 | f 50 307 119 1590 | f 51 307 50 1591 | f 307 205 838 1592 | f 204 805 308 1593 | f 613 51 50 1594 | f 51 613 315 1595 | f 51 315 203 1596 | f 412 208 204 1597 | f 204 418 175 1598 | f 602 600 200 1599 | f 310 200 861 1600 | f 11 206 863 1601 | f 206 121 863 1602 | f 414 121 808 1603 | f 612 611 416 1604 | f 609 209 922 1605 | f 421 614 312 1606 | f 316 868 806 1607 | f 121 614 864 1608 | f 121 864 313 1609 | f 615 202 210 1610 | f 311 314 55 1611 | f 425 625 313 1612 | f 315 122 203 1613 | f 626 12 315 1614 | f 315 12 122 1615 | f 12 125 122 1616 | f 419 54 839 1617 | f 839 203 419 1618 | f 419 122 923 1619 | f 807 861 617 1620 | f 616 861 54 1621 | f 617 616 618 1622 | f 618 619 617 1623 | f 423 58 807 1624 | f 420 807 58 1625 | f 58 421 420 1626 | f 211 418 208 1627 | f 923 422 212 1628 | f 423 619 620 1629 | f 619 423 617 1630 | f 212 619 618 1631 | f 619 212 620 1632 | f 212 219 620 1633 | f 584 433 931 1634 | f 58 123 421 1635 | f 621 423 424 1636 | f 127 867 123 1637 | f 867 840 866 1638 | f 127 840 867 1639 | f 13 615 806 1640 | f 321 438 868 1641 | f 866 37 864 1642 | f 425 37 623 1643 | f 624 426 57 1644 | f 625 14 314 1645 | f 59 426 427 1646 | f 417 213 124 1647 | f 213 417 14 1648 | f 59 12 626 1649 | f 12 59 627 1650 | f 318 627 59 1651 | f 12 627 125 1652 | f 217 128 215 1653 | f 430 630 61 1654 | f 429 629 63 1655 | f 427 430 176 1656 | f 61 638 430 1657 | f 176 430 638 1658 | f 318 431 627 1659 | f 176 318 59 1660 | f 631 176 218 1661 | f 64 431 631 1662 | f 212 869 219 1663 | f 431 869 422 1664 | f 431 422 627 1665 | f 431 64 869 1666 | f 869 632 432 1667 | f 920 865 927 1668 | f 320 870 319 1669 | f 15 127 60 1670 | f 424 320 15 1671 | f 15 434 924 1672 | f 924 434 435 1673 | f 928 321 437 1674 | f 127 924 128 1675 | f 809 632 64 1676 | f 632 809 442 1677 | f 442 809 443 1678 | f 442 443 444 1679 | f 223 634 220 1680 | f 436 223 873 1681 | f 128 924 62 1682 | f 873 635 435 1683 | f 928 438 321 1684 | f 925 65 221 1685 | f 63 222 439 1686 | f 325 638 61 1687 | f 644 218 440 1688 | f 647 639 16 1689 | f 642 637 221 1690 | f 65 38 221 1691 | f 642 221 38 1692 | f 643 66 810 1693 | f 810 440 325 1694 | f 644 871 640 1695 | f 644 132 871 1696 | f 441 1 639 1697 | f 927 813 930 1698 | f 441 927 1 1699 | f 220 648 130 1700 | f 648 448 130 1701 | f 873 650 178 1702 | f 220 873 223 1703 | f 650 131 178 1704 | f 651 178 874 1705 | f 812 875 323 1706 | f 454 813 441 1707 | f 653 652 457 1708 | f 814 67 456 1709 | f 456 459 814 1710 | f 437 929 812 1711 | f 459 326 814 1712 | f 874 327 2 1713 | f 66 877 655 1714 | f 877 66 460 1715 | f 129 656 811 1716 | f 658 656 129 1717 | f 655 446 440 1718 | f 446 655 68 1719 | f 447 446 68 1720 | f 447 69 453 1721 | f 452 441 17 1722 | f 449 39 872 1723 | f 872 132 449 1724 | f 328 877 460 1725 | f 230 328 654 1726 | f 466 658 329 1727 | f 68 224 451 1728 | f 659 464 224 1729 | f 224 464 451 1730 | f 658 466 18 1731 | f 451 69 447 1732 | f 464 842 72 1733 | f 657 661 652 1734 | f 657 330 661 1735 | f 69 3 453 1736 | f 3 225 180 1737 | f 454 331 813 1738 | f 457 455 662 1739 | f 661 668 181 1740 | f 662 663 458 1741 | f 663 134 458 1742 | f 929 815 333 1743 | f 458 182 459 1744 | f 133 229 878 1745 | f 878 664 450 1746 | f 181 461 663 1747 | f 181 668 332 1748 | f 665 20 332 1749 | f 667 228 471 1750 | f 667 471 226 1751 | f 815 227 333 1752 | f 659 71 465 1753 | f 841 137 466 1754 | f 136 463 841 1755 | f 841 463 75 1756 | f 465 464 659 1757 | f 465 71 843 1758 | f 3 72 225 1759 | f 669 469 880 1760 | f 880 332 180 1761 | f 136 19 463 1762 | f 337 467 335 1763 | f 467 339 335 1764 | f 339 844 335 1765 | f 879 137 670 1766 | f 670 336 879 1767 | f 476 670 75 1768 | f 336 468 660 1769 | f 233 468 336 1770 | f 819 469 669 1771 | f 819 669 74 1772 | f 819 933 469 1773 | f 340 331 468 1774 | f 77 20 665 1775 | f 77 665 880 1776 | f 673 473 815 1777 | f 228 472 471 1778 | f 472 936 81 1779 | f 815 473 227 1780 | f 234 4 472 1781 | f 936 935 482 1782 | f 342 673 942 1783 | f 81 482 78 1784 | f 81 78 939 1785 | f 473 342 672 1786 | f 674 234 79 1787 | f 476 76 675 1788 | f 687 818 344 1789 | f 844 818 687 1790 | f 80 336 670 1791 | f 819 478 933 1792 | f 478 819 335 1793 | f 335 844 478 1794 | f 676 478 882 1795 | f 80 233 336 1796 | f 231 933 480 1797 | f 933 676 937 1798 | f 479 474 996 1799 | f 479 481 484 1800 | f 341 883 21 1801 | f 183 341 235 1802 | f 676 882 845 1803 | f 845 937 676 1804 | f 937 845 679 1805 | f 679 845 678 1806 | f 481 820 484 1807 | f 999 671 889 1808 | f 935 682 482 1809 | f 682 483 482 1810 | f 935 484 682 1811 | f 682 484 680 1812 | f 78 685 939 1813 | f 78 483 684 1814 | f 685 940 79 1815 | f 486 477 687 1816 | f 241 946 942 1817 | f 485 694 487 1818 | f 139 487 239 1819 | f 139 239 688 1820 | f 688 346 140 1821 | f 240 346 688 1822 | f 489 246 242 1823 | f 490 82 491 1824 | f 823 491 82 1825 | f 884 678 821 1826 | f 846 884 690 1827 | f 945 238 884 1828 | f 689 496 998 1829 | f 689 998 883 1830 | f 884 238 943 1831 | f 5 493 494 1832 | f 22 497 493 1833 | f 946 241 681 1834 | f 889 671 184 1835 | f 495 683 494 1836 | f 945 85 238 1837 | f 702 85 945 1838 | f 492 506 689 1839 | f 506 496 689 1840 | f 952 184 885 1841 | f 244 497 498 1842 | f 502 500 501 1843 | f 500 141 501 1844 | f 946 886 942 1845 | f 503 487 502 1846 | f 501 503 502 1847 | f 697 489 696 1848 | f 702 82 348 1849 | f 501 698 948 1850 | f 698 247 948 1851 | f 698 141 704 1852 | f 247 698 699 1853 | f 704 699 698 1854 | f 142 700 247 1855 | f 824 950 348 1856 | f 348 703 702 1857 | f 23 348 950 1858 | f 85 702 701 1859 | f 703 701 702 1860 | f 701 703 892 1861 | f 356 701 892 1862 | f 505 887 506 1863 | f 701 356 953 1864 | f 953 951 86 1865 | f 350 185 145 1866 | f 716 681 1000 1867 | f 146 704 141 1868 | f 946 710 886 1869 | f 681 710 946 1870 | f 710 508 886 1871 | f 248 356 358 1872 | f 951 185 86 1873 | f 186 25 514 1874 | f 827 699 890 1875 | f 827 890 511 1876 | f 508 24 949 1877 | f 826 705 251 1878 | f 251 510 826 1879 | f 354 891 703 1880 | f 510 955 144 1881 | f 955 355 144 1882 | f 891 892 703 1883 | f 511 253 41 1884 | f 41 512 850 1885 | f 251 850 513 1886 | f 147 706 149 1887 | f 353 706 92 1888 | f 353 88 706 1889 | f 355 357 956 1890 | f 518 357 513 1891 | f 357 365 91 1892 | f 248 358 254 1893 | f 888 707 514 1894 | f 524 952 150 1895 | f 957 514 252 1896 | f 708 255 250 1897 | f 187 352 249 1898 | f 187 360 708 1899 | f 360 957 7 1900 | f 361 252 707 1901 | f 152 958 359 1902 | f 258 93 361 1903 | f 361 93 709 1904 | f 151 7 957 1905 | f 151 252 709 1906 | f 265 151 94 1907 | f 89 526 362 1908 | f 711 89 260 1909 | f 960 964 710 1910 | f 90 711 363 1911 | f 6 961 24 1912 | f 24 961 527 1913 | f 26 256 522 1914 | f 517 518 513 1915 | f 519 518 517 1916 | f 149 364 520 1917 | f 359 149 152 1918 | f 261 190 520 1919 | f 95 98 8 1920 | f 191 717 98 1921 | f 713 522 256 1922 | f 523 95 8 1923 | f 189 190 261 1924 | f 189 896 190 1925 | f 96 959 712 1926 | f 264 959 96 1927 | f 959 967 828 1928 | f 258 257 93 1929 | f 42 367 898 1930 | f 94 715 265 1931 | f 94 714 525 1932 | f 714 262 525 1933 | f 526 368 366 1934 | f 526 265 715 1935 | f 963 528 368 1936 | f 964 961 710 1937 | f 259 717 191 1938 | f 362 366 259 1939 | f 719 720 192 1940 | f 719 266 720 1941 | f 369 963 722 1942 | f 43 263 369 1943 | f 535 268 43 1944 | f 263 268 370 1945 | f 370 895 98 1946 | f 270 966 372 1947 | f 895 371 8 1948 | f 533 830 371 1949 | f 724 723 189 1950 | f 270 372 724 1951 | f 530 724 372 1952 | f 729 725 264 1953 | f 896 531 97 1954 | f 896 723 531 1955 | f 154 723 530 1956 | f 271 531 154 1957 | f 967 962 828 1958 | f 153 726 262 1959 | f 271 726 97 1960 | f 262 726 532 1961 | f 538 738 830 1962 | f 897 540 728 1963 | f 730 271 154 1964 | f 730 534 271 1965 | f 731 741 730 1966 | f 730 741 534 1967 | f 532 732 968 1968 | f 733 102 721 1969 | f 536 373 535 1970 | f 721 535 722 1971 | f 102 536 721 1972 | f 964 158 965 1973 | f 535 373 268 1974 | f 965 734 829 1975 | f 374 734 965 1976 | f 272 529 734 1977 | f 735 537 970 1978 | f 544 970 537 1979 | f 832 544 537 1980 | f 851 978 158 1981 | f 276 736 544 1982 | f 276 737 736 1983 | f 529 272 100 1984 | f 897 100 540 1985 | f 272 194 100 1986 | f 538 379 738 1987 | f 274 101 538 1988 | f 738 379 740 1989 | f 739 731 728 1990 | f 744 534 741 1991 | f 741 742 745 1992 | f 742 747 745 1993 | f 273 732 375 1994 | f 732 744 375 1995 | f 375 275 746 1996 | f 193 898 367 1997 | f 273 543 102 1998 | f 543 832 537 1999 | f 739 971 748 2000 | f 546 739 540 2001 | f 899 29 27 2002 | f 379 548 740 2003 | f 742 748 747 2004 | f 748 749 747 2005 | f 376 833 157 2006 | f 157 550 552 2007 | f 159 545 750 2008 | f 552 159 750 2009 | f 377 545 280 2010 | f 159 280 545 2011 | f 737 751 378 2012 | f 751 974 380 2013 | f 855 752 547 2014 | f 194 278 546 2015 | f 753 754 159 2016 | f 974 280 754 2017 | f 763 974 754 2018 | f 278 281 755 2019 | f 556 758 757 2020 | f 556 768 758 2021 | f 31 161 29 2022 | f 749 279 972 2023 | f 972 160 282 2024 | f 29 161 156 2025 | f 551 856 552 2026 | f 759 982 999 2027 | f 903 282 760 2028 | f 45 282 160 2029 | f 907 45 566 2030 | f 553 905 907 2031 | f 553 554 195 2032 | f 853 975 568 2033 | f 762 856 554 2034 | f 978 980 973 2035 | f 763 285 104 2036 | f 106 285 763 2037 | f 563 902 765 2038 | f 284 766 767 2039 | f 902 563 47 2040 | f 558 756 562 2041 | f 980 906 765 2042 | f 46 561 559 2043 | f 561 979 559 2044 | f 835 857 383 2045 | f 565 564 558 2046 | f 562 769 565 2047 | f 564 566 381 2048 | f 770 286 564 2049 | f 564 286 566 2050 | f 858 566 287 2051 | f 975 771 904 2052 | f 858 553 907 2053 | f 908 858 287 2054 | f 772 385 773 2055 | f 772 909 32 2056 | f 773 909 772 2057 | f 909 774 32 2058 | f 391 35 112 2059 | f 908 836 162 2060 | f 568 775 977 2061 | f 910 385 162 2062 | f 33 573 777 2063 | f 575 980 983 2064 | f 777 164 288 2065 | f 778 108 292 2066 | f 980 575 906 2067 | f 571 837 108 2068 | f 857 389 107 2069 | f 572 291 769 2070 | f 572 196 291 2071 | f 291 390 163 2072 | f 389 782 166 2073 | f 166 782 35 2074 | f 981 108 778 2075 | f 576 577 389 2076 | f 196 390 291 2077 | f 782 585 112 2078 | f 34 390 294 2079 | f 567 167 579 2080 | f 294 578 167 2081 | f 581 569 582 2082 | f 110 392 582 2083 | f 33 392 573 2084 | f 573 583 786 2085 | f 586 783 112 2086 | f 393 110 580 2087 | f 580 578 913 2088 | f 393 298 399 2089 | f 991 293 399 2090 | f 785 114 583 2091 | f 114 785 113 2092 | f 589 113 785 2093 | f 113 197 114 2094 | f 169 168 986 2095 | f 168 574 394 2096 | f 787 790 48 2097 | f 586 585 396 2098 | f 987 989 585 2099 | f 578 109 913 2100 | f 297 109 988 2101 | f 171 49 402 2102 | f 402 115 171 2103 | f 300 790 787 2104 | f 300 594 799 2105 | f 115 397 171 2106 | f 791 789 48 2107 | f 48 790 791 2108 | f 301 790 799 2109 | f 396 398 586 2110 | f 397 302 989 2111 | f 302 303 398 2112 | f 587 792 788 2113 | f 995 915 398 2114 | f 859 298 784 2115 | f 792 859 784 2116 | f 792 784 788 2117 | f 792 588 859 2118 | f 589 991 992 2119 | f 992 916 793 2120 | f 172 400 985 2121 | f 400 172 860 2122 | f 993 795 592 2123 | f 592 796 591 2124 | f 797 798 796 2125 | f 401 173 593 2126 | f 401 403 173 2127 | f 402 10 115 2128 | f 306 404 174 2129 | f 800 119 994 2130 | f 201 303 404 2131 | f 994 801 791 2132 | f 994 119 801 2133 | f 597 801 802 2134 | f 398 303 995 2135 | f 995 304 308 2136 | f 995 308 596 2137 | f 838 599 598 2138 | f 413 599 838 2139 | f 405 596 805 2140 | f 601 603 804 2141 | f 862 406 56 2142 | f 798 601 401 2143 | f 604 401 601 2144 | f 316 408 862 2145 | f 207 408 120 2146 | f 305 409 410 2147 | f 11 305 604 2148 | f 201 411 309 2149 | f 802 119 307 2150 | f 412 201 309 2151 | f 805 204 175 2152 | f 602 310 407 2153 | f 807 609 310 2154 | f 207 120 210 2155 | f 414 305 11 2156 | f 863 414 11 2157 | f 415 207 210 2158 | f 808 311 607 2159 | f 613 611 612 2160 | f 317 416 202 2161 | f 922 312 614 2162 | f 120 806 210 2163 | f 615 210 806 2164 | f 313 808 121 2165 | f 313 864 425 2166 | f 615 57 202 2167 | f 426 317 57 2168 | f 417 55 314 2169 | f 54 419 616 2170 | f 617 861 616 2171 | f 649 199 1000 2172 | f 865 920 418 2173 | f 211 865 418 2174 | f 618 923 212 2175 | f 621 123 58 2176 | f 123 621 60 2177 | f 421 123 867 2178 | f 127 217 840 2179 | f 438 13 806 2180 | f 438 806 868 2181 | f 864 37 425 2182 | f 624 57 615 2183 | f 214 615 13 2184 | f 425 14 625 2185 | f 430 427 624 2186 | f 124 213 126 2187 | f 214 13 428 2188 | f 428 13 438 2189 | f 628 629 623 2190 | f 37 215 628 2191 | f 430 624 630 2192 | f 59 427 176 2193 | f 212 422 869 2194 | f 433 920 927 2195 | f 319 870 219 2196 | f 434 320 319 2197 | f 437 321 622 2198 | f 633 632 442 2199 | f 223 436 319 2200 | f 634 322 442 2201 | f 1000 881 649 2202 | f 436 435 434 2203 | f 622 649 437 2204 | f 323 428 438 2205 | f 876 636 428 2206 | f 324 215 925 2207 | f 128 925 215 2208 | f 221 222 324 2209 | f 325 61 636 2210 | f 216 645 126 2211 | f 218 644 640 2212 | f 809 631 443 2213 | f 639 1 641 2214 | f 221 637 222 2215 | f 38 65 179 2216 | f 811 926 637 2217 | f 129 637 642 2218 | f 646 17 926 2219 | f 443 640 871 2220 | f 639 17 441 2221 | f 39 648 177 2222 | f 650 873 220 2223 | f 130 650 220 2224 | f 650 130 131 2225 | f 651 179 65 2226 | f 178 651 873 2227 | f 874 179 651 2228 | f 812 323 928 2229 | f 657 653 448 2230 | f 657 652 653 2231 | f 456 131 445 2232 | f 457 456 445 2233 | f 814 326 874 2234 | f 326 327 874 2235 | f 460 876 875 2236 | f 70 642 2 2237 | f 450 2 327 2238 | f 70 2 450 2239 | f 66 876 460 2240 | f 447 453 449 2241 | f 328 460 654 2242 | f 71 659 328 2243 | f 664 658 450 2244 | f 224 877 659 2245 | f 72 69 451 2246 | f 660 454 452 2247 | f 3 330 453 2248 | f 932 930 331 2249 | f 181 455 661 2250 | f 932 931 930 2251 | f 326 182 133 2252 | f 135 182 134 2253 | f 878 450 133 2254 | f 668 180 332 2255 | f 663 666 134 2256 | f 666 663 461 2257 | f 462 666 461 2258 | f 817 229 226 2259 | f 817 136 73 2260 | f 136 817 19 2261 | f 71 328 230 2262 | f 75 137 841 2263 | f 465 816 464 2264 | f 18 466 137 2265 | f 337 842 816 2266 | f 842 74 225 2267 | f 225 669 180 2268 | f 454 468 331 2269 | f 76 334 19 2270 | f 816 467 337 2271 | f 77 880 469 2272 | f 231 469 933 2273 | f 996 77 231 2274 | f 20 996 232 2275 | f 996 474 232 2276 | f 232 462 20 2277 | f 815 117 673 2278 | f 234 472 81 2279 | f 230 227 934 2280 | f 674 76 19 2281 | f 843 71 338 2282 | f 475 338 934 2283 | f 936 232 474 2284 | f 474 935 936 2285 | f 81 939 234 2286 | f 138 686 672 2287 | f 475 672 686 2288 | f 675 76 236 2289 | f 670 476 235 2290 | f 468 233 340 2291 | f 233 80 998 2292 | f 474 479 484 2293 | f 821 678 845 2294 | f 340 233 998 2295 | f 340 998 944 2296 | f 5 679 691 2297 | f 881 681 241 2298 | f 684 685 78 2299 | f 345 686 138 2300 | f 940 938 236 2301 | f 685 79 939 2302 | f 140 938 83 2303 | f 345 344 686 2304 | f 941 675 938 2305 | f 341 941 822 2306 | f 237 486 84 2307 | f 243 345 488 2308 | f 488 490 243 2309 | f 941 242 822 2310 | f 237 491 846 2311 | f 997 883 341 2312 | f 821 690 884 2313 | f 944 998 496 2314 | f 943 678 884 2315 | f 184 944 885 2316 | f 5 691 493 2317 | f 22 691 943 2318 | f 244 494 493 2319 | f 483 495 485 2320 | f 680 494 683 2321 | f 245 885 496 2322 | f 825 497 22 2323 | f 497 693 498 2324 | f 502 694 500 2325 | f 500 498 499 2326 | f 487 503 239 2327 | f 239 503 948 2328 | f 947 347 343 2329 | f 240 695 346 2330 | f 696 346 695 2331 | f 695 240 239 2332 | f 239 948 695 2333 | f 700 695 948 2334 | f 696 489 346 2335 | f 348 82 824 2336 | f 492 997 246 2337 | f 505 246 504 2338 | f 143 697 40 2339 | f 696 40 697 2340 | f 40 848 826 2341 | f 354 348 23 2342 | f 350 825 507 2343 | f 350 507 86 2344 | f 507 953 86 2345 | f 956 245 887 2346 | f 248 951 953 2347 | f 248 953 356 2348 | f 186 249 185 2349 | f 710 681 960 2350 | f 954 704 146 2351 | f 6 508 710 2352 | f 890 699 704 2353 | f 890 954 250 2354 | f 893 87 949 2355 | f 699 827 142 2356 | f 92 23 353 2357 | f 251 705 41 2358 | f 955 510 251 2359 | f 706 354 92 2360 | f 355 887 144 2361 | f 956 887 355 2362 | f 850 251 41 2363 | f 147 149 359 2364 | f 524 150 828 2365 | f 707 888 254 2366 | f 954 708 250 2367 | f 187 708 352 2368 | f 250 253 511 2369 | f 90 515 711 2370 | f 258 958 152 2371 | f 361 958 258 2372 | f 361 709 252 2373 | f 94 151 709 2374 | f 265 7 151 2375 | f 89 711 255 2376 | f 7 89 360 2377 | f 260 89 362 2378 | f 260 362 259 2379 | f 259 191 260 2380 | f 363 260 191 2381 | f 26 148 894 2382 | f 894 24 527 2383 | f 363 516 90 2384 | f 95 363 191 2385 | f 516 517 512 2386 | f 852 261 364 2387 | f 712 365 96 2388 | f 521 91 828 2389 | f 98 95 191 2390 | f 713 256 269 2391 | f 523 188 519 2392 | f 261 852 189 2393 | f 270 189 522 2394 | f 99 96 188 2395 | f 257 190 896 2396 | f 153 714 93 2397 | f 97 153 257 2398 | f 525 715 94 2399 | f 709 714 94 2400 | f 851 960 716 2401 | f 368 715 266 2402 | f 366 368 528 2403 | f 98 717 263 2404 | f 262 267 719 2405 | f 963 369 528 2406 | f 965 527 961 2407 | f 369 263 528 2408 | f 829 527 965 2409 | f 831 895 370 2410 | f 269 966 713 2411 | f 99 264 96 2412 | f 830 729 99 2413 | f 718 828 962 2414 | f 271 727 726 2415 | f 831 533 371 2416 | f 731 154 530 2417 | f 541 830 738 2418 | f 541 899 729 2419 | f 900 962 743 2420 | f 727 271 534 2421 | f 733 721 267 2422 | f 889 898 759 2423 | f 735 536 102 2424 | f 274 831 969 2425 | f 268 969 370 2426 | f 831 274 538 2427 | f 736 277 155 2428 | f 373 736 155 2429 | f 748 731 739 2430 | f 899 740 548 2431 | f 741 745 744 2432 | f 744 275 375 2433 | f 543 537 102 2434 | f 749 748 971 2435 | f 279 749 971 2436 | f 899 548 29 2437 | f 972 28 747 2438 | f 193 900 853 2439 | f 746 275 542 2440 | f 745 747 542 2441 | f 898 193 759 2442 | f 376 157 746 2443 | f 157 552 750 2444 | f 851 716 901 2445 | f 751 377 280 2446 | f 103 194 272 2447 | f 539 101 752 2448 | f 855 539 752 2449 | f 547 752 378 2450 | f 539 855 757 2451 | f 834 539 757 2452 | f 834 548 379 2453 | f 539 834 379 2454 | f 555 763 753 2455 | f 854 973 765 2456 | f 380 855 547 2457 | f 30 855 380 2458 | f 30 380 283 2459 | f 757 855 30 2460 | f 278 103 281 2461 | f 281 103 902 2462 | f 756 755 281 2463 | f 29 548 31 2464 | f 903 972 282 2465 | f 975 853 156 2466 | f 551 552 550 2467 | f 550 833 551 2468 | f 753 552 555 2469 | f 835 105 768 2470 | f 381 45 160 2471 | f 905 195 760 2472 | f 553 195 905 2473 | f 44 853 568 2474 | f 554 856 761 2475 | f 195 554 761 2476 | f 555 762 382 2477 | f 766 284 764 2478 | f 563 765 906 2479 | f 767 30 284 2480 | f 562 281 47 2481 | f 756 281 562 2482 | f 281 902 47 2483 | f 289 766 285 2484 | f 46 560 289 2485 | f 563 165 47 2486 | f 857 835 559 2487 | f 770 564 565 2488 | f 166 383 107 2489 | f 554 553 290 2490 | f 858 908 162 2491 | f 858 162 290 2492 | f 391 904 35 2493 | f 910 776 386 2494 | f 910 162 836 2495 | f 909 777 774 2496 | f 386 581 33 2497 | f 108 837 164 2498 | f 292 108 164 2499 | f 570 906 387 2500 | f 561 571 9 2501 | f 837 571 561 2502 | f 163 286 770 2503 | f 389 166 107 2504 | f 778 292 573 2505 | f 786 574 981 2506 | f 911 571 981 2507 | f 571 911 781 2508 | f 108 981 571 2509 | f 911 981 168 2510 | f 168 781 911 2511 | f 196 572 780 2512 | f 165 779 780 2513 | f 781 111 576 2514 | f 904 391 775 2515 | f 578 580 167 2516 | f 167 580 579 2517 | f 984 977 775 2518 | f 579 569 836 2519 | f 573 392 583 2520 | f 912 775 391 2521 | f 398 783 586 2522 | f 784 393 580 2523 | f 293 785 583 2524 | f 394 197 299 2525 | f 917 779 860 2526 | f 986 168 394 2527 | f 111 987 585 2528 | f 170 987 111 2529 | f 988 395 48 2530 | f 586 112 585 2531 | f 109 788 913 2532 | f 171 986 49 2533 | f 403 402 49 2534 | f 914 594 300 2535 | f 799 790 300 2536 | f 301 791 790 2537 | f 788 297 587 2538 | f 298 859 803 2539 | f 912 915 596 2540 | f 198 991 399 2541 | f 198 399 298 2542 | f 803 198 298 2543 | f 992 991 198 2544 | f 984 584 982 2545 | f 985 990 172 2546 | f 406 172 990 2547 | f 299 197 793 2548 | f 403 49 173 2549 | f 794 295 917 2550 | f 405 984 596 2551 | f 795 993 118 2552 | f 590 795 118 2553 | f 796 592 797 2554 | f 401 593 798 2555 | f 408 794 172 2556 | f 408 172 862 2557 | f 794 408 914 2558 | f 116 404 306 2559 | f 596 915 995 2560 | f 803 588 118 2561 | f 118 588 918 2562 | f 795 600 797 2563 | f 601 797 603 2564 | f 607 305 414 2565 | f 409 607 10 2566 | f 306 10 607 2567 | f 50 119 611 2568 | f 119 606 611 2569 | f 411 201 116 2570 | f 838 53 307 2571 | f 205 307 51 2572 | f 201 412 304 2573 | f 304 204 308 2574 | f 311 309 411 2575 | f 611 613 50 2576 | f 839 51 203 2577 | f 838 608 413 2578 | f 205 608 838 2579 | f 51 839 205 2580 | f 175 920 405 2581 | f 54 861 200 2582 | f 861 807 310 2583 | f 931 999 584 2584 | f 602 200 310 2585 | f 609 407 310 2586 | f 407 609 921 2587 | f 199 56 406 2588 | f 609 922 921 2589 | f 11 921 206 2590 | f 921 922 206 2591 | f 120 316 806 2592 | f 863 121 414 2593 | f 607 311 411 2594 | f 414 808 607 2595 | f 415 416 606 2596 | f 416 317 612 2597 | f 612 626 613 2598 | f 57 317 202 2599 | f 412 55 208 2600 | f 417 208 55 2601 | f 208 418 204 2602 | f 923 122 125 2603 | f 419 923 618 2604 | f 920 433 405 2605 | f 649 56 199 2606 | f 622 56 649 2607 | f 405 433 584 2608 | f 209 609 420 2609 | f 209 420 421 2610 | f 316 56 868 2611 | f 125 422 923 2612 | f 424 620 870 2613 | f 621 424 60 2614 | f 421 867 866 2615 | f 425 623 14 2616 | f 426 59 626 2617 | f 417 211 208 2618 | f 124 211 417 2619 | f 314 14 417 2620 | f 628 215 629 2621 | f 214 630 624 2622 | f 630 214 61 2623 | f 14 429 213 2624 | f 429 63 216 2625 | f 218 176 638 2626 | f 213 216 126 2627 | f 124 126 16 2628 | f 318 176 631 2629 | f 318 631 431 2630 | f 641 865 211 2631 | f 211 124 641 2632 | f 124 16 641 2633 | f 865 641 1 2634 | f 869 432 219 2635 | f 620 219 870 2636 | f 931 433 930 2637 | f 127 15 924 2638 | f 217 127 128 2639 | f 64 631 809 2640 | f 865 1 927 2641 | f 223 319 322 2642 | f 223 322 634 2643 | f 319 436 434 2644 | f 925 128 62 2645 | f 925 62 635 2646 | f 435 635 62 2647 | f 438 928 323 2648 | f 635 65 925 2649 | f 636 61 214 2650 | f 637 926 439 2651 | f 638 325 218 2652 | f 216 439 645 2653 | f 926 645 439 2654 | f 645 647 16 2655 | f 218 640 631 2656 | f 641 16 639 2657 | f 636 876 643 2658 | f 811 637 129 2659 | f 811 646 926 2660 | f 132 644 440 2661 | f 132 440 446 2662 | f 871 132 872 2663 | f 634 442 177 2664 | f 442 444 177 2665 | f 177 872 39 2666 | f 927 441 813 2667 | f 634 648 220 2668 | f 177 648 634 2669 | f 648 39 448 2670 | f 448 653 130 2671 | f 67 131 456 2672 | f 874 67 814 2673 | f 875 812 654 2674 | f 812 333 654 2675 | f 655 877 224 2676 | f 655 224 68 2677 | f 17 646 452 2678 | f 658 18 656 2679 | f 132 446 447 2680 | f 330 449 453 2681 | f 449 330 657 2682 | f 68 451 447 2683 | f 451 464 72 2684 | f 3 69 72 2685 | f 452 18 660 2686 | f 18 879 660 2687 | f 180 330 3 2688 | f 330 180 661 2689 | f 813 331 930 2690 | f 457 652 455 2691 | f 661 455 652 2692 | f 459 662 458 2693 | f 929 333 812 2694 | f 182 229 133 2695 | f 181 332 461 2696 | f 462 461 20 2697 | f 228 667 666 2698 | f 135 667 226 2699 | f 471 817 226 2700 | f 329 841 466 2701 | f 137 879 18 2702 | f 72 842 225 2703 | f 74 842 337 2704 | f 454 660 468 2705 | f 334 463 19 2706 | f 334 476 75 2707 | f 74 337 819 2708 | f 666 470 228 2709 | f 470 666 462 2710 | f 470 462 232 2711 | f 673 342 473 2712 | f 470 936 472 2713 | f 934 227 672 2714 | f 843 338 818 2715 | f 81 936 482 2716 | f 674 236 76 2717 | f 475 818 338 2718 | f 475 686 344 2719 | f 476 183 235 2720 | f 882 478 477 2721 | f 932 331 340 2722 | f 481 479 480 2723 | f 480 677 481 2724 | f 481 677 820 2725 | f 882 690 821 2726 | f 21 998 80 2727 | f 21 883 998 2728 | f 937 679 677 2729 | f 680 820 5 2730 | f 483 682 683 2731 | f 942 343 342 2732 | f 78 482 483 2733 | f 485 684 483 2734 | f 83 938 940 2735 | f 344 345 243 2736 | f 675 941 183 2737 | f 344 84 687 2738 | f 690 486 237 2739 | f 942 886 343 2740 | f 485 487 139 2741 | f 347 345 138 2742 | f 688 83 139 2743 | f 690 237 846 2744 | f 490 237 84 2745 | f 84 243 490 2746 | f 237 490 491 2747 | f 823 846 491 2748 | f 883 997 689 2749 | f 246 997 822 2750 | f 823 945 846 2751 | f 945 884 846 2752 | f 678 943 691 2753 | f 184 340 944 2754 | f 494 244 495 2755 | f 244 694 495 2756 | f 492 505 506 2757 | f 496 506 245 2758 | f 943 692 22 2759 | f 507 85 701 2760 | f 238 85 507 2761 | f 693 825 350 2762 | f 499 498 693 2763 | f 244 498 694 2764 | f 499 141 500 2765 | f 343 886 947 2766 | f 950 488 849 2767 | f 489 504 246 2768 | f 504 489 697 2769 | f 82 488 824 2770 | f 82 702 823 2771 | f 492 246 505 2772 | f 698 501 141 2773 | f 886 508 947 2774 | f 696 700 848 2775 | f 700 142 848 2776 | f 950 87 23 2777 | f 40 696 848 2778 | f 505 144 887 2779 | f 697 143 504 2780 | f 505 143 144 2781 | f 506 887 245 2782 | f 952 885 245 2783 | f 185 350 86 2784 | f 889 184 509 2785 | f 184 952 509 2786 | f 952 42 509 2787 | f 351 145 185 2788 | f 352 954 351 2789 | f 704 954 890 2790 | f 354 23 92 2791 | f 354 706 147 2792 | f 143 510 144 2793 | f 891 147 358 2794 | f 26 88 353 2795 | f 706 88 364 2796 | f 364 149 706 2797 | f 956 357 91 2798 | f 358 147 359 2799 | f 521 150 956 2800 | f 956 91 521 2801 | f 248 254 888 2802 | f 958 254 359 2803 | f 254 958 707 2804 | f 186 514 187 2805 | f 888 514 25 2806 | f 360 187 514 2807 | f 515 250 255 2808 | f 707 958 361 2809 | f 889 509 42 2810 | f 526 7 265 2811 | f 710 961 6 2812 | f 26 522 88 2813 | f 95 517 516 2814 | f 520 364 261 2815 | f 88 522 852 2816 | f 365 712 91 2817 | f 520 152 149 2818 | f 520 190 152 2819 | f 257 152 190 2820 | f 152 257 258 2821 | f 518 188 96 2822 | f 959 264 725 2823 | f 97 257 896 2824 | f 718 367 42 2825 | f 525 262 192 2826 | f 192 720 525 2827 | f 889 42 898 2828 | f 526 715 368 2829 | f 259 366 717 2830 | f 829 894 527 2831 | f 894 829 256 2832 | f 721 719 267 2833 | f 851 964 960 2834 | f 759 999 889 2835 | f 368 266 963 2836 | f 963 266 722 2837 | f 369 722 535 2838 | f 43 268 263 2839 | f 263 370 98 2840 | f 371 830 99 2841 | f 189 723 896 2842 | f 724 530 723 2843 | f 531 271 97 2844 | f 723 154 531 2845 | f 725 967 959 2846 | f 743 967 725 2847 | f 153 97 726 2848 | f 830 533 538 2849 | f 897 728 372 2850 | f 731 530 728 2851 | f 725 729 899 2852 | f 730 154 731 2853 | f 967 743 962 2854 | f 899 743 725 2855 | f 534 532 727 2856 | f 534 744 732 2857 | f 718 962 367 2858 | f 968 733 267 2859 | f 733 273 102 2860 | f 374 965 158 2861 | f 268 373 155 2862 | f 268 155 969 2863 | f 155 277 969 2864 | f 969 277 274 2865 | f 529 100 897 2866 | f 735 102 537 2867 | f 544 736 970 2868 | f 854 374 158 2869 | f 540 100 546 2870 | f 539 379 101 2871 | f 540 739 728 2872 | f 740 899 541 2873 | f 731 748 741 2874 | f 744 745 275 2875 | f 193 367 900 2876 | f 546 755 971 2877 | f 834 758 548 2878 | f 747 749 972 2879 | f 156 900 27 2880 | f 900 156 853 2881 | f 27 29 156 2882 | f 745 542 275 2883 | f 549 376 28 2884 | f 746 157 750 2885 | f 544 545 276 2886 | f 158 973 854 2887 | f 751 737 377 2888 | f 276 545 377 2889 | f 272 854 103 2890 | f 751 547 378 2891 | f 194 546 100 2892 | f 280 159 754 2893 | f 754 753 763 2894 | f 974 283 380 2895 | f 757 758 834 2896 | f 557 755 756 2897 | f 160 279 557 2898 | f 972 279 160 2899 | f 975 156 161 2900 | f 376 549 833 2901 | f 972 903 28 2902 | f 976 549 760 2903 | f 193 44 759 2904 | f 551 761 856 2905 | f 555 552 856 2906 | f 716 1000 901 2907 | f 161 105 771 2908 | f 282 45 760 2909 | f 566 45 381 2910 | f 195 761 976 2911 | f 45 905 760 2912 | f 45 907 905 2913 | f 44 977 759 2914 | f 904 568 975 2915 | f 382 762 384 2916 | f 763 555 382 2917 | f 382 32 106 2918 | f 973 980 765 2919 | f 104 285 764 2920 | f 288 285 774 2921 | f 289 288 837 2922 | f 559 979 857 2923 | f 558 564 381 2924 | f 562 565 558 2925 | f 771 383 166 2926 | f 287 566 286 2927 | f 44 568 977 2928 | f 385 384 290 2929 | f 384 385 772 2930 | f 290 384 554 2931 | f 901 983 978 2932 | f 567 908 34 2933 | f 908 567 836 2934 | f 569 910 836 2935 | f 776 910 569 2936 | f 774 777 288 2937 | f 570 779 165 2938 | f 565 769 291 2939 | f 35 782 112 2940 | f 778 573 786 2941 | f 572 165 780 2942 | f 111 577 576 2943 | f 111 585 577 2944 | f 196 395 988 2945 | f 389 577 782 2946 | f 34 294 567 2947 | f 163 390 34 2948 | f 390 988 109 2949 | f 390 109 294 2950 | f 294 109 578 2951 | f 567 579 836 2952 | f 983 985 575 2953 | f 913 784 580 2954 | f 784 913 788 2955 | f 393 399 110 2956 | f 901 199 983 2957 | f 199 990 983 2958 | f 786 114 197 2959 | f 786 197 574 2960 | f 779 575 860 2961 | f 780 917 296 2962 | f 395 787 48 2963 | f 585 989 396 2964 | f 48 789 297 2965 | f 787 296 300 2966 | f 296 295 300 2967 | f 170 397 989 2968 | f 302 398 396 2969 | f 789 587 297 2970 | f 801 587 791 2971 | f 597 587 801 2972 | f 198 803 993 2973 | f 992 198 591 2974 | f 589 992 793 2975 | f 793 113 589 2976 | f 793 173 299 2977 | f 860 172 794 2978 | f 993 592 591 2979 | f 803 118 993 2980 | f 199 406 990 2981 | f 584 984 405 2982 | f 593 796 798 2983 | f 173 916 593 2984 | f 408 595 914 2985 | f 402 403 410 2986 | f 594 595 919 2987 | f 919 605 594 2988 | f 174 115 10 2989 | f 10 306 174 2990 | f 301 800 994 2991 | f 201 304 303 2992 | f 791 301 994 2993 | f 304 995 303 2994 | f 308 805 596 2995 | f 597 36 588 2996 | f 918 36 802 2997 | -------------------------------------------------------------------------------- /func_render/texture_transfer_pMap.m: -------------------------------------------------------------------------------- 1 | function [] = texture_transfer_pMap(T12, S1, S2, B1, B2, save_path) 2 | B2_inv = pinv(B2); 3 | B1_inv = pinv(B1); 4 | % T12: maps S1 -> S2, n1-dim vector 5 | n1 = length(S1.surface.X); 6 | n2 = length(S2.surface.X); 7 | P21 = sparse(1:n1,T12, ones(1,n2), n1, n2); % n1-by-n2 matrix, maps S2 -> S1 8 | C21 = B1_inv*P21*B2; % k1-by-k2 matrix, maps S2 -> S1 9 | P21 = B1*C21*B2_inv; 10 | 11 | % % convert pMap to fMap first, then find the soft correspondence matrix 12 | % C21_new = B1\B2(T12,:); 13 | % % C21_new = mat_projection(C21_new); 14 | % P21_new = B1*C21_new*B2_inv; 15 | %% visualization: P21 for texture transfering 16 | cols = [1 2 3]; 17 | texture_im = 'texture.jpg'; 18 | X2 = S2.surface.VERT; 19 | [~,ic] = sort(std(X2),'descend'); 20 | S2_vt = MESH_IO.generate_tex_coords(X2(:,ic), cols(1), cols(2), 1); 21 | 22 | if nargin < 6, save_path = './'; end 23 | 24 | S1_name = 'target'; 25 | S2_name = 'source'; 26 | if isfield(S1,'name') 27 | S1_name = [S1_name,'_', S1.name]; 28 | end 29 | 30 | if isfield(S2,'name') 31 | S2_name = [S2_name,'_', S2.name]; 32 | end 33 | 34 | % Source mesh 35 | MESH_IO.wobj_with_texture(S2, S2_vt, texture_im, [save_path, S2_name]); 36 | 37 | % Target mesh: 38 | MESH_IO.wobj_with_texture(S1, P21*S2_vt, texture_im, [save_path,S1_name]); 39 | % MESH_IO.wobj_with_texture(S1, P21_new*S2_vt, texture_im, [save_path,S1_name,'_fMap']); 40 | 41 | end 42 | 43 | 44 | function C = mat_projection(W) 45 | n1 = size(W,1); 46 | n2 = size(W,2); 47 | [s,~,d] = svd(W); 48 | C = s*eye(n1,n2)*d'; 49 | end -------------------------------------------------------------------------------- /results/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/.DS_Store -------------------------------------------------------------------------------- /results/eg_shapePair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_shapePair.png -------------------------------------------------------------------------------- /results/eg_shapeWithLandmarks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_shapeWithLandmarks.png -------------------------------------------------------------------------------- /results/eg_singleShape_allEdges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_allEdges.png -------------------------------------------------------------------------------- /results/eg_singleShape_colorFromVertex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_colorFromVertex.png -------------------------------------------------------------------------------- /results/eg_singleShape_colorFromVertex_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_colorFromVertex_v2.png -------------------------------------------------------------------------------- /results/eg_singleShape_singleCol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_singleCol.png -------------------------------------------------------------------------------- /results/eg_singleShape_subsetEdges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_subsetEdges.png -------------------------------------------------------------------------------- /results/eg_singleShape_vectorField.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_vectorField.png -------------------------------------------------------------------------------- /results/eg_singleShape_visualizeFunction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/eg_singleShape_visualizeFunction.png -------------------------------------------------------------------------------- /results/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llorz/MatlabRenderToolbox/096203a8294d1d13ddb57d26f40b9e08083238cc/results/overview.png --------------------------------------------------------------------------------