annotate scripts/plot/contourf.m @ 7215:dd88d61d443f

[project @ 2007-11-29 16:44:45 by jwe]
author jwe
date Thu, 29 Nov 2007 16:46:40 +0000
parents 2b5e6c0a9df9
children 5389a52df87b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
1 ## Copyright (C) 2007 Kai Habel
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
2 ## Copyright (C) 2003 Shai Ayal
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
3 ##
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
4 ## This file is part of Octave.
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
5 ##
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
7 ## under the terms of the GNU General Public License as published by
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
8 ## the Free Software Foundation; either version 3 of the License, or (at
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
9 ## your option) any later version.
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
10 ##
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
14 ## General Public License for more details.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
15 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
18 ## <http://www.gnu.org/licenses/>.
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
19
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
20 ## -*- texinfo -*-
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
21 ## @deftypefn {Function File} {[@var{c}, @var{h}] =} contourf (@var{x}, @var{y}, @var{z}, @var{lvl})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
22 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{x}, @var{y}, @var{z}, @var{n})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
23 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{x}, @var{y}, @var{z})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
24 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{z}, @var{n})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
25 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{z}, @var{lvl})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
26 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{z})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
27 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{ax}, @dots{})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
28 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@dots{}, @var{"property"}, @var{val})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
29 ## Compute and plot filled contours of the matrix @var{z}.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
30 ## Parameters @var{x}, @var{y} and @var{n} or @var{lvl} are optional.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
31 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
32 ## The return value @var{c} is a 2xn matrix containing the contour lines
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
33 ## as described in the help to the contourc function.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
34 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
35 ## The return value @var{h} is handle-vector to the patch objects creating
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
36 ## the filled contours.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
37 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
38 ## If @var{x} and @var{y} are ommited they are taken as the row/column
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
39 ## index of @var{z}. @var{n} is a scalar denoting the number of lines
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
40 ## to compute. Alternatively @var{lvl} is a vector containing the
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
41 ## contour levels. If only one value (e.g. lvl0) is wanted, set
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
42 ## @var{lvl} to [lvl0, lvl0]. If both @var{n} or @var{lvl} are omitted
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
43 ## a default value of 10 contour level is assumed.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
44 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
45 ## If provided, the filled contours are added to the axes object
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
46 ## @var{ax} instead of the current axis.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
47 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
48 ## The following example plots filled contours of the @code{peaks}
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
49 ## function.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
50 ## @example
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
51 ## [x, y, z] = peaks (50);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
52 ## contourf (x, y, z, -7:9)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
53 ## @end example
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
54 ## @seealso{contour, contourc, patch}
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
55 ## @end deftypefn
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
56
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
57 ## Author: Kai Habel <kai.habel@gmx.de>
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
58 ## Author: shaia
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
59
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
60 function varargout = contourf (varargin)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
61
7215
dd88d61d443f [project @ 2007-11-29 16:44:45 by jwe]
jwe
parents: 7164
diff changeset
62 [ax, varargin] = __plt_get_axis_arg__ ("contourf", varargin{:});
dd88d61d443f [project @ 2007-11-29 16:44:45 by jwe]
jwe
parents: 7164
diff changeset
63 [X, Y, Z, lvl, patch_props] = parse_args (varargin);
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
64 [nr, nc] = size (Z);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
65 [minx, maxx] = deal (min (X(:)), max (X(:)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
66 [miny, maxy] = deal (min (Y(:)), max (Y(:)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
67
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
68 if (diff (lvl) < 10*eps)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
69 lvl_eps = 1e-6;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
70 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
71 lvl_eps = min (diff (lvl)) / 1000.0;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
72 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
73
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
74 X0 = prepad(X, nc+1, 2 * X(1, 1) - X(1, 2), 2);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
75 X0 = postpad(X0, nc+2, 2 * X(1, nc) - X(1, nc - 1), 2);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
76 X0 = [X0(1, :); X0; X0(1, :)];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
77 Y0 = prepad(Y, nr+1, 2 * Y(1, 1) - Y(2, 1), 1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
78 Y0 = postpad(Y0, nr+2, 2 * Y(nr, 1) - Y(nr - 1, 1));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
79 Y0 = [Y0(:, 1), Y0, Y0(:, 1)];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
80
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
81 Z0 = -Inf(nr+2, nc+2);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
82 Z0(2:nr+1, 2:nc+1) = Z;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
83 [c, lev] = contourc (X0, Y0, Z0, lvl);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
84 cmap = colormap ();
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
85
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
86 levx = linspace (min (lev), max (lev), size (cmap, 1));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
87
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
88 newplot ();
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
89
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
90 ## Decode contourc output format.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
91 i1 = 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
92 ncont = 0;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
93 while (i1 < columns (c))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
94 ncont++;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
95 cont_lev(ncont) = c(1, i1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
96 cont_len(ncont) = c(2, i1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
97 cont_idx(ncont) = i1+1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
98
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
99 ii = i1+1:i1+cont_len(ncont);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
100 cur_cont = c(:, ii);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
101 c(:, ii);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
102 startidx = ii(1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
103 stopidx = ii(end);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
104 cont_area(ncont) = polyarea (c(1, ii), c(2, ii));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
105 i1 += c(2, i1) + 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
106 endwhile
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
107
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
108 ## Handle for each level the case where we have (a) hole(s) in a patch.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
109 ## Those are to be filled with the color of level below or with the
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
110 ## background colour.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
111 for k = 1:numel (lev)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
112 lvl_idx = find (abs (cont_lev - lev(k)) < lvl_eps);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
113 len = numel (lvl_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
114 if (len > 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
115 ## mark = logical(zeros(size(lvl_idx)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
116 mark = false (size (lvl_idx));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
117 a = 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
118 while (a < len)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
119 # take 1st patch
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
120 b = a + 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
121 pa_idx = lvl_idx(a);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
122 # get pointer to contour start, and contour length
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
123 curr_ct_idx = cont_idx(pa_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
124 curr_ct_len = cont_len(pa_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
125 # get contour
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
126 curr_ct = c(:, curr_ct_idx:curr_ct_idx+curr_ct_len-1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
127 b_vec = (a+1):len;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
128 next_ct_pt_vec = c(:, cont_idx(lvl_idx(b_vec)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
129 in = inpolygon (next_ct_pt_vec(1,:), next_ct_pt_vec(2,:),
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
130 curr_ct(1, :), curr_ct(2, :));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
131 mark(b_vec(in)) = !mark(b_vec(in));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
132 a++;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
133 endwhile
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
134 if (numel (mark) > 0)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
135 ## All marked contours describe a hole in a larger contour of
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
136 ## the same level and must be filled with colour of level below.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
137 ma_idx = lvl_idx(mark);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
138 if (k > 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
139 ## Find color of level below.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
140 tmp = find(abs(cont_lev - lev(k - 1)) < lvl_eps);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
141 lvl_bel_idx = tmp(1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
142 ## Set color of patches found.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
143 cont_lev(ma_idx) = cont_lev(lvl_bel_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
144 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
145 ## Set lowest level contour to NaN.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
146 cont_lev(ma_idx) = NaN;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
147 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
148 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
149 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
150 endfor
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
151
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
152 ## The algorithm can create patches with the size of the plotting
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
153 ## area, we would like to draw only the patch with the highest level.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
154 del_idx = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
155 max_idx = find (cont_area == max (cont_area));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
156 if (numel (max_idx) > 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
157 # delete double entries
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
158 del_idx = max_idx(1:end-1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
159 cont_area(del_idx) = cont_lev(del_idx) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
160 cont_len(del_idx) = cont_idx(del_idx) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
161 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
162
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
163 ## Now we have everything together and can start plotting the patches
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
164 ## beginning with largest area.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
165 [tmp, svec] = sort (cont_area);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
166 len = ncont - numel (del_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
167 h = zeros (1, len);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
168 for n = len:-1:1
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
169 idx = svec(n);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
170 ii = cont_idx(idx):cont_idx(idx) + cont_len(idx) - 2;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
171 h(n) = patch (c(1, ii), c(2, ii), cont_lev(idx), patch_props{:});
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
172 endfor
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
173
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
174 if (min (lev) == max (lev))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
175 set (gca (), "clim", [min(lev)-1, max(lev)+1]);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
176 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
177 set (gca(), "clim", [min(lev), max(lev)]);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
178 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
179
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
180 if (nargout > 0)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
181 varargout{2} = h;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
182 varargout{1} = c;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
183 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
184
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
185 endfunction
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
186
7215
dd88d61d443f [project @ 2007-11-29 16:44:45 by jwe]
jwe
parents: 7164
diff changeset
187 function [X, Y, Z, lvl, patch_props] = parse_args (arg)
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
188
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
189 patch_props = {};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
190 nolvl = false;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
191
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
192 for n = 1:numel (arg)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
193 if (ischar (arg{n}))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
194 patch_props = arg(n:end);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
195 arg(n:end) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
196 break;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
197 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
198 endfor
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
199
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
200 if (mod (numel (patch_props), 2) != 0)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
201 error ("patch: property value is missing");
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
202 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
203
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
204 if (numel (arg) < 3)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
205 Z = arg{1};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
206 [X, Y] = meshgrid (1:columns (Z), 1:rows (Z));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
207 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
208
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
209 if (numel (arg) == 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
210 nolvl = true;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
211 arg(1) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
212 elseif (numel (arg) == 2)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
213 lvl = arg{2};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
214 arg(1:2) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
215 elseif (numel (arg) == 3)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
216 arg{1:3};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
217 [X, Y, Z] = deal (arg{1:3});
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
218 arg(1:3) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
219 nolvl = true;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
220 elseif (numel (arg) == 4)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
221 [X, Y, Z, lvl] = deal (arg{1:4});
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
222 arg(1:4) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
223 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
224
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
225 if (any (size (X) != size (Y)))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
226 error ("patch: X and Y must be of same size")
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
227 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
228
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
229 if (isvector (X) || isvector (Y))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
230 [X, Y] = meshgrid (X, Y);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
231 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
232
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
233 Z_no_inf = Z(!isinf (Z));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
234 [minz, maxz] = deal (min (Z_no_inf(:)), max (Z_no_inf(:)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
235 Z(isnan (Z)) = -Inf;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
236
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
237 if (nolvl)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
238 lvl = linspace (minz, maxz, 12);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
239 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
240
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
241 if (isscalar (lvl))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
242 lvl = linspace (minz, maxz, lvl + 2)(1:end-1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
243 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
244 idx1 = find(lvl < minz);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
245 idx2 = find(lvl > maxz);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
246 lvl(idx1(1:end-1)) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
247 lvl(idx2) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
248 if (isempty (lvl))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
249 lvl = [minz, minz];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
250 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
251 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
252
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
253 endfunction