View difference between Paste ID: cM1v4fAY and z7W68r6K
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