cr1901

'yolo' duplicate

Nov 8th, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function [x y z] = bone(lengthBone, radiusBone, nBone, option)
  2.  
  3. %Fonction permettant de dessiner un os avec des surfaces NURBS. Les
  4. %variables x y z sont les trois matrices requises par l'instruction surf.
  5. %Les arguments lengthBone et radiusBone représentent respectivement la
  6. %demi-longueur et le rayon central de l'os. Le centre de gravité de l'os
  7. %est situé à l'origine et son axe de symétrie est parallèle à l'axe Oz.
  8. %L'argument nBone donne la taille des matrices carrées x y z.
  9.  
  10. %NOTE : La grande partie du code est inspirée du code vase.m de Vincent
  11. %Legat. Sa fonction Bspline a été retirée du code car elle n'a pas été
  12. %modifiée. Le programme imprime d'office les 2 os. Si l'on choisit option==1
  13. %il imprime une ou plusieurs surfaces NURBS supplementaire(s).
  14. %
  15. % Auteur : Denis Deneire
  16. % Date : 6 novembre 2013
  17.  
  18. T = [0 0 0 1 2 3 4 5 5 6];
  19. S = [0 0 0 1 1 2 2 3 3 4]; % T et S sont les noeuds des Bsplines
  20. a = sqrt(3);
  21. Xc = [1 0 1/2 1 3/2 2 1] ;
  22. Yc = [0 0 a/2 a a/2 0 0] ;
  23. Xc = Xc - mean(Xc(1:6));
  24. Yc = Yc - mean(Yc(1:6));
  25. Zc = ones(size(Xc));
  26. Wc = [1 0.5 1 0.5 1 0.5 1]; % Poids
  27.  
  28.  
  29. %Utilisation des parametres rayon et demi-longueur de l'os pour obtenir la
  30. %forme correcte. La dimension des matrices par lesquelles on multiplie les
  31. %vecteurs Xc Yc Zc correspond à la taille des matrices Bs et Bt.
  32.  
  33. X = Xc' * [0 radiusBone*15 radiusBone*5 radiusBone*3 radiusBone*5 radiusBone*15 0];
  34. Y = Yc' * [0 radiusBone*15 radiusBone*5 radiusBone*3 radiusBone*5 radiusBone*15 0];
  35. Z = Zc' * [-lengthBone*3 -lengthBone*3.5 -lengthBone*2 0 lengthBone*2 lengthBone*3.5 lengthBone*3];
  36. W = Wc' * [1 1 1 1 1 1 1];
  37. p = 2;
  38.  
  39. nt = length(T) - 1;
  40. ni = (T(nt-p+1)-T(p+1))/(nBone-1); % Longueur d'un intervalle
  41. t = [T(p+1):ni:T(nt-p+1)]; % La longueur définit le nombre d'intervalle
  42.  
  43.  
  44. for i=0:nt-p-1
  45.     Bt(i+1,:) = b(t,T,i,p); % Calcul pour trouver les surfaces NURBS
  46. end
  47.  
  48. ns = length(S) - 1;
  49. ni2 = (S(ns-p+1)-S(p+1))/(nBone-1); % Longueur d'un intervalle
  50. s = [S(p+1):ni2:S(ns-p+1)]; % La longueur définit le nombre d'intervalle
  51.  
  52.  
  53. for i=0:ns-p-1
  54.     Bs(i+1,:) = b(s,S,i,p); % Calcul pour trouver les surfaces NURBS
  55. end
  56.  
  57. w = Bs' * W * Bt;
  58. x = Bs' * (W .* X) * Bt ./ w;
  59. y = Bs' * (W .* Y) * Bt ./ w;
  60. z = Bs' * (W .* Z) * Bt ./ w;
  61.  
  62. surf(x,y,z); axis('off'); axis('equal');
  63.  
  64.  
  65.  
  66. % Ajout d'une option==1 permettant d'ajouter des figures plus jolies :)
  67.  
  68. if option==1
  69.    
  70.     % Chapeau chinois
  71.    
  72.     X1 = Xc' * [0 60 20 15 15 15 0];
  73.     Y1 = Yc' * [0 60 20 15 15 15 0];
  74.     Z1 = Zc' * [30 20 20 20 25 20 20];
  75.    
  76.     x1 = Bs' * (W .* X1) * Bt ./ w;
  77.     y1 = Bs' * (W .* Y1) * Bt ./ w;
  78.     z1 = Bs' * (W .* Z1) * Bt ./ w;
  79.    
  80.    
  81.     h1 = surf(x1,y1,z1-1,'FaceLighting','phong',...
  82.         'LineStyle','none','FaceColor',[1 0.5 0.2]);
  83.    
  84.     hold on;
  85.    
  86.    
  87.     % Tete
  88.    
  89.     X1 = Xc' * [0 20 17 15 10 5 0];
  90.     Y1 = Yc' * [0 20 17 15 10 5 0];
  91.     Z1 = Zc' * [20 20 15 10 5 3 3];
  92.    
  93.     x1 = Bs' * (W .* X1) * Bt ./ w;
  94.     y1 = Bs' * (W .* Y1) * Bt ./ w;
  95.     z1 = Bs' * (W .* Z1) * Bt ./ w;
  96.    
  97.    
  98.     h1 = surf(x1,y1,z1+1,'FaceLighting','phong',...
  99.         'LineStyle','none','FaceColor',[1 1 0.6]);
  100.    
  101.     hold on;
  102.    
  103.    
  104.     % Yeux de chinois -_-
  105.    
  106.     X2 = Xc' * [0 1 1 1 1 0.5 0];
  107.     Y2 = Yc' * [0 1 1 1 1 0.5 0];
  108.     Z2 = Zc' * [-1 2 3 3 2 2 3];
  109.    
  110.     x2 = Bs' * (W .* X2) * Bt ./ w;
  111.     y2 = Bs' * (W .* Y2) * Bt ./ w;
  112.     z2 = Bs' * (W .* Z2) * Bt ./ w;
  113.    
  114.    
  115.     h2 = surf(x2-12,y2-9,z2+8,'FaceLighting','phong',...
  116.         'LineStyle','none','FaceColor',[0 0 0]);
  117.    
  118.     rotate(h2,[0 1 0],70,[0 0 0]);
  119.    
  120.    
  121.     h2 = surf(x2+12,y2-9,z2+8,'FaceLighting','phong',...
  122.         'LineStyle','none','FaceColor',[0 0 0]);
  123.    
  124.     rotate(h2,[0 1 0],-70,[0 0 0]);
  125.    
  126.     hold on;
  127.    
  128.    
  129.     % Bouche
  130.    
  131.     X2 = Xc' * [0 0.5 0.5 0.5 0.5 0.5 0];
  132.     Y2 = Yc' * [0 0.5 0.5 0.5 0.5 0.5 0];
  133.     Z2 = Zc' * [-3 -2 -1 0 1 2 3];
  134.    
  135.     x2 = Bs' * (W .* X2) * Bt ./ w;
  136.     y2 = Bs' * (W .* Y2) * Bt ./ w;
  137.     z2 = Bs' * (W .* Z2) * Bt ./ w;
  138.    
  139.    
  140.     h3 = surf(x2-8,y2-7.5,z2,'FaceLighting','phong',...
  141.         'LineStyle','none','FaceColor',[0 0 0]);
  142.    
  143.     rotate(h3,[0 1 0],90,[0 0 0]);
  144.    
  145.     hold on;
  146.    
  147.    
  148. end
  149. end
Add Comment
Please, Sign In to add comment