Mercurial > hg > octave-nkf
comparison scripts/plot/appearance/diffuse.m @ 18399:6c090b42068b
diffuse.m: Overhaul function.
* diffuse.m: Improve documentation string. Validate light vector input is a
vector. Use standard format for error() messages.
author | Rik <rik@octave.org> |
---|---|
date | Wed, 22 Jan 2014 15:34:20 -0800 |
parents | d63878346099 |
children | 4197fc428c7d |
comparison
equal
deleted
inserted
replaced
18370:c3f3fa5a5db5 | 18399:6c090b42068b |
---|---|
16 ## along with Octave; see the file COPYING. If not, see | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | 17 ## <http://www.gnu.org/licenses/>. |
18 | 18 |
19 ## -*- texinfo -*- | 19 ## -*- texinfo -*- |
20 ## @deftypefn {Function File} {} diffuse (@var{sx}, @var{sy}, @var{sz}, @var{lv}) | 20 ## @deftypefn {Function File} {} diffuse (@var{sx}, @var{sy}, @var{sz}, @var{lv}) |
21 ## Calculate diffuse reflection strength of a surface defined by the normal | 21 ## Calculate the diffuse reflection strength of a surface defined by the normal |
22 ## vector elements @var{sx}, @var{sy}, @var{sz}. | 22 ## vector elements @var{sx}, @var{sy}, @var{sz}. |
23 ## | 23 ## |
24 ## The light source location vector @var{lv} can be given as 2-element vector | 24 ## The light source location vector @var{lv} can be given as a 2-element vector |
25 ## [azimuth, elevation] in degrees or as 3-element vector [lx, ly, lz]. | 25 ## [azimuth, elevation] in degrees or as a 3-element vector [x, y, z]. |
26 ## @seealso{specular, surfl} | 26 ## @seealso{specular, surfl} |
27 ## @end deftypefn | 27 ## @end deftypefn |
28 | 28 |
29 ## Author: Kai Habel <kai.habel@gmx.de> | 29 ## Author: Kai Habel <kai.habel@gmx.de> |
30 | 30 |
32 | 32 |
33 if (nargin != 4) | 33 if (nargin != 4) |
34 print_usage (); | 34 print_usage (); |
35 endif | 35 endif |
36 | 36 |
37 ## check for normal vector | 37 ## Check normal vectors |
38 if (!size_equal (sx, sy, sz)) | 38 if (! size_equal (sx, sy, sz)) |
39 error ("diffuse: SX, SY, and SZ must have same size"); | 39 error ("diffuse: SX, SY, and SZ must be the same size"); |
40 endif | 40 endif |
41 | 41 |
42 ## check for light vector (lv) argument | 42 ## Check light vector (lv) argument |
43 if (length (lv) < 2 || length (lv) > 3) | 43 if (! isvector (lv) || length (lv) < 2 || length (lv) > 3) |
44 error ("diffuse: light vector LV must be a 2- or 3-element vector"); | 44 error ("diffuse: light vector LV must be a 2- or 3-element vector"); |
45 elseif (length (lv) == 2) | 45 elseif (length (lv) == 2) |
46 [lv(1), lv(2), lv(3)] = sph2cart (lv(1) * pi/180, lv(2) * pi/180, 1.0); | 46 [lv(1), lv(2), lv(3)] = sph2cart (lv(1) * pi/180, lv(2) * pi/180, 1.0); |
47 endif | 47 endif |
48 | 48 |
49 ## Normalize view and light vector. | 49 ## Normalize view and light vector. |
50 if (sum (abs (lv)) > 0) | 50 if (sum (abs (lv)) > 0) |
51 lv /= norm (lv); | 51 lv /= norm (lv); |
52 endif | 52 endif |
53 | 53 |
54 ns = sqrt (sx.^2 + sy.^2 + sz.^2); | 54 ns = sqrt (sx.^2 + sy.^2 + sz.^2); |
55 retval = (sx * lv(1) + sy * lv(2) + sz * lv(3)) ./ ns; | 55 retval = (sx * lv(1) + sy * lv(2) + sz * lv(3)) ./ ns; |
56 retval(retval < 0) = 0; | 56 retval(retval < 0) = 0; |