1 package org.newdawn.slick.geom;
2
3 import org.newdawn.slick.util.FastTrig;
4
5 import javax.annotation.Nonnull;
6
7
8
9
10
11
12 public class Transform {
13
14
15
16
17
18
19
20 private float matrixPosition[];
21
22
23
24
25
26 public Transform() {
27 matrixPosition = new float[]{1, 0, 0, 0, 1, 0, 0, 0, 1};
28 }
29
30
31
32
33
34
35 private Transform(@Nonnull Transform other) {
36 matrixPosition = new float[9];
37 System.arraycopy(other.matrixPosition, 0, matrixPosition, 0, 9);
38 }
39
40
41
42
43
44
45
46 public Transform(@Nonnull Transform t1, @Nonnull Transform t2) {
47 this(t1);
48 concatenate(t2);
49 }
50
51
52
53
54
55
56
57 public Transform(@Nonnull float matrixPosition[]) {
58 if(matrixPosition.length != 6) {
59 throw new RuntimeException("The parameter must be a float array of length 6.");
60 }
61 this.matrixPosition = new float[]{matrixPosition[0], matrixPosition[1], matrixPosition[2],
62 matrixPosition[3], matrixPosition[4], matrixPosition[5],
63 0, 0, 1};
64 }
65
66
67
68
69
70
71
72
73
74
75
76 private Transform(float point00, float point01, float point02, float point10, float point11, float point12) {
77 matrixPosition = new float[]{point00, point01, point02, point10, point11, point12, 0, 0, 1};
78 }
79
80
81
82
83
84
85
86
87
88
89
90
91
92 public void transform(float source[], int sourceOffset, float destination[], int destOffset, int numberOfPoints) {
93
94 float result[] = source == destination ? new float[numberOfPoints * 2] : destination;
95
96 for(int i=0;i<numberOfPoints * 2;i+=2) {
97 for(int j=0;j<6;j+=3) {
98 result[i + (j / 3)] = source[i + sourceOffset] * matrixPosition[j] + source[i + sourceOffset + 1] * matrixPosition[j + 1] + 1 * matrixPosition[j + 2];
99 }
100 }
101
102 if (source == destination) {
103
104 for(int i=0;i<numberOfPoints * 2;i+=2) {
105 destination[i + destOffset] = result[i];
106 destination[i + destOffset + 1] = result[i + 1];
107 }
108 }
109 }
110
111
112
113
114
115
116
117 @Nonnull
118 Transform concatenate(@Nonnull Transform tx) {
119 float[] mp = new float[9];
120 float n00 = matrixPosition[0] * tx.matrixPosition[0] + matrixPosition[1] * tx.matrixPosition[3];
121 float n01 = matrixPosition[0] * tx.matrixPosition[1] + matrixPosition[1] * tx.matrixPosition[4];
122 float n02 = matrixPosition[0] * tx.matrixPosition[2] + matrixPosition[1] * tx.matrixPosition[5] + matrixPosition[2];
123 float n10 = matrixPosition[3] * tx.matrixPosition[0] + matrixPosition[4] * tx.matrixPosition[3];
124 float n11 = matrixPosition[3] * tx.matrixPosition[1] + matrixPosition[4] * tx.matrixPosition[4];
125 float n12 = matrixPosition[3] * tx.matrixPosition[2] + matrixPosition[4] * tx.matrixPosition[5] + matrixPosition[5];
126 mp[0] = n00;
127 mp[1] = n01;
128 mp[2] = n02;
129 mp[3] = n10;
130 mp[4] = n11;
131 mp[5] = n12;
132
133
134
135
136
137
138
139
140 matrixPosition = mp;
141 return this;
142 }
143
144
145
146
147
148
149
150 @Nonnull
151 public String toString() {
152 String result = "Transform[[" + matrixPosition[0] + "," + matrixPosition[1] + "," + matrixPosition[2] +
153 "][" + matrixPosition[3] + "," + matrixPosition[4] + "," + matrixPosition[5] +
154 "][" + matrixPosition[6] + "," + matrixPosition[7] + "," + matrixPosition[8] + "]]";
155
156 return result;
157 }
158
159
160
161
162
163
164 public float[] getMatrixPosition() {
165 return matrixPosition;
166 }
167
168
169
170
171
172
173
174 @Nonnull
175 private static Transform createRotateTransform(float angle) {
176 return new Transform((float)FastTrig.cos(angle), -(float)FastTrig.sin(angle), 0, (float)FastTrig.sin(angle), (float)FastTrig.cos(angle), 0);
177 }
178
179
180
181
182
183
184
185
186
187 @Nonnull
188 public static Transform createRotateTransform(float angle, float x, float y) {
189 Transform temp = Transform.createRotateTransform(angle);
190 float sinAngle = temp.matrixPosition[3];
191 float oneMinusCosAngle = 1.0f - temp.matrixPosition[4];
192 temp.matrixPosition[2] = x * oneMinusCosAngle + y * sinAngle;
193 temp.matrixPosition[5] = y * oneMinusCosAngle - x * sinAngle;
194
195 return temp;
196 }
197
198
199
200
201
202
203
204
205 @Nonnull
206 public static Transform createTranslateTransform(float xOffset, float yOffset) {
207 return new Transform(1, 0, xOffset, 0, 1, yOffset);
208 }
209
210
211
212
213
214
215
216
217 @Nonnull
218 public static Transform createScaleTransform(float xScale, float yScale) {
219 return new Transform(xScale, 0, 0, 0, yScale, 0);
220 }
221
222
223
224
225
226
227
228 @Nonnull
229 public Vector2f transform(@Nonnull Vector2f pt) {
230 float[] in = new float[] {pt.x, pt.y};
231 float[] out = new float[2];
232
233 transform(in, 0, out, 0, 1);
234
235 return new Vector2f(out[0], out[1]);
236 }
237 }