gusucode.com > demos工具箱matlab源码程序 > demos/teapotGeometry.m

    function [pv, pf, pc] = teapotGeometry
% The function teapotData generates vertices, faces, and colors that
% represent the surface of the infamous Newell teapot.

% Get the teapot coords from the local functions below.
verts = teapotVertices;
quads = teapotControlPoints;

% Initialize the vertex, face, and color arrays
pv = [];
pf = [];
pc = [];

% loop over the patches, creating (n-1)*(n-1) quads on the surface
for i = 1:size(quads,3)
   points = verts(quads(:,:,i),:);    % extract the control points for the patch
   x = points(:,1);                   % separate the X, Y, and Z components
   y = points(:,2);
   z = points(:,3);
   
   % use evalCubicBezierPatch to generate quadrilaterals
   [f,v,c] = evalCubicBezierPatch(x,y,z);
   
   % append these quads to the list
   numv = size(pv,1);
   pv = [pv; v];      %#ok<AGROW>
   pf = [pf; f+numv]; %#ok<AGROW>
   pc = [pc; c];      %#ok<AGROW>
end

end


function [f,v,c] = evalCubicBezierPatch(xc,yc,zc)
% The function evalCubicBezierPatch(n,xc,yc,zc) creates a surface from
%   a cubic bezier patch.  XC, YC, and ZC are the X, Y, and Z coordinates
%   of the 16 control points.
%
% The equation for a point on the surface is:
%   P(u,v) = [u^3 3u^2(1-u) 3u(1-u)^2 (1-u)^3]*P*[v^3 3v^2(1-v) 3v(1-v)^2 (1-v)^3]'
%
% where:
%   0 <= u <= 1
%   0 <= v <= 1
%   P is a 4x4 containing the 16 control points

% generate N values for U and build the params for curves of constant U
n = 12;
u = (0:n-1)'/(n-1);
A = [(u.^3) (3 * u.^2 .* (1-u)) (3 * u .* (1-u).^2) ((1-u).^3)];

% generate N values for V and build the params for curves of constant V
v = (0:n-1)'/(n-1);
B = [(v.^3) (3 * v.^2 .* (1-v)) (3 * v .* (1-v).^2) ((1-v).^3)];

% build the tensor product of the U's & V's
mat = kron(A,B);

% multiply by the control points
xd = mat*xc;
yd = mat*yc;
zd = mat*zc;

% reshape the data into square matrices
x = reshape(xd,n,n);
y = reshape(yd,n,n);
z = reshape(zd,n,n);

% Set the colors indexed to the z value
colors = z;

% Return the geometry in the correct form for patch
[f, v, c] = surf2patch(x,y,z,colors);

end


function verts = teapotVertices
% Function verts defines the control points for the generated bezier
% patches

verts = [  1.4     0.     2.4     ;
   1.4    -0.784  2.4     ;
   0.784  -1.4    2.4     ;
   0.     -1.4    2.4     ;
   1.3375  0.     2.53125 ;
   1.3375 -0.749  2.53125 ;
   0.749  -1.3375 2.53125 ;
   0.     -1.3375 2.53125 ;
   1.4375  0.     2.53125 ;
   1.4375 -0.805  2.53125 ;
   0.805  -1.4375 2.53125 ;
   0.     -1.4375 2.53125 ;
   1.5     0.     2.4     ;
   1.5    -0.84   2.4     ;
   0.84   -1.5    2.4     ;
   0.     -1.5    2.4     ;
   -0.784  -1.4    2.4     ;
   -1.4    -0.784  2.4     ;
   -1.4     0.     2.4     ;
   -0.749  -1.3375 2.53125 ;
   -1.3375 -0.749  2.53125 ;
   -1.3375  0.0    2.53125 ;
   -0.805  -1.4375 2.53125 ;
   -1.4375 -0.805  2.53125 ;
   -1.4375  0.0    2.53125 ;
   -0.84   -1.5    2.4     ;
   -1.5    -0.84   2.4     ;
   -1.5     0.     2.4     ;
   -1.4     0.784  2.4     ;
   -0.784   1.4    2.4     ;
   0.      1.4    2.4     ;
   -1.3375  0.749  2.53125 ;
   -0.749   1.3375 2.53125 ;
   0.      1.3375 2.53125 ;
   -1.4375  0.805  2.53125 ;
   -0.805   1.4375 2.53125 ;
   0.      1.4375 2.53125 ;
   -1.5     0.84   2.4     ;
   -0.84    1.5    2.4     ;
   0.      1.5    2.4     ;
   0.784   1.4    2.4     ;
   1.4     0.784  2.4     ;
   0.749   1.3375 2.53125 ;
   1.3375  0.749  2.53125 ;
   0.805   1.4375 2.53125 ;
   1.4375  0.805  2.53125 ;
   0.84    1.5    2.4     ;
   1.5     0.84   2.4     ;
   1.75    0.     1.875   ;
   1.75   -0.98   1.875   ;
   0.98   -1.75   1.875   ;
   0.     -1.75   1.875   ;
   2.      0.     1.35    ;
   2.     -1.12   1.35    ;
   1.12   -2.     1.35    ;
   0.     -2.     1.35    ;
   2.      0.     0.9     ;
   2.     -1.12   0.9     ;
   1.12   -2.     0.9     ;
   0.     -2.     0.9     ;
   -0.98   -1.75   1.875   ;
   -1.75   -0.98   1.875   ;
   -1.75    0.     1.875   ;
   -1.12   -2.     1.35    ;
   -2.     -1.12   1.35    ;
   -2.      0.     1.35    ;
   -1.12   -2.     0.9     ;
   -2.     -1.12   0.9     ;
   -2.      0.     0.9     ;
   -1.75    0.98   1.875   ;
   -0.98    1.75   1.875   ;
   0.      1.75   1.875   ;
   -2.      1.12   1.35    ;
   -1.12    2.     1.35    ;
   0.      2.     1.35    ;
   -2.      1.12   0.9     ;
   -1.12    2.     0.9     ;
   0.0     2.     0.9     ;
   0.98    1.75   1.875   ;
   1.75    0.98   1.875   ;
   1.12    2.     1.35    ;
   2.      1.12   1.35    ;
   1.12    2.     0.9     ;
   2.      1.12   0.9     ;
   2.      0.     0.45    ;
   2.     -1.12   0.45    ;
   1.12   -2.     0.45    ;
   0.     -2.     0.45    ;
   1.5     0.     0.225   ;
   1.5    -0.84   0.225   ;
   0.84   -1.5    0.225   ;
   0.     -1.5    0.225   ;
   1.5     0.     0.15    ;
   1.5    -0.84   0.15    ;
   0.84   -1.5    0.15    ;
   0.0    -1.5    0.15    ;
   -1.12   -2.     0.45    ;
   -2.     -1.12   0.45    ;
   -2.      0.     0.45    ;
   -0.84   -1.5    0.225   ;
   -1.5    -0.84   0.225   ;
   -1.5     0.     0.225   ;
   -0.84   -1.5    0.15    ;
   -1.5    -0.84   0.15    ;
   -1.5     0.     0.15    ;
   -2.      1.12   0.45    ;
   -1.12    2.     0.45    ;
   0.      2.     0.45    ;
   -1.5     0.84   0.225   ;
   -0.84    1.5    0.225   ;
   0.      1.5    0.225   ;
   -1.5     0.84   0.15    ;
   -0.84    1.5    0.15    ;
   0.      1.5    0.15    ;
   1.12    2.     0.45    ;
   2.      1.12   0.45    ;
   0.84    1.5    0.225   ;
   1.5     0.84   0.225   ;
   0.84    1.5    0.15    ;
   1.5     0.84   0.15    ;
   -1.6     0.     2.025   ;
   -1.6    -0.3    2.025   ;
   -1.5    -0.3    2.25    ;
   -1.5     0      2.25    ;
   -2.3     0.     2.025   ;
   -2.3    -0.3    2.025   ;
   -2.5    -0.3    2.25    ;
   -2.5     0.     2.25    ;
   -2.7     0.     2.025   ;
   -2.7    -0.3    2.025   ;
   -3.     -0.3    2.25    ;
   -3.      0.     2.25    ;
   -2.7     0.     1.8     ;
   -2.7    -0.3    1.8     ;
   -3.     -0.3    1.8     ;
   -3.      0.     1.8     ;
   -1.5     0.3    2.25    ;
   -1.6     0.3    2.025   ;
   -2.5     0.3    2.25    ;
   -2.3     0.3    2.025   ;
   -3.      0.3    2.25    ;
   -2.7     0.3    2.025   ;
   -3.      0.3    1.8     ;
   -2.7     0.3    1.8     ;
   -2.7     0.     1.575   ;
   -2.7    -0.3    1.575   ;
   -3.     -0.3    1.35    ;
   -3.      0.     1.35    ;
   -2.5     0.     1.125   ;
   -2.5    -0.3    1.125   ;
   -2.65   -0.3    0.9375  ;
   -2.65    0.     0.9375  ;
   -2.     -0.3    0.9     ;
   -1.9    -0.3    0.6     ;
   -1.9     0.     0.6     ;
   -3.      0.3    1.35    ;
   -2.7     0.3    1.575   ;
   -2.65    0.3    0.9375  ;
   -2.5     0.3    1.125   ;
   -1.9     0.3    0.6     ;
   -2.      0.3    0.9     ;
   1.7     0.     1.425   ;
   1.7    -0.66   1.425   ;
   1.7    -0.66   0.6     ;
   1.7     0.     0.6     ;
   2.6     0.     1.425   ;
   2.6    -0.66   1.425   ;
   3.1    -0.66   0.825   ;
   3.1     0.     0.825   ;
   2.3     0.     2.1     ;
   2.3    -0.25   2.1     ;
   2.4    -0.25   2.025   ;
   2.4     0.     2.025   ;
   2.7     0.     2.4     ;
   2.7    -0.25   2.4     ;
   3.3    -0.25   2.4     ;
   3.3     0.     2.4     ;
   1.7     0.66   0.6     ;
   1.7     0.66   1.425   ;
   3.1     0.66   0.825   ;
   2.6     0.66   1.425   ;
   2.4     0.25   2.025   ;
   2.3     0.25   2.1     ;
   3.3     0.25   2.4     ;
   2.7     0.25   2.4     ;
   2.8     0.     2.475   ;
   2.8    -0.25   2.475   ;
   3.525  -0.25   2.49375 ;
   3.525   0.     2.49375 ;
   2.9     0.     2.475   ;
   2.9    -0.15   2.475   ;
   3.45   -0.15   2.5125  ;
   3.45    0.     2.5125  ;
   2.8     0.     2.4     ;
   2.8    -0.15   2.4     ;
   3.2    -0.15   2.4     ;
   3.2     0.     2.4     ;
   3.525   0.25   2.49375 ;
   2.8     0.25   2.475   ;
   3.45    0.15   2.5125  ;
   2.9     0.15   2.475   ;
   3.2     0.15   2.4     ;
   2.8     0.15   2.4     ;
   0.      0.     3.15    ;
   0.     -0.002  3.15    ;
   0.002   0.     3.15    ;
   0.8     0.     3.15    ;
   0.8    -0.45   3.15    ;
   0.45   -0.8    3.15    ;
   0.     -0.8    3.15    ;
   0.      0.     2.85    ;
   0.2     0.     2.7     ;
   0.2    -0.112  2.7     ;
   0.112  -0.2    2.7     ;
   0.     -0.2    2.7     ;
   -0.002   0.     3.15    ;
   -0.45   -0.8    3.15    ;
   -0.8    -0.45   3.15    ;
   -0.8     0.     3.15    ;
   -0.112  -0.2    2.7     ;
   -0.2    -0.112  2.7     ;
   -0.2     0.     2.7     ;
   0       0.002  3.15    ;
   -0.8     0.45   3.15    ;
   -0.45    0.8    3.15    ;
   0.      0.8    3.15    ;
   -0.2     0.112  2.7     ;
   -0.112   0.2    2.7     ;
   0.      0.2    2.7     ;
   0.45    0.8    3.15    ;
   0.8     0.45   3.15    ;
   0.112   0.2    2.7     ;
   0.2     0.112  2.7     ;
   0.4     0.     2.55    ;
   0.4    -0.224  2.55    ;
   0.224  -0.4    2.55    ;
   0.     -0.4    2.55    ;
   1.3     0.     2.55    ;
   1.3    -0.728  2.55    ;
   0.728  -1.3    2.55    ;
   0.     -1.3    2.55    ;
   1.3     0.     2.4     ;
   1.3    -0.728  2.4     ;
   0.728  -1.3    2.4     ;
   0.     -1.3    2.4     ;
   -0.224  -0.4    2.55    ;
   -0.4    -0.224  2.55    ;
   -0.4     0.     2.55    ;
   -0.728  -1.3    2.55    ;
   -1.3    -0.728  2.55    ;
   -1.3     0.     2.55    ;
   -0.728  -1.3    2.4     ;
   -1.3    -0.728  2.4     ;
   -1.3     0.     2.4     ;
   -0.4     0.224  2.55    ;
   -0.224   0.4    2.55    ;
   0.      0.4    2.55    ;
   -1.3     0.728  2.55    ;
   -0.728   1.3    2.55    ;
   0.      1.3    2.55    ;
   -1.3     0.728  2.4     ;
   -0.728   1.3    2.4     ;
   0.      1.3    2.4     ;
   0.224   0.4    2.55    ;
   0.4     0.224  2.55    ;
   0.728   1.3    2.55    ;
   1.3     0.728  2.55    ;
   0.728   1.3    2.4     ;
   1.3     0.728  2.4     ;
   0.      0.     0.      ;
   1.5     0.     0.15    ;
   1.5     0.84   0.15    ;
   0.84    1.5    0.15    ;
   0.      1.5    0.15    ;
   1.5     0.     0.075   ;
   1.5     0.84   0.075   ;
   0.83    1.5    0.075   ;
   0.      1.5    0.075   ;
   1.425   0.     0.      ;
   1.425   0.798  0.      ;
   0.798   1.425  0.      ;
   0.      1.425  0.      ;
   -0.84    1.5    0.15    ;
   -1.5     0.84   0.15    ;
   -1.5     0.     0.15    ;
   -0.84    1.5    0.075   ;
   -1.5     0.84   0.075   ;
   -1.5     0.     0.075   ;
   -0.798   1.425  0.      ;
   -1.425   0.798  0.      ;
   -1.425   0.     0.      ;
   -1.5    -0.84   0.15    ;
   -0.84   -1.5    0.15    ;
   0.     -1.5    0.15    ;
   -1.5    -0.84   0.075   ;
   -0.84   -1.5    0.075   ;
   0.     -1.5    0.075   ;
   -1.425  -0.798  0.      ;
   -0.798  -1.425  0.      ;
   0.     -1.425  0.      ;
   0.84   -1.5    0.15    ;
   1.5    -0.84   0.15    ;
   0.84   -1.5    0.075   ;
   1.5    -0.84   0.075   ;
   0.798  -1.425  0.      ;
   1.425  -0.798  0.      ];
end


function quads = teapotControlPoints()
% Function quads selects the control points that are used for each of the
% 32 bezier patches

quads = cat(3, [
   % rim
   1   2   3   4 ;   5   6   7   8 ;   9  10  11  12 ;  13  14  15  16 ] , [
   4  17  18  19 ;   8  20  21  22 ;  12  23  24  25 ;  16  26  27  28 ] , [
   19  29  30  31 ;  22  32  33  34 ;  25  35  36  37 ;  28  38  39  40 ] , [
   31  41  42   1 ;  34  43  44   5 ;  37  45  46   9 ;  40  47  48  13 ] , [
   % body
   13  14  15  16 ;  49  50  51  52 ;  53  54  55  56 ;  57  58  59  60 ] , [
   16  26  27  28 ;  52  61  62  63 ;  56  64  65  66 ;  60  67  68  69 ] , [
   28  38  39  40 ;  63  70  71  72 ;  66  73  74  75 ;  69  76  77  78 ] , [
   40  47  48  13 ;  72  79  80  49 ;  75  81  82  53 ;  78  83  84  57 ] , [
   57  58  59  60 ;  85  86  87  88 ;  89  90  91  92 ;  93  94  95  96 ] , [
   60  67  68  69 ;  88  97  98  99 ;  92 100 101 102 ;  96 103 104 105 ] , [
   69  76  77  78 ;  99 106 107 108 ; 102 109 110 111 ; 105 112 113 114 ] , [
   78  83  84  57 ; 108 115 116  85 ; 111 117 118  89 ; 114 119 120  93 ] , [
   % handle
   121 122 123 124 ; 125 126 127 128 ; 129 130 131 132 ; 133 134 135 136 ] , [
   124 137 138 121 ; 128 139 140 125 ; 132 141 142 129 ; 136 143 144 133 ] , [
   133 134 135 136 ; 145 146 147 148 ; 149 150 151 152 ;  69 153 154 155 ] , [
   136 143 144 133 ; 148 156 157 145 ; 152 158 159 149 ; 155 160 161  69 ] , [
   % spout
   162 163 164 165 ; 166 167 168 169 ; 170 171 172 173 ; 174 175 176 177 ] , [
   165 178 179 162 ; 169 180 181 166 ; 173 182 183 170 ; 177 184 185 174 ] , [
   174 175 176 177 ; 186 187 188 189 ; 190 191 192 193 ; 194 195 196 197 ] , [
   177 184 185 174 ; 189 198 199 186 ; 193 200 201 190 ; 197 202 203 194 ] , [
   % lid
   204 204 204 204 ; 207 208 209 210 ; 211 211 211 211 ; 212 213 214 215 ] , [
   204 204 204 204 ; 210 217 218 219 ; 211 211 211 211 ; 215 220 221 222 ] , [
   204 204 204 204 ; 219 224 225 226 ; 211 211 211 211 ; 222 227 228 229 ] , [
   204 204 204 204 ; 226 230 231 207 ; 211 211 211 211 ; 229 232 233 212 ] , [
   212 213 214 215 ; 234 235 236 237 ; 238 239 240 241 ; 242 243 244 245 ] , [
   215 220 221 222 ; 237 246 247 248 ; 241 249 250 251 ; 245 252 253 254 ] , [
   222 227 228 229 ; 248 255 256 257 ; 251 258 259 260 ; 254 261 262 263 ] , [
   229 232 233 212 ; 257 264 265 234 ; 260 266 267 238 ; 263 268 269 242 ] , [
   % bottom
   270 270 270 270 ; 279 280 281 282 ; 275 276 277 278 ; 271 272 273 274 ] , [
   270 270 270 270 ; 282 289 290 291 ; 278 286 287 288 ; 274 283 284 285 ] , [
   270 270 270 270 ; 291 298 299 300 ; 288 295 296 297 ; 285 292 293 294 ] , [
   270 270 270 270 ; 300 305 306 279 ; 297 303 304 275 ; 294 301 302 271 ] );
end