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