comparison scripts/plot/surfl.m @ 8460:e4c9ecb64411

diffuse.m, specular.m, surfl.m: style fixes
author John W. Eaton <jwe@octave.org>
date Mon, 12 Jan 2009 11:47:09 -0500
parents 6c4e2fc14beb
children cf2163418140
comparison
equal deleted inserted replaced
8459:d17874a6f161 8460:e4c9ecb64411
66 oldh = gca (); 66 oldh = gca ();
67 unwind_protect 67 unwind_protect
68 axes (h); 68 axes (h);
69 newplot (); 69 newplot ();
70 70
71 ## check for lighting type 71 ## Check for lighting type.
72 use_cdata = true; 72 use_cdata = true;
73 if (ischar (varargin{end})) 73 if (ischar (varargin{end}))
74 lstr = varargin{end}; 74 lstr = varargin{end};
75 if strncmp (tolower (lstr), "light", 5) 75 if (strncmp (tolower (lstr), "light", 5))
76 warning ("light method not supported (yet), using cdata method instead"); 76 warning ("light method not supported (yet), using cdata method instead");
77 # this can be implemented when light objects are being 77 ## This can be implemented when light objects are supported.
78 # supported.
79 use_cdata = false; 78 use_cdata = false;
80 elseif (strncmp (tolower (lstr), "cdata", 5)) 79 elseif (strncmp (tolower (lstr), "cdata", 5))
81 use_cdata = true; 80 use_cdata = true;
82 else 81 else
83 usage ("unknown lighting method"); 82 error ("surfl: unknown lighting method");
84 endif 83 endif
85 varargin(end) = []; 84 varargin(end) = [];
86 endif 85 endif
87 86
88 ## check for reflection properties argument 87 ## Check for reflection properties argument.
88 ##
89 ## r = [ambient light strength, 89 ## r = [ambient light strength,
90 ## diffuse reflection strength, 90 ## diffuse reflection strength,
91 ## specular reflection strength, 91 ## specular reflection strength,
92 ## specular shine] 92 ## specular shine]
93 if ((length (varargin{end}) == 4) && isnumeric (varargin{end})) 93 if (length (varargin{end}) == 4 && isnumeric (varargin{end}))
94 r = varargin{end}; 94 r = varargin{end};
95 varargin(end) = []; 95 varargin(end) = [];
96 else 96 else
97 ## default values 97 ## Default values.
98 r = [0.55, 0.6, 0.4, 10]; 98 r = [0.55, 0.6, 0.4, 10];
99 endif 99 endif
100
101 100
102 ## check for light vector (lv) argument 101 ## Check for light vector (lv) argument.
103 have_lv = false; 102 have_lv = false;
104 if (isnumeric (varargin{end})) 103 if (isnumeric (varargin{end}))
105 len = numel (varargin{end}); 104 len = numel (varargin{end});
106 lastarg = varargin{end}; 105 lastarg = varargin{end};
107 if (len == 3) 106 if (len == 3)
119 if (! ishold ()) 118 if (! ishold ())
120 set (h, "view", [-37.5, 30], 119 set (h, "view", [-37.5, 30],
121 "xgrid", "on", "ygrid", "on", "zgrid", "on", "clim", [0 1]); 120 "xgrid", "on", "ygrid", "on", "zgrid", "on", "clim", [0 1]);
122 endif 121 endif
123 122
124 ## get view vector (vv) 123 ## Get view vector (vv).
125 a = axis; 124 a = axis;
126 [az, el] = view; 125 [az, el] = view;
127 [vv(1), vv(2), vv(3)] = sph2cart ((az - 90) * pi/180.0, el * pi/180.0, 1.0); 126 [vv(1), vv(2), vv(3)] = sph2cart ((az - 90) * pi/180.0, el * pi/180.0, 1.0);
128 vv /= norm (vv); 127 vv /= norm (vv);
129 128
130 if (!have_lv) 129 if (!have_lv)
131 ## calculate light vector (lv) from view vector 130 ## Calculate light vector (lv) from view vector.
132 Phi = 45.0 / 180.0 * pi; 131 Phi = 45.0 / 180.0 * pi;
133 R = [cos(Phi), -sin(Phi), 0;\ 132 R = [cos(Phi), -sin(Phi), 0;
134 sin(Phi), cos(Phi), 0;\ 133 sin(Phi), cos(Phi), 0;
135 0, 0, 1]; 134 0, 0, 1];
136 lv = (R * vv.').'; 135 lv = (R * vv.').';
137 endif 136 endif
138 137
139 vn = get (tmp, "vertexnormals"); 138 vn = get (tmp, "vertexnormals");
140 dar = get (h, "dataaspectratio"); 139 dar = get (h, "dataaspectratio");
141 vn(:, :, 1) *= dar(1); 140 vn(:,:,1) *= dar(1);
142 vn(:, :, 2) *= dar(2); 141 vn(:,:,2) *= dar(2);
143 vn(:, :, 3) *= dar(3); 142 vn(:,:,3) *= dar(3);
144 143
145 ## normalize vn 144 ## Normalize vn.
146 vn = vn ./ repmat (sqrt (sumsq (vn, 3)), [1, 1, 3]); 145 vn = vn ./ repmat (sqrt (sumsq (vn, 3)), [1, 1, 3]);
147 [nr, nc] = size(get(tmp, "zdata")); 146 [nr, nc] = size(get(tmp, "zdata"));
148 147
149 ## ambient, diffuse, and specular term 148 ## Ambient, diffuse, and specular term.
150 cdata = r(1) * ones (nr, nc) \ 149 cdata = (r(1) * ones (nr, nc)
151 + r(2) * diffuse (vn(:, :, 1), vn(:, :, 2), vn(:, :, 3), lv) \ 150 + r(2) * diffuse (vn(:,:,1), vn(:,:,2), vn(:,:,3), lv)
152 + r(3) * specular (vn(:, :, 1), vn(:, :, 2), vn(:, :, 3), lv, vv, r(4)); 151 + r(3) * specular (vn(:,:,1), vn(:,:,2), vn(:,:,3), lv, vv, r(4)));
153 152
154 set (tmp, "cdata", cdata ./ sum (r(1:3))); 153 set (tmp, "cdata", cdata ./ sum (r(1:3)));
155 154
156 unwind_protect_cleanup 155 unwind_protect_cleanup
157 axes (oldh); 156 axes (oldh);