annotate scripts/plot/util/hgtransform.m @ 33669:96f077c60226 default tip @

maint: Merge stable to default.
author Markus Mützel <markus.muetzel@gmx.de>
date Wed, 19 Jun 2024 16:41:55 +0200
parents 2e484f9f1f18
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ########################################################################
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 ##
32632
2e484f9f1f18 maint: update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
3 ## Copyright (C) 2017-2024 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27106
diff changeset
4 ##
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
7 ##
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
8 ## This file is part of Octave.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
9 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23565
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
11 ## under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23565
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
13 ## (at your option) any later version.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
14 ##
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
18 ## GNU General Public License for more details.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
19 ##
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
20 ## You should have received a copy of the GNU General Public License
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23565
diff changeset
22 ## <https://www.gnu.org/licenses/>.
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 ##
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ########################################################################
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
25
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
26 ## -*- texinfo -*-
23565
3a730821e4a2 doc: Peridoc grammarcheck of documentation.
Rik <rik@octave.org>
parents: 23266
diff changeset
27 ## @deftypefn {} {@var{h} =} hgtransform ()
3a730821e4a2 doc: Peridoc grammarcheck of documentation.
Rik <rik@octave.org>
parents: 23266
diff changeset
28 ## @deftypefnx {} {@var{h} =} hgtransform (@var{property}, @var{value}, @dots{})
3a730821e4a2 doc: Peridoc grammarcheck of documentation.
Rik <rik@octave.org>
parents: 23266
diff changeset
29 ## @deftypefnx {} {@var{h} =} hgtransform (@var{hax}, @dots{})
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
30 ##
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
31 ## Create a graphics transform object.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
32 ##
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
33 ## FIXME: Need to write documentation.
28713
28d2511f2af2 maint: grammarcheck documentation ahead of 6.1 release.
Rik <rik@octave.org>
parents: 27923
diff changeset
34 ## FIXME: Add <makehgtform> to seealso list when it is implemented.
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
35 ## @seealso{hggroup}
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
36 ## @end deftypefn
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
37
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
38 ## FIXME: hgtransform should be a C++ graphics object, not an m-file.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
39 ## For the moment (3/7/17), it is quicker to implement something in
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
40 ## an m-file. But, this approach requires double the memory (original
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
41 ## and transformed data), and a system of listeners and callbacks.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
42 ## In OpenGL toolkits it should be possible to simply insert a transform
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
43 ## somewhere in gl-render.cc to have this done on the fly.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
44
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
45 function h = hgtransform (varargin)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
46
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
47 [hax, varargin] = __plt_get_axis_arg__ ("hgtransform", varargin{:});
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
48
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
49 if (isempty (hax))
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
50 hax = gca ();
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
51 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
52
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
53 htmp = hggroup (hax);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
54
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
55 addproperty ("matrix", htmp, "data", eye (4));
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
56 addproperty ("__orig_data__", htmp, "any", struct ("h", {}));
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
57 if (! isempty (varargin))
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
58 set (htmp, varargin{:});
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
59 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
60 addlistener (htmp, "matrix", @matrix_cb);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
61 addlistener (htmp, "children", @children_cb);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
62
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
63 if (nargout > 0)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
64 h = htmp;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
65 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
66
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
67 endfunction
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
68
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
69 function matrix_cb (hgt, ~)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
70
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
71 M = get (hgt, "matrix");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
72 ## FIXME: Need better input validation on transform matrix M.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
73 ## Disallow shear, perspective transforms.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
74 if (! isreal (M) || ! ismatrix (M) || rows (M) != 4 || columns (M) != 4)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
75 error ("hgtransform: transform must be 4x4 real matrix");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
76 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
77
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
78 hkids = get (hgt, "children");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
79 xform_data (hgt, hkids);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
80
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
81 endfunction
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
82
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
83 function xform_data (hgt, hlist)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
84
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
85 M = get (hgt, "matrix");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
86 orig_data = get (hgt, "__orig_data__");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
87
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
88 for hk = hlist.'
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
89
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
90 ## FIXME: Add support for light and rectangle objects
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
91 type = get (hk, "type");
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
92 if (! any (strcmp (type, {"line", "patch", "surface", "image", "text"})))
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
93 continue; # Unsupported type. Silently skip.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
94 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
95
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
96 idx = find (hk == [orig_data.h]);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
97 if (! idx)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
98 warning ("hgtransform: original data not found for %f", hk);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
99 continue;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
100 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
101
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
102 if (strcmp (type, "text"))
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
103 pos = orig_data(idx).position;
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
104 xd = pos(1);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
105 yd = pos(2);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
106 zd = pos(3);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
107 else
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
108 ## FIXME: Rotations for "image" objects are not handled correctly.
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
109 xd = double (orig_data(idx).xdata);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
110 xsz = size (xd);
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
111
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
112 yd = double (orig_data(idx).ydata);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
113 ysz = size (yd);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
114
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
115 if (strcmp (type, "image"))
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
116 zd = [];
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
117 else
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
118 zd = double (orig_data(idx).zdata);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
119 zsz = size (zd);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
120 endif
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
121 z_empty = isempty (zd);
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
122
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
123 if (z_empty)
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
124 ## Common case of 2-D data.
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
125 zd = zeros (numel (xd), 1);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
126 elseif (isvector (xd) && isvector (yd))
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
127 ## Handle surface data which may be a vector/matrix combination
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
128 if (isvector (zd))
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
129 ## Do nothing. All data will be forced to row vectors below
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
130 elseif (length (xd) == rows (zd) && length (yd) == columns (zd))
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
131 [xd, yd] = meshgrid (xd, yd);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
132 xsz = size (xd);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
133 ysz = size (yd);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
134 endif
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
135 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
136
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
137 ## Force row vectors for later concatenation
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
138 xd = xd(:).';
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
139 yd = yd(:).';
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
140 zd = zd(:).';
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
141
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
142 endif
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
143
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
144 ## FIXME: To minimize memory, better to construct data matrix in-place?
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
145 data = [xd; yd; zd; ones(1, columns(xd))];
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
146 tol = 2 * max (eps (data(1:3,:)));
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
147 data = M * data;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
148 ## Need to trim or rotations which produce values near 0 will be strange.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
149 data(abs (data) < tol) = 0;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
150
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
151 if (strcmp (type, "text"))
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
152 set (hk, "position", [data(1), data(2), data(3)]);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
153 else
27106
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
154 set (hk, "xdata", reshape (data(1,:), xsz),
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
155 "ydata", reshape (data(2,:), ysz));
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
156 if (! z_empty)
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
157 set (hk, "zdata", reshape (data(3,:), zsz));
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
158 endif
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
159 endif
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
160
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
161 endfor
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
162
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
163 endfunction
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
164
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
165 function children_cb (hgt, ~)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
166
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
167 hkids = get (hgt, "children");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
168 orig_data = get (hgt, "__orig_data__");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
169 hlist = [orig_data.h];
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
170
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
171 ## Delete any children that have been removed
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
172 hdel = setdiff (hlist, hkids);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
173 if (! isempty (hdel))
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
174 for hk = hdel.'
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
175 idx = find (hk == hlist);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
176 if (ishghandle (hk))
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
177 ## child was re-parented to something else, restore data
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
178 switch (get (hk, "type"))
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
179
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
180 case {"line", "patch", "surface"}
27106
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
181 set (hk, "xdata", orig_data(idx).xdata,
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
182 "ydata", orig_data(idx).ydata,
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
183 "zdata", orig_data(idx).zdata);
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
184
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
185 case "image"
27106
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
186 set (hk, "xdata", orig_data(idx).xdata,
6bfd3a890185 Consolidate separate calls to set() in to one call for interpreter efficiency.
Rik <rik@octave.org>
parents: 26376
diff changeset
187 "ydata", orig_data(idx).ydata);
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
188
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
189 case "text"
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
190 set (hk, "position", orig_data(idx).position);
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
191
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
192 otherwise
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
193 ## Unsupported type. No data was saved.
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
194
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
195 endswitch
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
196 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
197 endfor
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
198 orig_data = orig_data(hlist != hdel);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
199 hlist = hlist(hlist != hdel);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
200 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
201
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
202 ## Add new children
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
203 hnew = setdiff (hkids, hlist);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
204 for hk = hnew.'
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
205
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
206 orig_data(end+1).h = hk;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
207 type = get (hk, "type");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
208 orig_data(end).type = type;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
209
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
210 switch (type)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
211
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
212 case {"line", "patch", "surface"}
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
213 orig_data(end).xdata = get (hk, "xdata");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
214 orig_data(end).ydata = get (hk, "ydata");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
215 orig_data(end).zdata = get (hk, "zdata");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
216
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
217 case "image"
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
218 orig_data(end).xdata = get (hk, "xdata");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
219 orig_data(end).ydata = get (hk, "ydata");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
220
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
221 case "text"
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
222 orig_data(end).position = get (hk, "position");
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
223
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
224 case "light"
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
225 warning ("hgtransform: %s objects are not yet supported", type);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
226
26267
298c30063b2f hgtransform.m: Add support for text objects (bug #50466).
Rik <rik@octave.org>
parents: 25054
diff changeset
227 case "hggroup"
23266
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
228 try
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
229 get (hk, "curvature");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
230 is_rectangle = true;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
231 catch
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
232 is_rectangle = false;
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
233 end_try_catch
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
234 if (is_rectangle)
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
235 warning ("hgtransform: rectangle objects are not yet supported");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
236 else
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
237 error ("hgtransform: hggroup cannot be a child of an hgtransform");
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
238 endif
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
239
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
240 otherwise
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
241 error ("hgtransform: %s cannot be a child of an hgtransform", type);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
242
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
243 endswitch
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
244
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
245 endfor
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
246
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
247 set (hgt, "__orig_data__", orig_data);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
248
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
249 ## Update data of new children only
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
250 xform_data (hgt, hnew);
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
251
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
252 endfunction
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
253
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
254
a470f7fee1cf hgtransform.m: Add partial support for image object type.
Rik <rik@octave.org>
parents: 23255
diff changeset
255 ## Need BIST tests here