Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [x y z] = bone(lengthBone, radiusBone, nBone, option)
- %Fonction permettant de dessiner un os avec des surfaces NURBS. Les
- %variables x y z sont les trois matrices requises par l'instruction surf.
- %Les arguments lengthBone et radiusBone représentent respectivement la
- %demi-longueur et le rayon central de l'os. Le centre de gravité de l'os
- %est situé à l'origine et son axe de symétrie est parallèle à l'axe Oz.
- %L'argument nBone donne la taille des matrices carrées x y z.
- %NOTE : La grande partie du code est inspirée du code vase.m de Vincent
- %Legat. Sa fonction Bspline a été retirée du code car elle n'a pas été
- %modifiée. Le programme imprime d'office les 2 os. Si l'on choisit option==1
- %il imprime une ou plusieurs surfaces NURBS supplementaire(s).
- %
- % Auteur : Denis Deneire
- % Date : 6 novembre 2013
- T = [0 0 0 1 2 3 4 5 5 6];
- S = [0 0 0 1 1 2 2 3 3 4]; % T et S sont les noeuds des Bsplines
- a = sqrt(3);
- Xc = [1 0 1/2 1 3/2 2 1] ;
- Yc = [0 0 a/2 a a/2 0 0] ;
- Xc = Xc - mean(Xc(1:6));
- Yc = Yc - mean(Yc(1:6));
- Zc = ones(size(Xc));
- Wc = [1 0.5 1 0.5 1 0.5 1]; % Poids
- %Utilisation des parametres rayon et demi-longueur de l'os pour obtenir la
- %forme correcte. La dimension des matrices par lesquelles on multiplie les
- %vecteurs Xc Yc Zc correspond à la taille des matrices Bs et Bt.
- X = Xc' * [0 radiusBone*15 radiusBone*5 radiusBone*3 radiusBone*5 radiusBone*15 0];
- Y = Yc' * [0 radiusBone*15 radiusBone*5 radiusBone*3 radiusBone*5 radiusBone*15 0];
- Z = Zc' * [-lengthBone*3 -lengthBone*3.5 -lengthBone*2 0 lengthBone*2 lengthBone*3.5 lengthBone*3];
- W = Wc' * [1 1 1 1 1 1 1];
- p = 2;
- nt = length(T) - 1;
- ni = (T(nt-p+1)-T(p+1))/(nBone-1); % Longueur d'un intervalle
- t = [T(p+1):ni:T(nt-p+1)]; % La longueur définit le nombre d'intervalle
- for i=0:nt-p-1
- Bt(i+1,:) = b(t,T,i,p); % Calcul pour trouver les surfaces NURBS
- end
- ns = length(S) - 1;
- ni2 = (S(ns-p+1)-S(p+1))/(nBone-1); % Longueur d'un intervalle
- s = [S(p+1):ni2:S(ns-p+1)]; % La longueur définit le nombre d'intervalle
- for i=0:ns-p-1
- Bs(i+1,:) = b(s,S,i,p); % Calcul pour trouver les surfaces NURBS
- end
- w = Bs' * W * Bt;
- x = Bs' * (W .* X) * Bt ./ w;
- y = Bs' * (W .* Y) * Bt ./ w;
- z = Bs' * (W .* Z) * Bt ./ w;
- surf(x,y,z); axis('off'); axis('equal');
- % Ajout d'une option==1 permettant d'ajouter des figures plus jolies :)
- if option==1
- % Chapeau chinois
- X1 = Xc' * [0 60 20 15 15 15 0];
- Y1 = Yc' * [0 60 20 15 15 15 0];
- Z1 = Zc' * [30 20 20 20 25 20 20];
- x1 = Bs' * (W .* X1) * Bt ./ w;
- y1 = Bs' * (W .* Y1) * Bt ./ w;
- z1 = Bs' * (W .* Z1) * Bt ./ w;
- h1 = surf(x1,y1,z1-1,'FaceLighting','phong',...
- 'LineStyle','none','FaceColor',[1 0.5 0.2]);
- hold on;
- % Tete
- X1 = Xc' * [0 20 17 15 10 5 0];
- Y1 = Yc' * [0 20 17 15 10 5 0];
- Z1 = Zc' * [20 20 15 10 5 3 3];
- x1 = Bs' * (W .* X1) * Bt ./ w;
- y1 = Bs' * (W .* Y1) * Bt ./ w;
- z1 = Bs' * (W .* Z1) * Bt ./ w;
- h1 = surf(x1,y1,z1+1,'FaceLighting','phong',...
- 'LineStyle','none','FaceColor',[1 1 0.6]);
- hold on;
- % Yeux de chinois -_-
- X2 = Xc' * [0 1 1 1 1 0.5 0];
- Y2 = Yc' * [0 1 1 1 1 0.5 0];
- Z2 = Zc' * [-1 2 3 3 2 2 3];
- x2 = Bs' * (W .* X2) * Bt ./ w;
- y2 = Bs' * (W .* Y2) * Bt ./ w;
- z2 = Bs' * (W .* Z2) * Bt ./ w;
- h2 = surf(x2-12,y2-9,z2+8,'FaceLighting','phong',...
- 'LineStyle','none','FaceColor',[0 0 0]);
- rotate(h2,[0 1 0],70,[0 0 0]);
- h2 = surf(x2+12,y2-9,z2+8,'FaceLighting','phong',...
- 'LineStyle','none','FaceColor',[0 0 0]);
- rotate(h2,[0 1 0],-70,[0 0 0]);
- hold on;
- % Bouche
- X2 = Xc' * [0 0.5 0.5 0.5 0.5 0.5 0];
- Y2 = Yc' * [0 0.5 0.5 0.5 0.5 0.5 0];
- Z2 = Zc' * [-3 -2 -1 0 1 2 3];
- x2 = Bs' * (W .* X2) * Bt ./ w;
- y2 = Bs' * (W .* Y2) * Bt ./ w;
- z2 = Bs' * (W .* Z2) * Bt ./ w;
- h3 = surf(x2-8,y2-7.5,z2,'FaceLighting','phong',...
- 'LineStyle','none','FaceColor',[0 0 0]);
- rotate(h3,[0 1 0],90,[0 0 0]);
- hold on;
- end
- end
Add Comment
Please, Sign In to add comment