annotate client/digitallibrary/jquery/dlGeometry.js @ 629:6b24ad042d7b jquery

last and next page works now implemented redisplay function (only tested with fullscreen) parameters that are changed need to be in data.queryParams to get in the url on redisplay
author robcast
date Tue, 18 Jan 2011 21:30:03 +0100
parents b930fa64c684
children a2aadf44a454 8f76bd79648e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
599
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
1 /* digilib geometry classes
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
2 * should be integrated into jquery.digilib.js
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
3 */
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
4
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
5 var dlGeometry = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
6 /*
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
7 * Size class
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
8 */
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
9 var size = function (w, h) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
10 var that = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
11 width : parseFloat(w),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
12 height : parseFloat(h)
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
13 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
14 that.equals = function(other) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
15 return (this.width === other.width && this.height === other.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
16 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
17 that.toString = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
18 return (this.width + "x" + this.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
19 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
20 return that;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
21 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
22
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
23 /*
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
24 * Position class
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
25 */
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
26 var position = function (x, y) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
27 var that = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
28 x : parseFloat(x),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
29 y : parseFloat(y)
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
30 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
31 that.equals = function(other) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
32 return (this.x === other.x && this.y === other.y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
33 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
34 that.toString = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
35 return (this.x + "," + this.y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
36 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
37 return that;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
38 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
39 /*
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
40 * Rectangle class
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
41 */
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
42 var rectangle = function (x, y, w, h) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
43 var that = {};
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
44 if (typeof x === "object") {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
45 // assume x and y are Position
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
46 that = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
47 x : x.x,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
48 y : x.y,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
49 width : y.x - x.x,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
50 height : y.y - x.y
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
51 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
52 } else {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
53 that = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
54 x : parseFloat(x),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
55 y : parseFloat(y),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
56 width : parseFloat(w),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
57 height : parseFloat(h)
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
58 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
59 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
60 // returns a copy of this Rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
61 that.copy = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
62 return rectangle(this.x, this.y, this.width, this.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
63 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
64 // returns the position of this Rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
65 that.getPosition = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
66 return position(this.x, this.y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
67 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
68 // returns the upper left corner position
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
69 that.getPt1 = that.getPosition;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
70 // returns the lower right corner position of this Rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
71 that.getPt2 = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
72 return position(this.x + this.width, this.y + this.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
73 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
74 // sets the upper left corner to position pos
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
75 that.setPt1 = function(pos) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
76 this.x = pos.x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
77 this.y = pos.y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
78 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
79 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
80 that.setPt2 = function(pos) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
81 // sets the lower right corner to position pos
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
82 this.width = pos.x - this.x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
83 this.height = pos.y - this.y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
84 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
85 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
86 that.getCenter = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
87 // returns the center position of this Rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
88 return position(this.x + this.width / 2, this.y + this.height / 2);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
89 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
90 that.setCenter = function(pos) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
91 // moves this Rectangle's center to position pos
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
92 this.x = pos.x - this.width / 2;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
93 this.y = pos.y - this.height / 2;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
94 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
95 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
96 that.getSize = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
97 // returns the size of this Rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
98 return size(this.width, this.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
99 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
100 that.equals = function(other) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
101 // equal props
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
102 var eq = (this.x === other.x && this.y === other.y &&
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
103 this.width === other.width);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
104 return eq;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
105 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
106 that.getArea = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
107 // returns the area of this Rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
108 return (this.width * this.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
109 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
110 that.normalize = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
111 // eliminates negative width and height
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
112 var p = this.getPt2();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
113 this.x = Math.min(this.x, p.x);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
114 this.y = Math.min(this.y, p.y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
115 this.width = Math.abs(this.width);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
116 this.height = Math.abs(this.height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
117 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
118 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
119 that.containsPosition = function(pos) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
120 // returns if Position "pos" lies inside of this rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
121 var ct = ((pos.x >= this.x) && (pos.y >= this.y) &&
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
122 (pos.x <= this.x + this.width) && (pos.y <= this.y + this.width));
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
123 return ct;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
124 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
125 that.containsRect = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
126 // returns if rectangle "rect" is contained in this rectangle
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
127 return (this.containsPosition(rect.getPt1()) && this.containsPosition(rect.getPt2()));
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
128 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
129 that.stayInside = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
130 // changes this rectangle's x/y values so it stays inside of rectangle rect
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
131 // keeping the proportions
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
132 if (this.x < rect.x) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
133 this.x = rect.x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
134 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
135 if (this.y < rect.y) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
136 this.y = rect.y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
137 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
138 if (this.x + this.width > rect.x + rect.width) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
139 this.x = rect.x + rect.width - this.width;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
140 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
141 if (this.y + this.height > rect.y + rect.height) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
142 this.y = rect.y + rect.height - this.height;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
143 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
144 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
145 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
146 that.clipTo = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
147 // clips this rectangle so it stays inside of rectangle rect
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
148 var p1 = rect.getPt1();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
149 var p2 = rect.getPt2();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
150 var this2 = this.getPt2();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
151 this.setPt1(position(Math.max(this.x, p1.x), Math.max(this.y, p1.y)));
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
152 this.setPt2(position(Math.min(this2.x, p2.x), Math.min(this2.y, p2.y)));
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
153 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
154 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
155 that.intersect = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
156 // returns the intersection of the given Rectangle and this one
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
157 // FIX ME: not really, it should return null if there is no overlap
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
158 var sec = rect.copy();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
159 if (sec.x < this.x) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
160 sec.width = sec.width - (this.x - sec.x);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
161 sec.x = this.x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
162 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
163 if (sec.y < this.y) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
164 sec.height = sec.height - (this.y - sec.y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
165 sec.y = this.y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
166 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
167 if (sec.x + sec.width > this.x + this.width) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
168 sec.width = (this.x + this.width) - sec.x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
169 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
170 if (sec.y + sec.height > this.y + this.height) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
171 sec.height = (this.y + this.height) - sec.y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
172 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
173 return sec;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
174 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
175 that.fit = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
176 // returns a Rectangle that fits into this one (by moving first)
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
177 var sec = rect.copy();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
178 sec.x = Math.max(sec.x, this.x);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
179 sec.y = Math.max(sec.y, this.x);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
180 if (sec.x + sec.width > this.x + this.width) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
181 sec.x = this.x + this.width - sec.width;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
182 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
183 if (sec.y + sec.height > this.y + this.height) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
184 sec.y = this.y + this.height - sec.height;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
185 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
186 return sec.intersect(this);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
187 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
188 that.toString = function() {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
189 return this.width+"x"+this.height+"@"+this.x+","+this.y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
190 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
191 return that;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
192 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
193
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
194 /*
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
195 * Transform class
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
196 *
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
197 * defines a class of affine transformations
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
198 */
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
199 var transform = function (spec) {
620
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
200 var that = jQuery.extend({
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
201 m00 : 1.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
202 m01 : 0.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
203 m02 : 0.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
204 m10 : 0.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
205 m11 : 1.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
206 m20 : 0.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
207 m12 : 0.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
208 m21 : 0.0,
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
209 m22 : 1.0
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
210 }, spec);
599
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
211 that.concat = function(traf) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
212 // add Transform traf to this Transform
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
213 for (var i = 0; i < 3; i++) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
214 for (var j = 0; j < 3; j++) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
215 var c = 0.0;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
216 for (var k = 0; k < 3; k++) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
217 c += traf["m"+i+k] * this["m"+k+j];
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
218 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
219 this["m"+i+j] = c;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
220 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
221 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
222 return this;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
223 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
224 that.transform = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
225 // returns transformed Rectangle or Position with this Transform applied
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
226 var x = this.m00 * rect.x + this.m01 * rect.y + this.m02;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
227 var y = this.m10 * rect.x + this.m11 * rect.y + this.m12;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
228 if (rect.width) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
229 // transform the other corner points
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
230 var pt2 = rect.getPt2();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
231 var x2 = this.m00 * pt2.x + this.m01 * pt2.y + this.m02;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
232 var y2 = this.m10 * pt2.x + this.m11 * pt2.y + this.m12;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
233 var width = x2 - x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
234 var height = y2 - y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
235 return rectangle(x, y, width, height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
236 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
237 return position(x, y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
238 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
239 that.invtransform = function(rect) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
240 // returns transformed Rectangle or Position with the inverse of this Transform applied
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
241 var det = this.m00 * this.m11 - this.m01 * this.m10;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
242 var x = (this.m11 * rect.x - this.m01 * rect.y - this.m11 * this.m02 + this.m01 * this.m12) / det;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
243 var y = (- this.m10 * rect.x + this.m00 * rect.y + this.m10 * this.m02 - this.m00 * this.m12) / det;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
244 if (rect.width) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
245 // transform the other corner points
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
246 var pt2 = rect.getPt2();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
247 var x2 = (this.m11 * pt2.x - this.m01 * pt2.y - this.m11 * this.m02 + this.m01 * this.m12) / det;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
248 var y2 = (- this.m10 * pt2.x + this.m00 * pt2.y + this.m10 * this.m02 - this.m00 * this.m12) / det;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
249 var width = x2 - x;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
250 var height = y2 - y;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
251 return rectangle(x, y, width, height);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
252 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
253 return position(x, y);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
254 };
620
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
255 that.getRotation = transform.getRotation;
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
256 that.getTranslation = transform.getTranslation;
b930fa64c684 scalerImgLoaded sets up img trafo
robcast
parents: 599
diff changeset
257 that.getScale = transform.getScale;
599
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
258
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
259 return that;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
260 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
261
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
262 transform.getRotation = function (angle, pos) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
263 // returns a Transform that is a rotation by angle degrees around [pos.x, pos.y]
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
264 if (angle !== 0) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
265 var t = 2.0 * Math.PI * parseFloat(angle) / 360.0;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
266 var traf = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
267 m00 : Math.cos(t),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
268 m01 : - Math.sin(t),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
269 m10 : Math.sin(t),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
270 m11 : Math.cos(t),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
271 m02 : pos.x - pos.x * Math.cos(t) + pos.y * Math.sin(t),
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
272 m12 : pos.y - pos.x * Math.sin(t) - pos.y * Math.cos(t)
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
273 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
274 return transform(traf);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
275 }
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
276 return transform();
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
277 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
278
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
279 transform.getTranslation = function (pos) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
280 // returns a Transform that is a translation by [pos.x, pos,y]
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
281 var traf = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
282 m02 : pos.x,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
283 m12 : pos.y
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
284 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
285 return transform(traf);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
286 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
287
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
288 transform.getScale = function (size) {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
289 // returns a Transform that is a scale by [size.width, size.height]
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
290 var traf = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
291 m00 : size.width,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
292 m11 : size.height
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
293 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
294 return transform(traf);
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
295 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
296
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
297 // export functions
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
298 var that = {
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
299 size : size,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
300 position : position,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
301 rectangle : rectangle,
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
302 transform : transform
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
303 };
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
304
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
305 return that;
0d6fa11f7f98 geometry classes as extra file
robcast
parents:
diff changeset
306 };