SHOW:
|
|
- or go back to the newest paste.
| 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 |