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 |