1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the test suite of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
21 | ** included in the packaging of this file. Please review the following |
22 | ** information to ensure the GNU General Public License requirements will |
23 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
24 | ** |
25 | ** $QT_END_LICENSE$ |
26 | ** |
27 | ****************************************************************************/ |
28 | |
29 | #include <QtTest/QtTest> |
30 | #include <QtCore/qmath.h> |
31 | #include <QtGui/qvector2d.h> |
32 | #include <QtGui/qvector3d.h> |
33 | #include <QtGui/qvector4d.h> |
34 | #include <QtGui/qmatrix4x4.h> |
35 | |
36 | class tst_QVectorND : public QObject |
37 | { |
38 | Q_OBJECT |
39 | public: |
40 | tst_QVectorND() {} |
41 | ~tst_QVectorND() {} |
42 | |
43 | private slots: |
44 | void create2(); |
45 | void create3(); |
46 | void create4(); |
47 | |
48 | void modify2(); |
49 | void modify3(); |
50 | void modify4(); |
51 | |
52 | void length2_data(); |
53 | void length2(); |
54 | void length3_data(); |
55 | void length3(); |
56 | void length4_data(); |
57 | void length4(); |
58 | |
59 | void normalized2_data(); |
60 | void normalized2(); |
61 | void normalized3_data(); |
62 | void normalized3(); |
63 | void normalized4_data(); |
64 | void normalized4(); |
65 | |
66 | void normalize2_data(); |
67 | void normalize2(); |
68 | void normalize3_data(); |
69 | void normalize3(); |
70 | void normalize4_data(); |
71 | void normalize4(); |
72 | |
73 | void compare2(); |
74 | void compare3(); |
75 | void compare4(); |
76 | |
77 | void add2_data(); |
78 | void add2(); |
79 | void add3_data(); |
80 | void add3(); |
81 | void add4_data(); |
82 | void add4(); |
83 | |
84 | void subtract2_data(); |
85 | void subtract2(); |
86 | void subtract3_data(); |
87 | void subtract3(); |
88 | void subtract4_data(); |
89 | void subtract4(); |
90 | |
91 | void multiply2_data(); |
92 | void multiply2(); |
93 | void multiply3_data(); |
94 | void multiply3(); |
95 | void multiply4_data(); |
96 | void multiply4(); |
97 | |
98 | void multiplyFactor2_data(); |
99 | void multiplyFactor2(); |
100 | void multiplyFactor3_data(); |
101 | void multiplyFactor3(); |
102 | void multiplyFactor4_data(); |
103 | void multiplyFactor4(); |
104 | |
105 | void divide2_data(); |
106 | void divide2(); |
107 | void divide3_data(); |
108 | void divide3(); |
109 | void divide4_data(); |
110 | void divide4(); |
111 | |
112 | void divideFactor2_data(); |
113 | void divideFactor2(); |
114 | void divideFactor3_data(); |
115 | void divideFactor3(); |
116 | void divideFactor4_data(); |
117 | void divideFactor4(); |
118 | |
119 | void negate2_data(); |
120 | void negate2(); |
121 | void negate3_data(); |
122 | void negate3(); |
123 | void negate4_data(); |
124 | void negate4(); |
125 | |
126 | void crossProduct_data(); |
127 | void crossProduct(); |
128 | void normal_data(); |
129 | void normal(); |
130 | void distanceToPoint2_data(); |
131 | void distanceToPoint2(); |
132 | void distanceToPoint3_data(); |
133 | void distanceToPoint3(); |
134 | void distanceToPlane_data(); |
135 | void distanceToPlane(); |
136 | void distanceToLine2_data(); |
137 | void distanceToLine2(); |
138 | void distanceToLine3_data(); |
139 | void distanceToLine3(); |
140 | |
141 | void dotProduct2_data(); |
142 | void dotProduct2(); |
143 | void dotProduct3_data(); |
144 | void dotProduct3(); |
145 | void dotProduct4_data(); |
146 | void dotProduct4(); |
147 | |
148 | void project_data(); |
149 | void project(); |
150 | void unproject_data(); |
151 | void unproject(); |
152 | |
153 | void properties(); |
154 | void metaTypes(); |
155 | }; |
156 | |
157 | // Test the creation of QVector2D objects in various ways: |
158 | // construct, copy, and modify. |
159 | void tst_QVectorND::create2() |
160 | { |
161 | QVector2D null; |
162 | QCOMPARE(null.x(), 0.0f); |
163 | QCOMPARE(null.y(), 0.0f); |
164 | QVERIFY(null.isNull()); |
165 | |
166 | QVector2D nullNegativeZero(-0.0f, -0.0f); |
167 | QCOMPARE(nullNegativeZero.x(), -0.0f); |
168 | QCOMPARE(nullNegativeZero.y(), -0.0f); |
169 | QVERIFY(nullNegativeZero.isNull()); |
170 | |
171 | QVector2D v1(1.0f, 2.5f); |
172 | QCOMPARE(v1.x(), 1.0f); |
173 | QCOMPARE(v1.y(), 2.5f); |
174 | QVERIFY(!v1.isNull()); |
175 | |
176 | QVector2D v1i(1, 2); |
177 | QCOMPARE(v1i.x(), 1.0f); |
178 | QCOMPARE(v1i.y(), 2.0f); |
179 | QVERIFY(!v1i.isNull()); |
180 | |
181 | QVector2D v2(v1); |
182 | QCOMPARE(v2.x(), 1.0f); |
183 | QCOMPARE(v2.y(), 2.5f); |
184 | QVERIFY(!v2.isNull()); |
185 | |
186 | QVector2D v4; |
187 | QCOMPARE(v4.x(), 0.0f); |
188 | QCOMPARE(v4.y(), 0.0f); |
189 | QVERIFY(v4.isNull()); |
190 | v4 = v1; |
191 | QCOMPARE(v4.x(), 1.0f); |
192 | QCOMPARE(v4.y(), 2.5f); |
193 | QVERIFY(!v4.isNull()); |
194 | |
195 | QVector2D v5(QPoint(1, 2)); |
196 | QCOMPARE(v5.x(), 1.0f); |
197 | QCOMPARE(v5.y(), 2.0f); |
198 | QVERIFY(!v5.isNull()); |
199 | |
200 | QVector2D v6(QPointF(1, 2.5)); |
201 | QCOMPARE(v6.x(), 1.0f); |
202 | QCOMPARE(v6.y(), 2.5f); |
203 | QVERIFY(!v6.isNull()); |
204 | |
205 | QVector2D v7(QVector3D(1.0f, 2.5f, 54.25f)); |
206 | QCOMPARE(v7.x(), 1.0f); |
207 | QCOMPARE(v7.y(), 2.5f); |
208 | QVERIFY(!v6.isNull()); |
209 | |
210 | QVector2D v8(QVector4D(1.0f, 2.5f, 54.25f, 34.0f)); |
211 | QCOMPARE(v8.x(), 1.0f); |
212 | QCOMPARE(v8.y(), 2.5f); |
213 | QVERIFY(!v6.isNull()); |
214 | |
215 | v1.setX(3.0f); |
216 | QCOMPARE(v1.x(), 3.0f); |
217 | QCOMPARE(v1.y(), 2.5f); |
218 | QVERIFY(!v1.isNull()); |
219 | |
220 | v1.setY(10.5f); |
221 | QCOMPARE(v1.x(), 3.0f); |
222 | QCOMPARE(v1.y(), 10.5f); |
223 | QVERIFY(!v1.isNull()); |
224 | |
225 | v1.setX(0.0f); |
226 | v1.setY(0.0f); |
227 | QCOMPARE(v1.x(), 0.0f); |
228 | QCOMPARE(v1.y(), 0.0f); |
229 | QVERIFY(v1.isNull()); |
230 | |
231 | QPoint p1 = v8.toPoint(); |
232 | QCOMPARE(p1.x(), 1); |
233 | QCOMPARE(p1.y(), 3); |
234 | |
235 | QPointF p2 = v8.toPointF(); |
236 | QCOMPARE(p2.x(), 1.0f); |
237 | QCOMPARE(p2.y(), 2.5f); |
238 | |
239 | QVector3D v9 = v8.toVector3D(); |
240 | QCOMPARE(v9.x(), 1.0f); |
241 | QCOMPARE(v9.y(), 2.5f); |
242 | QCOMPARE(v9.z(), 0.0f); |
243 | |
244 | QVector4D v10 = v8.toVector4D(); |
245 | QCOMPARE(v10.x(), 1.0f); |
246 | QCOMPARE(v10.y(), 2.5f); |
247 | QCOMPARE(v10.z(), 0.0f); |
248 | QCOMPARE(v10.w(), 0.0f); |
249 | } |
250 | |
251 | // Test the creation of QVector3D objects in various ways: |
252 | // construct, copy, and modify. |
253 | void tst_QVectorND::create3() |
254 | { |
255 | QVector3D null; |
256 | QCOMPARE(null.x(), 0.0f); |
257 | QCOMPARE(null.y(), 0.0f); |
258 | QCOMPARE(null.z(), 0.0f); |
259 | QVERIFY(null.isNull()); |
260 | |
261 | QVector3D nullNegativeZero(-0.0f, -0.0f, -0.0f); |
262 | QCOMPARE(nullNegativeZero.x(), -0.0f); |
263 | QCOMPARE(nullNegativeZero.y(), -0.0f); |
264 | QCOMPARE(nullNegativeZero.z(), -0.0f); |
265 | QVERIFY(nullNegativeZero.isNull()); |
266 | |
267 | QVector3D v1(1.0f, 2.5f, -89.25f); |
268 | QCOMPARE(v1.x(), 1.0f); |
269 | QCOMPARE(v1.y(), 2.5f); |
270 | QCOMPARE(v1.z(), -89.25f); |
271 | QVERIFY(!v1.isNull()); |
272 | |
273 | QVector3D v1i(1, 2, -89); |
274 | QCOMPARE(v1i.x(), 1.0f); |
275 | QCOMPARE(v1i.y(), 2.0f); |
276 | QCOMPARE(v1i.z(), -89.0f); |
277 | QVERIFY(!v1i.isNull()); |
278 | |
279 | QVector3D v2(v1); |
280 | QCOMPARE(v2.x(), 1.0f); |
281 | QCOMPARE(v2.y(), 2.5f); |
282 | QCOMPARE(v2.z(), -89.25f); |
283 | QVERIFY(!v2.isNull()); |
284 | |
285 | QVector3D v3(1.0f, 2.5f, 0.0f); |
286 | QCOMPARE(v3.x(), 1.0f); |
287 | QCOMPARE(v3.y(), 2.5f); |
288 | QCOMPARE(v3.z(), 0.0f); |
289 | QVERIFY(!v3.isNull()); |
290 | |
291 | QVector3D v3i(1, 2, 0); |
292 | QCOMPARE(v3i.x(), 1.0f); |
293 | QCOMPARE(v3i.y(), 2.0f); |
294 | QCOMPARE(v3i.z(), 0.0f); |
295 | QVERIFY(!v3i.isNull()); |
296 | |
297 | QVector3D v4; |
298 | QCOMPARE(v4.x(), 0.0f); |
299 | QCOMPARE(v4.y(), 0.0f); |
300 | QCOMPARE(v4.z(), 0.0f); |
301 | QVERIFY(v4.isNull()); |
302 | v4 = v1; |
303 | QCOMPARE(v4.x(), 1.0f); |
304 | QCOMPARE(v4.y(), 2.5f); |
305 | QCOMPARE(v4.z(), -89.25f); |
306 | QVERIFY(!v4.isNull()); |
307 | |
308 | QVector3D v5(QPoint(1, 2)); |
309 | QCOMPARE(v5.x(), 1.0f); |
310 | QCOMPARE(v5.y(), 2.0f); |
311 | QCOMPARE(v5.z(), 0.0f); |
312 | QVERIFY(!v5.isNull()); |
313 | |
314 | QVector3D v6(QPointF(1, 2.5)); |
315 | QCOMPARE(v6.x(), 1.0f); |
316 | QCOMPARE(v6.y(), 2.5f); |
317 | QCOMPARE(v6.z(), 0.0f); |
318 | QVERIFY(!v6.isNull()); |
319 | |
320 | QVector3D v7(QVector2D(1.0f, 2.5f)); |
321 | QCOMPARE(v7.x(), 1.0f); |
322 | QCOMPARE(v7.y(), 2.5f); |
323 | QCOMPARE(v7.z(), 0.0f); |
324 | QVERIFY(!v7.isNull()); |
325 | |
326 | QVector3D v8(QVector2D(1.0f, 2.5f), 54.25f); |
327 | QCOMPARE(v8.x(), 1.0f); |
328 | QCOMPARE(v8.y(), 2.5f); |
329 | QCOMPARE(v8.z(), 54.25f); |
330 | QVERIFY(!v8.isNull()); |
331 | |
332 | QVector3D v9(QVector4D(1.0f, 2.5f, 54.25f, 34.0f)); |
333 | QCOMPARE(v9.x(), 1.0f); |
334 | QCOMPARE(v9.y(), 2.5f); |
335 | QCOMPARE(v9.z(), 54.25f); |
336 | QVERIFY(!v9.isNull()); |
337 | |
338 | v1.setX(3.0f); |
339 | QCOMPARE(v1.x(), 3.0f); |
340 | QCOMPARE(v1.y(), 2.5f); |
341 | QCOMPARE(v1.z(), -89.25f); |
342 | QVERIFY(!v1.isNull()); |
343 | |
344 | v1.setY(10.5f); |
345 | QCOMPARE(v1.x(), 3.0f); |
346 | QCOMPARE(v1.y(), 10.5f); |
347 | QCOMPARE(v1.z(), -89.25f); |
348 | QVERIFY(!v1.isNull()); |
349 | |
350 | v1.setZ(15.5f); |
351 | QCOMPARE(v1.x(), 3.0f); |
352 | QCOMPARE(v1.y(), 10.5f); |
353 | QCOMPARE(v1.z(), 15.5f); |
354 | QVERIFY(!v1.isNull()); |
355 | |
356 | v1.setX(0.0f); |
357 | v1.setY(0.0f); |
358 | v1.setZ(0.0f); |
359 | QCOMPARE(v1.x(), 0.0f); |
360 | QCOMPARE(v1.y(), 0.0f); |
361 | QCOMPARE(v1.z(), 0.0f); |
362 | QVERIFY(v1.isNull()); |
363 | |
364 | QPoint p1 = v8.toPoint(); |
365 | QCOMPARE(p1.x(), 1); |
366 | QCOMPARE(p1.y(), 3); |
367 | |
368 | QPointF p2 = v8.toPointF(); |
369 | QCOMPARE(p2.x(), 1.0f); |
370 | QCOMPARE(p2.y(), 2.5f); |
371 | |
372 | QVector2D v10 = v8.toVector2D(); |
373 | QCOMPARE(v10.x(), 1.0f); |
374 | QCOMPARE(v10.y(), 2.5f); |
375 | |
376 | QVector4D v11 = v8.toVector4D(); |
377 | QCOMPARE(v11.x(), 1.0f); |
378 | QCOMPARE(v11.y(), 2.5f); |
379 | QCOMPARE(v11.z(), 54.25f); |
380 | QCOMPARE(v11.w(), 0.0f); |
381 | } |
382 | |
383 | // Test the creation of QVector4D objects in various ways: |
384 | // construct, copy, and modify. |
385 | void tst_QVectorND::create4() |
386 | { |
387 | QVector4D null; |
388 | QCOMPARE(null.x(), 0.0f); |
389 | QCOMPARE(null.y(), 0.0f); |
390 | QCOMPARE(null.z(), 0.0f); |
391 | QCOMPARE(null.w(), 0.0f); |
392 | QVERIFY(null.isNull()); |
393 | |
394 | QVector4D nullNegativeZero(-0.0f, -0.0f, -0.0f, -0.0f); |
395 | QCOMPARE(nullNegativeZero.x(), -0.0f); |
396 | QCOMPARE(nullNegativeZero.y(), -0.0f); |
397 | QCOMPARE(nullNegativeZero.z(), -0.0f); |
398 | QCOMPARE(nullNegativeZero.w(), -0.0f); |
399 | QVERIFY(nullNegativeZero.isNull()); |
400 | |
401 | QVector4D v1(1.0f, 2.5f, -89.25f, 34.0f); |
402 | QCOMPARE(v1.x(), 1.0f); |
403 | QCOMPARE(v1.y(), 2.5f); |
404 | QCOMPARE(v1.z(), -89.25f); |
405 | QCOMPARE(v1.w(), 34.0f); |
406 | QVERIFY(!v1.isNull()); |
407 | |
408 | QVector4D v1i(1, 2, -89, 34); |
409 | QCOMPARE(v1i.x(), 1.0f); |
410 | QCOMPARE(v1i.y(), 2.0f); |
411 | QCOMPARE(v1i.z(), -89.0f); |
412 | QCOMPARE(v1i.w(), 34.0f); |
413 | QVERIFY(!v1i.isNull()); |
414 | |
415 | QVector4D v2(v1); |
416 | QCOMPARE(v2.x(), 1.0f); |
417 | QCOMPARE(v2.y(), 2.5f); |
418 | QCOMPARE(v2.z(), -89.25f); |
419 | QCOMPARE(v2.w(), 34.0f); |
420 | QVERIFY(!v2.isNull()); |
421 | |
422 | QVector4D v3(1.0f, 2.5f, 0.0f, 0.0f); |
423 | QCOMPARE(v3.x(), 1.0f); |
424 | QCOMPARE(v3.y(), 2.5f); |
425 | QCOMPARE(v3.z(), 0.0f); |
426 | QCOMPARE(v3.w(), 0.0f); |
427 | QVERIFY(!v3.isNull()); |
428 | |
429 | QVector4D v3i(1, 2, 0, 0); |
430 | QCOMPARE(v3i.x(), 1.0f); |
431 | QCOMPARE(v3i.y(), 2.0f); |
432 | QCOMPARE(v3i.z(), 0.0f); |
433 | QCOMPARE(v3i.w(), 0.0f); |
434 | QVERIFY(!v3i.isNull()); |
435 | |
436 | QVector4D v3b(1.0f, 2.5f, -89.25f, 0.0f); |
437 | QCOMPARE(v3b.x(), 1.0f); |
438 | QCOMPARE(v3b.y(), 2.5f); |
439 | QCOMPARE(v3b.z(), -89.25f); |
440 | QCOMPARE(v3b.w(), 0.0f); |
441 | QVERIFY(!v3b.isNull()); |
442 | |
443 | QVector4D v3bi(1, 2, -89, 0); |
444 | QCOMPARE(v3bi.x(), 1.0f); |
445 | QCOMPARE(v3bi.y(), 2.0f); |
446 | QCOMPARE(v3bi.z(), -89.0f); |
447 | QCOMPARE(v3bi.w(), 0.0f); |
448 | QVERIFY(!v3bi.isNull()); |
449 | |
450 | QVector4D v4; |
451 | QCOMPARE(v4.x(), 0.0f); |
452 | QCOMPARE(v4.y(), 0.0f); |
453 | QCOMPARE(v4.z(), 0.0f); |
454 | QCOMPARE(v4.w(), 0.0f); |
455 | QVERIFY(v4.isNull()); |
456 | v4 = v1; |
457 | QCOMPARE(v4.x(), 1.0f); |
458 | QCOMPARE(v4.y(), 2.5f); |
459 | QCOMPARE(v4.z(), -89.25f); |
460 | QCOMPARE(v4.w(), 34.0f); |
461 | QVERIFY(!v4.isNull()); |
462 | |
463 | QVector4D v5(QPoint(1, 2)); |
464 | QCOMPARE(v5.x(), 1.0f); |
465 | QCOMPARE(v5.y(), 2.0f); |
466 | QCOMPARE(v5.z(), 0.0f); |
467 | QCOMPARE(v5.w(), 0.0f); |
468 | QVERIFY(!v5.isNull()); |
469 | |
470 | QVector4D v6(QPointF(1, 2.5)); |
471 | QCOMPARE(v6.x(), 1.0f); |
472 | QCOMPARE(v6.y(), 2.5f); |
473 | QCOMPARE(v6.z(), 0.0f); |
474 | QCOMPARE(v6.w(), 0.0f); |
475 | QVERIFY(!v6.isNull()); |
476 | |
477 | QVector4D v7(QVector2D(1.0f, 2.5f)); |
478 | QCOMPARE(v7.x(), 1.0f); |
479 | QCOMPARE(v7.y(), 2.5f); |
480 | QCOMPARE(v7.z(), 0.0f); |
481 | QCOMPARE(v7.w(), 0.0f); |
482 | QVERIFY(!v7.isNull()); |
483 | |
484 | QVector4D v8(QVector3D(1.0f, 2.5f, -89.25f)); |
485 | QCOMPARE(v8.x(), 1.0f); |
486 | QCOMPARE(v8.y(), 2.5f); |
487 | QCOMPARE(v8.z(), -89.25f); |
488 | QCOMPARE(v8.w(), 0.0f); |
489 | QVERIFY(!v8.isNull()); |
490 | |
491 | QVector4D v9(QVector3D(1.0f, 2.5f, -89.25f), 34); |
492 | QCOMPARE(v9.x(), 1.0f); |
493 | QCOMPARE(v9.y(), 2.5f); |
494 | QCOMPARE(v9.z(), -89.25f); |
495 | QCOMPARE(v9.w(), 34.0f); |
496 | QVERIFY(!v9.isNull()); |
497 | |
498 | QVector4D v10(QVector2D(1.0f, 2.5f), 23.5f, -8); |
499 | QCOMPARE(v10.x(), 1.0f); |
500 | QCOMPARE(v10.y(), 2.5f); |
501 | QCOMPARE(v10.z(), 23.5f); |
502 | QCOMPARE(v10.w(), -8.0f); |
503 | QVERIFY(!v10.isNull()); |
504 | |
505 | v1.setX(3.0f); |
506 | QCOMPARE(v1.x(), 3.0f); |
507 | QCOMPARE(v1.y(), 2.5f); |
508 | QCOMPARE(v1.z(), -89.25f); |
509 | QCOMPARE(v1.w(), 34.0f); |
510 | QVERIFY(!v1.isNull()); |
511 | |
512 | v1.setY(10.5f); |
513 | QCOMPARE(v1.x(), 3.0f); |
514 | QCOMPARE(v1.y(), 10.5f); |
515 | QCOMPARE(v1.z(), -89.25f); |
516 | QCOMPARE(v1.w(), 34.0f); |
517 | QVERIFY(!v1.isNull()); |
518 | |
519 | v1.setZ(15.5f); |
520 | QCOMPARE(v1.x(), 3.0f); |
521 | QCOMPARE(v1.y(), 10.5f); |
522 | QCOMPARE(v1.z(), 15.5f); |
523 | QCOMPARE(v1.w(), 34.0f); |
524 | QVERIFY(!v1.isNull()); |
525 | |
526 | v1.setW(6.0f); |
527 | QCOMPARE(v1.x(), 3.0f); |
528 | QCOMPARE(v1.y(), 10.5f); |
529 | QCOMPARE(v1.z(), 15.5f); |
530 | QCOMPARE(v1.w(), 6.0f); |
531 | QVERIFY(!v1.isNull()); |
532 | |
533 | v1.setX(0.0f); |
534 | v1.setY(0.0f); |
535 | v1.setZ(0.0f); |
536 | v1.setW(0.0f); |
537 | QCOMPARE(v1.x(), 0.0f); |
538 | QCOMPARE(v1.y(), 0.0f); |
539 | QCOMPARE(v1.z(), 0.0f); |
540 | QCOMPARE(v1.w(), 0.0f); |
541 | QVERIFY(v1.isNull()); |
542 | |
543 | QPoint p1 = v8.toPoint(); |
544 | QCOMPARE(p1.x(), 1); |
545 | QCOMPARE(p1.y(), 3); |
546 | |
547 | QPointF p2 = v8.toPointF(); |
548 | QCOMPARE(p2.x(), 1.0f); |
549 | QCOMPARE(p2.y(), 2.5f); |
550 | |
551 | QVector2D v11 = v8.toVector2D(); |
552 | QCOMPARE(v11.x(), 1.0f); |
553 | QCOMPARE(v11.y(), 2.5f); |
554 | |
555 | QVector3D v12 = v8.toVector3D(); |
556 | QCOMPARE(v12.x(), 1.0f); |
557 | QCOMPARE(v12.y(), 2.5f); |
558 | QCOMPARE(v12.z(), -89.25f); |
559 | |
560 | QVector2D v13 = v9.toVector2DAffine(); |
561 | QVERIFY(qFuzzyCompare(v13.x(), (1.0f / 34.0f))); |
562 | QVERIFY(qFuzzyCompare(v13.y(), (2.5f / 34.0f))); |
563 | |
564 | QVector4D zerow(1.0f, 2.0f, 3.0f, 0.0f); |
565 | v13 = zerow.toVector2DAffine(); |
566 | QVERIFY(v13.isNull()); |
567 | |
568 | QVector3D v14 = v9.toVector3DAffine(); |
569 | QVERIFY(qFuzzyCompare(v14.x(), (1.0f / 34.0f))); |
570 | QVERIFY(qFuzzyCompare(v14.y(), (2.5f / 34.0f))); |
571 | QVERIFY(qFuzzyCompare(v14.z(), (-89.25f / 34.0f))); |
572 | |
573 | v14 = zerow.toVector3DAffine(); |
574 | QVERIFY(v14.isNull()); |
575 | } |
576 | |
577 | // Test modifying vectors in various ways |
578 | void tst_QVectorND::modify2() |
579 | { |
580 | const float e = 2.7182818f; |
581 | const float pi = 3.14159f; |
582 | const QVector2D p(e, pi); |
583 | |
584 | QVector2D p1; |
585 | p1.setX(e); |
586 | p1.setY(pi); |
587 | QVERIFY(qFuzzyCompare(p, p1)); |
588 | |
589 | QVector2D p2; |
590 | p2[0] = e; |
591 | p2[1] = pi; |
592 | QVERIFY(qFuzzyCompare(p, p2)); |
593 | |
594 | QVector2D p3; |
595 | for (int i = 0; i < 2; ++i) |
596 | p3[i] = p[i]; |
597 | QVERIFY(qFuzzyCompare(p, p3)); |
598 | } |
599 | |
600 | void tst_QVectorND::modify3() |
601 | { |
602 | const float one = 1.0f; |
603 | const float e = 2.7182818f; |
604 | const float pi = 3.14159f; |
605 | const QVector3D p(one, e, pi); |
606 | |
607 | QVector3D p1; |
608 | p1.setX(one); |
609 | p1.setY(e); |
610 | p1.setZ(pi); |
611 | QVERIFY(qFuzzyCompare(p, p1)); |
612 | |
613 | QVector3D p2; |
614 | p2[0] = one; |
615 | p2[1] = e; |
616 | p2[2] = pi; |
617 | QVERIFY(qFuzzyCompare(p, p2)); |
618 | |
619 | QVector3D p3; |
620 | for (int i = 0; i < 3; ++i) |
621 | p3[i] = p[i]; |
622 | QVERIFY(qFuzzyCompare(p, p3)); |
623 | } |
624 | |
625 | void tst_QVectorND::modify4() |
626 | { |
627 | const float one = 1.0f; |
628 | const float e = 2.7182818f; |
629 | const float pi = 3.14159f; |
630 | const float big = 1.0e6f; |
631 | const QVector4D p(one, e, pi, big); |
632 | |
633 | QVector4D p1; |
634 | p1.setX(one); |
635 | p1.setY(e); |
636 | p1.setZ(pi); |
637 | p1.setW(big); |
638 | QVERIFY(qFuzzyCompare(p, p1)); |
639 | |
640 | QVector4D p2; |
641 | p2[0] = one; |
642 | p2[1] = e; |
643 | p2[2] = pi; |
644 | p2[3] = big; |
645 | QVERIFY(qFuzzyCompare(p, p2)); |
646 | |
647 | QVector4D p3; |
648 | for (int i = 0; i < 4; ++i) |
649 | p3[i] = p[i]; |
650 | QVERIFY(qFuzzyCompare(p, p3)); |
651 | } |
652 | |
653 | // Test vector length computation for 2D vectors. |
654 | void tst_QVectorND::length2_data() |
655 | { |
656 | QTest::addColumn<float>(name: "x" ); |
657 | QTest::addColumn<float>(name: "y" ); |
658 | QTest::addColumn<float>(name: "len" ); |
659 | |
660 | QTest::newRow(dataTag: "null" ) << 0.0f << 0.0f << 0.0f; |
661 | QTest::newRow(dataTag: "1x" ) << 1.0f << 0.0f << 1.0f; |
662 | QTest::newRow(dataTag: "1y" ) << 0.0f << 1.0f << 1.0f; |
663 | QTest::newRow(dataTag: "-1x" ) << -1.0f << 0.0f << 1.0f; |
664 | QTest::newRow(dataTag: "-1y" ) << 0.0f << -1.0f << 1.0f; |
665 | QTest::newRow(dataTag: "two" ) << 2.0f << -2.0f << std::sqrt(x: 8.0f); |
666 | } |
667 | void tst_QVectorND::length2() |
668 | { |
669 | QFETCH(float, x); |
670 | QFETCH(float, y); |
671 | QFETCH(float, len); |
672 | |
673 | QVector2D v(x, y); |
674 | QCOMPARE(v.length(), len); |
675 | QCOMPARE(v.lengthSquared(), x * x + y * y); |
676 | } |
677 | |
678 | // Test vector length computation for 3D vectors. |
679 | void tst_QVectorND::length3_data() |
680 | { |
681 | QTest::addColumn<float>(name: "x" ); |
682 | QTest::addColumn<float>(name: "y" ); |
683 | QTest::addColumn<float>(name: "z" ); |
684 | QTest::addColumn<float>(name: "len" ); |
685 | |
686 | QTest::newRow(dataTag: "null" ) << 0.0f << 0.0f << 0.0f << 0.0f; |
687 | QTest::newRow(dataTag: "1x" ) << 1.0f << 0.0f << 0.0f << 1.0f; |
688 | QTest::newRow(dataTag: "1y" ) << 0.0f << 1.0f << 0.0f << 1.0f; |
689 | QTest::newRow(dataTag: "1z" ) << 0.0f << 0.0f << 1.0f << 1.0f; |
690 | QTest::newRow(dataTag: "-1x" ) << -1.0f << 0.0f << 0.0f << 1.0f; |
691 | QTest::newRow(dataTag: "-1y" ) << 0.0f << -1.0f << 0.0f << 1.0f; |
692 | QTest::newRow(dataTag: "-1z" ) << 0.0f << 0.0f << -1.0f << 1.0f; |
693 | QTest::newRow(dataTag: "two" ) << 2.0f << -2.0f << 2.0f << std::sqrt(x: 12.0f); |
694 | } |
695 | void tst_QVectorND::length3() |
696 | { |
697 | QFETCH(float, x); |
698 | QFETCH(float, y); |
699 | QFETCH(float, z); |
700 | QFETCH(float, len); |
701 | |
702 | QVector3D v(x, y, z); |
703 | QCOMPARE(v.length(), len); |
704 | QCOMPARE(v.lengthSquared(), x * x + y * y + z * z); |
705 | } |
706 | |
707 | // Test vector length computation for 4D vectors. |
708 | void tst_QVectorND::length4_data() |
709 | { |
710 | QTest::addColumn<float>(name: "x" ); |
711 | QTest::addColumn<float>(name: "y" ); |
712 | QTest::addColumn<float>(name: "z" ); |
713 | QTest::addColumn<float>(name: "w" ); |
714 | QTest::addColumn<float>(name: "len" ); |
715 | |
716 | QTest::newRow(dataTag: "null" ) << 0.0f << 0.0f << 0.0f << 0.0f << 0.0f; |
717 | QTest::newRow(dataTag: "1x" ) << 1.0f << 0.0f << 0.0f << 0.0f << 1.0f; |
718 | QTest::newRow(dataTag: "1y" ) << 0.0f << 1.0f << 0.0f << 0.0f << 1.0f; |
719 | QTest::newRow(dataTag: "1z" ) << 0.0f << 0.0f << 1.0f << 0.0f << 1.0f; |
720 | QTest::newRow(dataTag: "1w" ) << 0.0f << 0.0f << 0.0f << 1.0f << 1.0f; |
721 | QTest::newRow(dataTag: "-1x" ) << -1.0f << 0.0f << 0.0f << 0.0f << 1.0f; |
722 | QTest::newRow(dataTag: "-1y" ) << 0.0f << -1.0f << 0.0f << 0.0f << 1.0f; |
723 | QTest::newRow(dataTag: "-1z" ) << 0.0f << 0.0f << -1.0f << 0.0f << 1.0f; |
724 | QTest::newRow(dataTag: "-1w" ) << 0.0f << 0.0f << 0.0f << -1.0f << 1.0f; |
725 | QTest::newRow(dataTag: "two" ) << 2.0f << -2.0f << 2.0f << 2.0f << std::sqrt(x: 16.0f); |
726 | } |
727 | void tst_QVectorND::length4() |
728 | { |
729 | QFETCH(float, x); |
730 | QFETCH(float, y); |
731 | QFETCH(float, z); |
732 | QFETCH(float, w); |
733 | QFETCH(float, len); |
734 | |
735 | QVector4D v(x, y, z, w); |
736 | QCOMPARE(v.length(), len); |
737 | QCOMPARE(v.lengthSquared(), x * x + y * y + z * z + w * w); |
738 | } |
739 | |
740 | // Test the unit vector conversion for 2D vectors. |
741 | void tst_QVectorND::normalized2_data() |
742 | { |
743 | // Use the same test data as the length test. |
744 | length2_data(); |
745 | } |
746 | void tst_QVectorND::normalized2() |
747 | { |
748 | QFETCH(float, x); |
749 | QFETCH(float, y); |
750 | QFETCH(float, len); |
751 | |
752 | QVector2D v(x, y); |
753 | QVector2D u = v.normalized(); |
754 | if (v.isNull()) |
755 | QVERIFY(u.isNull()); |
756 | else |
757 | QVERIFY(qFuzzyCompare(u.length(), 1.0f)); |
758 | QVERIFY(qFuzzyCompare(u.x() * len, v.x())); |
759 | QVERIFY(qFuzzyCompare(u.y() * len, v.y())); |
760 | } |
761 | |
762 | // Test the unit vector conversion for 3D vectors. |
763 | void tst_QVectorND::normalized3_data() |
764 | { |
765 | // Use the same test data as the length test. |
766 | length3_data(); |
767 | } |
768 | void tst_QVectorND::normalized3() |
769 | { |
770 | QFETCH(float, x); |
771 | QFETCH(float, y); |
772 | QFETCH(float, z); |
773 | QFETCH(float, len); |
774 | |
775 | QVector3D v(x, y, z); |
776 | QVector3D u = v.normalized(); |
777 | if (v.isNull()) |
778 | QVERIFY(u.isNull()); |
779 | else |
780 | QVERIFY(qFuzzyCompare(u.length(), 1.0f)); |
781 | QVERIFY(qFuzzyCompare(u.x() * len, v.x())); |
782 | QVERIFY(qFuzzyCompare(u.y() * len, v.y())); |
783 | QVERIFY(qFuzzyCompare(u.z() * len, v.z())); |
784 | } |
785 | |
786 | // Test the unit vector conversion for 4D vectors. |
787 | void tst_QVectorND::normalized4_data() |
788 | { |
789 | // Use the same test data as the length test. |
790 | length4_data(); |
791 | } |
792 | void tst_QVectorND::normalized4() |
793 | { |
794 | QFETCH(float, x); |
795 | QFETCH(float, y); |
796 | QFETCH(float, z); |
797 | QFETCH(float, w); |
798 | QFETCH(float, len); |
799 | |
800 | QVector4D v(x, y, z, w); |
801 | QVector4D u = v.normalized(); |
802 | if (v.isNull()) |
803 | QVERIFY(u.isNull()); |
804 | else |
805 | QVERIFY(qFuzzyCompare(u.length(), 1.0f)); |
806 | QVERIFY(qFuzzyCompare(u.x() * len, v.x())); |
807 | QVERIFY(qFuzzyCompare(u.y() * len, v.y())); |
808 | QVERIFY(qFuzzyCompare(u.z() * len, v.z())); |
809 | QVERIFY(qFuzzyCompare(u.w() * len, v.w())); |
810 | } |
811 | |
812 | // Test the unit vector conversion for 2D vectors. |
813 | void tst_QVectorND::normalize2_data() |
814 | { |
815 | // Use the same test data as the length test. |
816 | length2_data(); |
817 | } |
818 | void tst_QVectorND::normalize2() |
819 | { |
820 | QFETCH(float, x); |
821 | QFETCH(float, y); |
822 | |
823 | QVector2D v(x, y); |
824 | bool isNull = v.isNull(); |
825 | v.normalize(); |
826 | if (isNull) |
827 | QVERIFY(v.isNull()); |
828 | else |
829 | QVERIFY(qFuzzyCompare(v.length(), 1.0f)); |
830 | } |
831 | |
832 | // Test the unit vector conversion for 3D vectors. |
833 | void tst_QVectorND::normalize3_data() |
834 | { |
835 | // Use the same test data as the length test. |
836 | length3_data(); |
837 | } |
838 | void tst_QVectorND::normalize3() |
839 | { |
840 | QFETCH(float, x); |
841 | QFETCH(float, y); |
842 | QFETCH(float, z); |
843 | |
844 | QVector3D v(x, y, z); |
845 | bool isNull = v.isNull(); |
846 | v.normalize(); |
847 | if (isNull) |
848 | QVERIFY(v.isNull()); |
849 | else |
850 | QVERIFY(qFuzzyCompare(v.length(), 1.0f)); |
851 | } |
852 | |
853 | // Test the unit vector conversion for 4D vectors. |
854 | void tst_QVectorND::normalize4_data() |
855 | { |
856 | // Use the same test data as the length test. |
857 | length4_data(); |
858 | } |
859 | void tst_QVectorND::normalize4() |
860 | { |
861 | QFETCH(float, x); |
862 | QFETCH(float, y); |
863 | QFETCH(float, z); |
864 | QFETCH(float, w); |
865 | |
866 | QVector4D v(x, y, z, w); |
867 | bool isNull = v.isNull(); |
868 | v.normalize(); |
869 | if (isNull) |
870 | QVERIFY(v.isNull()); |
871 | else |
872 | QVERIFY(qFuzzyCompare(v.length(), 1.0f)); |
873 | } |
874 | |
875 | // Test the comparison operators for 2D vectors. |
876 | void tst_QVectorND::compare2() |
877 | { |
878 | QVector2D v1(1, 2); |
879 | QVector2D v2(1, 2); |
880 | QVector2D v3(3, 2); |
881 | QVector2D v4(1, 3); |
882 | |
883 | QCOMPARE(v1, v2); |
884 | QVERIFY(v1 != v3); |
885 | QVERIFY(v1 != v4); |
886 | } |
887 | |
888 | // Test the comparison operators for 3D vectors. |
889 | void tst_QVectorND::compare3() |
890 | { |
891 | QVector3D v1(1, 2, 4); |
892 | QVector3D v2(1, 2, 4); |
893 | QVector3D v3(3, 2, 4); |
894 | QVector3D v4(1, 3, 4); |
895 | QVector3D v5(1, 2, 3); |
896 | |
897 | QCOMPARE(v1, v2); |
898 | QVERIFY(v1 != v3); |
899 | QVERIFY(v1 != v4); |
900 | QVERIFY(v1 != v5); |
901 | } |
902 | |
903 | // Test the comparison operators for 4D vectors. |
904 | void tst_QVectorND::compare4() |
905 | { |
906 | QVector4D v1(1, 2, 4, 8); |
907 | QVector4D v2(1, 2, 4, 8); |
908 | QVector4D v3(3, 2, 4, 8); |
909 | QVector4D v4(1, 3, 4, 8); |
910 | QVector4D v5(1, 2, 3, 8); |
911 | QVector4D v6(1, 2, 4, 3); |
912 | |
913 | QCOMPARE(v1, v2); |
914 | QVERIFY(v1 != v3); |
915 | QVERIFY(v1 != v4); |
916 | QVERIFY(v1 != v5); |
917 | QVERIFY(v1 != v6); |
918 | } |
919 | |
920 | // Test vector addition for 2D vectors. |
921 | void tst_QVectorND::add2_data() |
922 | { |
923 | QTest::addColumn<float>(name: "x1" ); |
924 | QTest::addColumn<float>(name: "y1" ); |
925 | QTest::addColumn<float>(name: "x2" ); |
926 | QTest::addColumn<float>(name: "y2" ); |
927 | QTest::addColumn<float>(name: "x3" ); |
928 | QTest::addColumn<float>(name: "y3" ); |
929 | |
930 | QTest::newRow(dataTag: "null" ) |
931 | << 0.0f << 0.0f |
932 | << 0.0f << 0.0f |
933 | << 0.0f << 0.0f; |
934 | |
935 | QTest::newRow(dataTag: "xonly" ) |
936 | << 1.0f << 0.0f |
937 | << 2.0f << 0.0f |
938 | << 3.0f << 0.0f; |
939 | |
940 | QTest::newRow(dataTag: "yonly" ) |
941 | << 0.0f << 1.0f |
942 | << 0.0f << 2.0f |
943 | << 0.0f << 3.0f; |
944 | |
945 | QTest::newRow(dataTag: "all" ) |
946 | << 1.0f << 2.0f |
947 | << 4.0f << 5.0f |
948 | << 5.0f << 7.0f; |
949 | } |
950 | void tst_QVectorND::add2() |
951 | { |
952 | QFETCH(float, x1); |
953 | QFETCH(float, y1); |
954 | QFETCH(float, x2); |
955 | QFETCH(float, y2); |
956 | QFETCH(float, x3); |
957 | QFETCH(float, y3); |
958 | |
959 | QVector2D v1(x1, y1); |
960 | QVector2D v2(x2, y2); |
961 | QVector2D v3(x3, y3); |
962 | |
963 | QVERIFY((v1 + v2) == v3); |
964 | |
965 | QVector2D v4(v1); |
966 | v4 += v2; |
967 | QCOMPARE(v4, v3); |
968 | |
969 | QCOMPARE(v4.x(), v1.x() + v2.x()); |
970 | QCOMPARE(v4.y(), v1.y() + v2.y()); |
971 | } |
972 | |
973 | // Test vector addition for 3D vectors. |
974 | void tst_QVectorND::add3_data() |
975 | { |
976 | QTest::addColumn<float>(name: "x1" ); |
977 | QTest::addColumn<float>(name: "y1" ); |
978 | QTest::addColumn<float>(name: "z1" ); |
979 | QTest::addColumn<float>(name: "x2" ); |
980 | QTest::addColumn<float>(name: "y2" ); |
981 | QTest::addColumn<float>(name: "z2" ); |
982 | QTest::addColumn<float>(name: "x3" ); |
983 | QTest::addColumn<float>(name: "y3" ); |
984 | QTest::addColumn<float>(name: "z3" ); |
985 | |
986 | QTest::newRow(dataTag: "null" ) |
987 | << 0.0f << 0.0f << 0.0f |
988 | << 0.0f << 0.0f << 0.0f |
989 | << 0.0f << 0.0f << 0.0f; |
990 | |
991 | QTest::newRow(dataTag: "xonly" ) |
992 | << 1.0f << 0.0f << 0.0f |
993 | << 2.0f << 0.0f << 0.0f |
994 | << 3.0f << 0.0f << 0.0f; |
995 | |
996 | QTest::newRow(dataTag: "yonly" ) |
997 | << 0.0f << 1.0f << 0.0f |
998 | << 0.0f << 2.0f << 0.0f |
999 | << 0.0f << 3.0f << 0.0f; |
1000 | |
1001 | QTest::newRow(dataTag: "zonly" ) |
1002 | << 0.0f << 0.0f << 1.0f |
1003 | << 0.0f << 0.0f << 2.0f |
1004 | << 0.0f << 0.0f << 3.0f; |
1005 | |
1006 | QTest::newRow(dataTag: "all" ) |
1007 | << 1.0f << 2.0f << 3.0f |
1008 | << 4.0f << 5.0f << -6.0f |
1009 | << 5.0f << 7.0f << -3.0f; |
1010 | } |
1011 | void tst_QVectorND::add3() |
1012 | { |
1013 | QFETCH(float, x1); |
1014 | QFETCH(float, y1); |
1015 | QFETCH(float, z1); |
1016 | QFETCH(float, x2); |
1017 | QFETCH(float, y2); |
1018 | QFETCH(float, z2); |
1019 | QFETCH(float, x3); |
1020 | QFETCH(float, y3); |
1021 | QFETCH(float, z3); |
1022 | |
1023 | QVector3D v1(x1, y1, z1); |
1024 | QVector3D v2(x2, y2, z2); |
1025 | QVector3D v3(x3, y3, z3); |
1026 | |
1027 | QVERIFY((v1 + v2) == v3); |
1028 | |
1029 | QVector3D v4(v1); |
1030 | v4 += v2; |
1031 | QCOMPARE(v4, v3); |
1032 | |
1033 | QCOMPARE(v4.x(), v1.x() + v2.x()); |
1034 | QCOMPARE(v4.y(), v1.y() + v2.y()); |
1035 | QCOMPARE(v4.z(), v1.z() + v2.z()); |
1036 | } |
1037 | |
1038 | // Test vector addition for 4D vectors. |
1039 | void tst_QVectorND::add4_data() |
1040 | { |
1041 | QTest::addColumn<float>(name: "x1" ); |
1042 | QTest::addColumn<float>(name: "y1" ); |
1043 | QTest::addColumn<float>(name: "z1" ); |
1044 | QTest::addColumn<float>(name: "w1" ); |
1045 | QTest::addColumn<float>(name: "x2" ); |
1046 | QTest::addColumn<float>(name: "y2" ); |
1047 | QTest::addColumn<float>(name: "z2" ); |
1048 | QTest::addColumn<float>(name: "w2" ); |
1049 | QTest::addColumn<float>(name: "x3" ); |
1050 | QTest::addColumn<float>(name: "y3" ); |
1051 | QTest::addColumn<float>(name: "z3" ); |
1052 | QTest::addColumn<float>(name: "w3" ); |
1053 | |
1054 | QTest::newRow(dataTag: "null" ) |
1055 | << 0.0f << 0.0f << 0.0f << 0.0f |
1056 | << 0.0f << 0.0f << 0.0f << 0.0f |
1057 | << 0.0f << 0.0f << 0.0f << 0.0f; |
1058 | |
1059 | QTest::newRow(dataTag: "xonly" ) |
1060 | << 1.0f << 0.0f << 0.0f << 0.0f |
1061 | << 2.0f << 0.0f << 0.0f << 0.0f |
1062 | << 3.0f << 0.0f << 0.0f << 0.0f; |
1063 | |
1064 | QTest::newRow(dataTag: "yonly" ) |
1065 | << 0.0f << 1.0f << 0.0f << 0.0f |
1066 | << 0.0f << 2.0f << 0.0f << 0.0f |
1067 | << 0.0f << 3.0f << 0.0f << 0.0f; |
1068 | |
1069 | QTest::newRow(dataTag: "zonly" ) |
1070 | << 0.0f << 0.0f << 1.0f << 0.0f |
1071 | << 0.0f << 0.0f << 2.0f << 0.0f |
1072 | << 0.0f << 0.0f << 3.0f << 0.0f; |
1073 | |
1074 | QTest::newRow(dataTag: "wonly" ) |
1075 | << 0.0f << 0.0f << 0.0f << 1.0f |
1076 | << 0.0f << 0.0f << 0.0f << 2.0f |
1077 | << 0.0f << 0.0f << 0.0f << 3.0f; |
1078 | |
1079 | QTest::newRow(dataTag: "all" ) |
1080 | << 1.0f << 2.0f << 3.0f << 8.0f |
1081 | << 4.0f << 5.0f << -6.0f << 9.0f |
1082 | << 5.0f << 7.0f << -3.0f << 17.0f; |
1083 | } |
1084 | void tst_QVectorND::add4() |
1085 | { |
1086 | QFETCH(float, x1); |
1087 | QFETCH(float, y1); |
1088 | QFETCH(float, z1); |
1089 | QFETCH(float, w1); |
1090 | QFETCH(float, x2); |
1091 | QFETCH(float, y2); |
1092 | QFETCH(float, z2); |
1093 | QFETCH(float, w2); |
1094 | QFETCH(float, x3); |
1095 | QFETCH(float, y3); |
1096 | QFETCH(float, z3); |
1097 | QFETCH(float, w3); |
1098 | |
1099 | QVector4D v1(x1, y1, z1, w1); |
1100 | QVector4D v2(x2, y2, z2, w2); |
1101 | QVector4D v3(x3, y3, z3, w3); |
1102 | |
1103 | QVERIFY((v1 + v2) == v3); |
1104 | |
1105 | QVector4D v4(v1); |
1106 | v4 += v2; |
1107 | QCOMPARE(v4, v3); |
1108 | |
1109 | QCOMPARE(v4.x(), v1.x() + v2.x()); |
1110 | QCOMPARE(v4.y(), v1.y() + v2.y()); |
1111 | QCOMPARE(v4.z(), v1.z() + v2.z()); |
1112 | QCOMPARE(v4.w(), v1.w() + v2.w()); |
1113 | } |
1114 | |
1115 | // Test vector subtraction for 2D vectors. |
1116 | void tst_QVectorND::subtract2_data() |
1117 | { |
1118 | // Use the same test data as the add test. |
1119 | add2_data(); |
1120 | } |
1121 | void tst_QVectorND::subtract2() |
1122 | { |
1123 | QFETCH(float, x1); |
1124 | QFETCH(float, y1); |
1125 | QFETCH(float, x2); |
1126 | QFETCH(float, y2); |
1127 | QFETCH(float, x3); |
1128 | QFETCH(float, y3); |
1129 | |
1130 | QVector2D v1(x1, y1); |
1131 | QVector2D v2(x2, y2); |
1132 | QVector2D v3(x3, y3); |
1133 | |
1134 | QVERIFY((v3 - v1) == v2); |
1135 | QVERIFY((v3 - v2) == v1); |
1136 | |
1137 | QVector2D v4(v3); |
1138 | v4 -= v1; |
1139 | QCOMPARE(v4, v2); |
1140 | |
1141 | QCOMPARE(v4.x(), v3.x() - v1.x()); |
1142 | QCOMPARE(v4.y(), v3.y() - v1.y()); |
1143 | |
1144 | QVector2D v5(v3); |
1145 | v5 -= v2; |
1146 | QCOMPARE(v5, v1); |
1147 | |
1148 | QCOMPARE(v5.x(), v3.x() - v2.x()); |
1149 | QCOMPARE(v5.y(), v3.y() - v2.y()); |
1150 | } |
1151 | |
1152 | // Test vector subtraction for 3D vectors. |
1153 | void tst_QVectorND::subtract3_data() |
1154 | { |
1155 | // Use the same test data as the add test. |
1156 | add3_data(); |
1157 | } |
1158 | void tst_QVectorND::subtract3() |
1159 | { |
1160 | QFETCH(float, x1); |
1161 | QFETCH(float, y1); |
1162 | QFETCH(float, z1); |
1163 | QFETCH(float, x2); |
1164 | QFETCH(float, y2); |
1165 | QFETCH(float, z2); |
1166 | QFETCH(float, x3); |
1167 | QFETCH(float, y3); |
1168 | QFETCH(float, z3); |
1169 | |
1170 | QVector3D v1(x1, y1, z1); |
1171 | QVector3D v2(x2, y2, z2); |
1172 | QVector3D v3(x3, y3, z3); |
1173 | |
1174 | QVERIFY((v3 - v1) == v2); |
1175 | QVERIFY((v3 - v2) == v1); |
1176 | |
1177 | QVector3D v4(v3); |
1178 | v4 -= v1; |
1179 | QCOMPARE(v4, v2); |
1180 | |
1181 | QCOMPARE(v4.x(), v3.x() - v1.x()); |
1182 | QCOMPARE(v4.y(), v3.y() - v1.y()); |
1183 | QCOMPARE(v4.z(), v3.z() - v1.z()); |
1184 | |
1185 | QVector3D v5(v3); |
1186 | v5 -= v2; |
1187 | QCOMPARE(v5, v1); |
1188 | |
1189 | QCOMPARE(v5.x(), v3.x() - v2.x()); |
1190 | QCOMPARE(v5.y(), v3.y() - v2.y()); |
1191 | QCOMPARE(v5.z(), v3.z() - v2.z()); |
1192 | } |
1193 | |
1194 | // Test vector subtraction for 4D vectors. |
1195 | void tst_QVectorND::subtract4_data() |
1196 | { |
1197 | // Use the same test data as the add test. |
1198 | add4_data(); |
1199 | } |
1200 | void tst_QVectorND::subtract4() |
1201 | { |
1202 | QFETCH(float, x1); |
1203 | QFETCH(float, y1); |
1204 | QFETCH(float, z1); |
1205 | QFETCH(float, w1); |
1206 | QFETCH(float, x2); |
1207 | QFETCH(float, y2); |
1208 | QFETCH(float, z2); |
1209 | QFETCH(float, w2); |
1210 | QFETCH(float, x3); |
1211 | QFETCH(float, y3); |
1212 | QFETCH(float, z3); |
1213 | QFETCH(float, w3); |
1214 | |
1215 | QVector4D v1(x1, y1, z1, w1); |
1216 | QVector4D v2(x2, y2, z2, w2); |
1217 | QVector4D v3(x3, y3, z3, w3); |
1218 | |
1219 | QVERIFY((v3 - v1) == v2); |
1220 | QVERIFY((v3 - v2) == v1); |
1221 | |
1222 | QVector4D v4(v3); |
1223 | v4 -= v1; |
1224 | QCOMPARE(v4, v2); |
1225 | |
1226 | QCOMPARE(v4.x(), v3.x() - v1.x()); |
1227 | QCOMPARE(v4.y(), v3.y() - v1.y()); |
1228 | QCOMPARE(v4.z(), v3.z() - v1.z()); |
1229 | QCOMPARE(v4.w(), v3.w() - v1.w()); |
1230 | |
1231 | QVector4D v5(v3); |
1232 | v5 -= v2; |
1233 | QCOMPARE(v5, v1); |
1234 | |
1235 | QCOMPARE(v5.x(), v3.x() - v2.x()); |
1236 | QCOMPARE(v5.y(), v3.y() - v2.y()); |
1237 | QCOMPARE(v5.z(), v3.z() - v2.z()); |
1238 | QCOMPARE(v5.w(), v3.w() - v2.w()); |
1239 | } |
1240 | |
1241 | // Test component-wise vector multiplication for 2D vectors. |
1242 | void tst_QVectorND::multiply2_data() |
1243 | { |
1244 | QTest::addColumn<float>(name: "x1" ); |
1245 | QTest::addColumn<float>(name: "y1" ); |
1246 | QTest::addColumn<float>(name: "x2" ); |
1247 | QTest::addColumn<float>(name: "y2" ); |
1248 | QTest::addColumn<float>(name: "x3" ); |
1249 | QTest::addColumn<float>(name: "y3" ); |
1250 | |
1251 | QTest::newRow(dataTag: "null" ) |
1252 | << 0.0f << 0.0f |
1253 | << 0.0f << 0.0f |
1254 | << 0.0f << 0.0f; |
1255 | |
1256 | QTest::newRow(dataTag: "xonly" ) |
1257 | << 1.0f << 0.0f |
1258 | << 2.0f << 0.0f |
1259 | << 2.0f << 0.0f; |
1260 | |
1261 | QTest::newRow(dataTag: "yonly" ) |
1262 | << 0.0f << 1.0f |
1263 | << 0.0f << 2.0f |
1264 | << 0.0f << 2.0f; |
1265 | |
1266 | QTest::newRow(dataTag: "all" ) |
1267 | << 1.0f << 2.0f |
1268 | << 4.0f << 5.0f |
1269 | << 4.0f << 10.0f; |
1270 | } |
1271 | void tst_QVectorND::multiply2() |
1272 | { |
1273 | QFETCH(float, x1); |
1274 | QFETCH(float, y1); |
1275 | QFETCH(float, x2); |
1276 | QFETCH(float, y2); |
1277 | QFETCH(float, x3); |
1278 | QFETCH(float, y3); |
1279 | |
1280 | QVector2D v1(x1, y1); |
1281 | QVector2D v2(x2, y2); |
1282 | QVector2D v3(x3, y3); |
1283 | |
1284 | QVERIFY((v1 * v2) == v3); |
1285 | |
1286 | QVector2D v4(v1); |
1287 | v4 *= v2; |
1288 | QCOMPARE(v4, v3); |
1289 | |
1290 | QCOMPARE(v4.x(), v1.x() * v2.x()); |
1291 | QCOMPARE(v4.y(), v1.y() * v2.y()); |
1292 | } |
1293 | |
1294 | // Test component-wise vector multiplication for 3D vectors. |
1295 | void tst_QVectorND::multiply3_data() |
1296 | { |
1297 | QTest::addColumn<float>(name: "x1" ); |
1298 | QTest::addColumn<float>(name: "y1" ); |
1299 | QTest::addColumn<float>(name: "z1" ); |
1300 | QTest::addColumn<float>(name: "x2" ); |
1301 | QTest::addColumn<float>(name: "y2" ); |
1302 | QTest::addColumn<float>(name: "z2" ); |
1303 | QTest::addColumn<float>(name: "x3" ); |
1304 | QTest::addColumn<float>(name: "y3" ); |
1305 | QTest::addColumn<float>(name: "z3" ); |
1306 | |
1307 | QTest::newRow(dataTag: "null" ) |
1308 | << 0.0f << 0.0f << 0.0f |
1309 | << 0.0f << 0.0f << 0.0f |
1310 | << 0.0f << 0.0f << 0.0f; |
1311 | |
1312 | QTest::newRow(dataTag: "xonly" ) |
1313 | << 1.0f << 0.0f << 0.0f |
1314 | << 2.0f << 0.0f << 0.0f |
1315 | << 2.0f << 0.0f << 0.0f; |
1316 | |
1317 | QTest::newRow(dataTag: "yonly" ) |
1318 | << 0.0f << 1.0f << 0.0f |
1319 | << 0.0f << 2.0f << 0.0f |
1320 | << 0.0f << 2.0f << 0.0f; |
1321 | |
1322 | QTest::newRow(dataTag: "zonly" ) |
1323 | << 0.0f << 0.0f << 1.0f |
1324 | << 0.0f << 0.0f << 2.0f |
1325 | << 0.0f << 0.0f << 2.0f; |
1326 | |
1327 | QTest::newRow(dataTag: "all" ) |
1328 | << 1.0f << 2.0f << 3.0f |
1329 | << 4.0f << 5.0f << -6.0f |
1330 | << 4.0f << 10.0f << -18.0f; |
1331 | } |
1332 | void tst_QVectorND::multiply3() |
1333 | { |
1334 | QFETCH(float, x1); |
1335 | QFETCH(float, y1); |
1336 | QFETCH(float, z1); |
1337 | QFETCH(float, x2); |
1338 | QFETCH(float, y2); |
1339 | QFETCH(float, z2); |
1340 | QFETCH(float, x3); |
1341 | QFETCH(float, y3); |
1342 | QFETCH(float, z3); |
1343 | |
1344 | QVector3D v1(x1, y1, z1); |
1345 | QVector3D v2(x2, y2, z2); |
1346 | QVector3D v3(x3, y3, z3); |
1347 | |
1348 | QVERIFY((v1 * v2) == v3); |
1349 | |
1350 | QVector3D v4(v1); |
1351 | v4 *= v2; |
1352 | QCOMPARE(v4, v3); |
1353 | |
1354 | QCOMPARE(v4.x(), v1.x() * v2.x()); |
1355 | QCOMPARE(v4.y(), v1.y() * v2.y()); |
1356 | QCOMPARE(v4.z(), v1.z() * v2.z()); |
1357 | } |
1358 | |
1359 | // Test component-wise vector multiplication for 4D vectors. |
1360 | void tst_QVectorND::multiply4_data() |
1361 | { |
1362 | QTest::addColumn<float>(name: "x1" ); |
1363 | QTest::addColumn<float>(name: "y1" ); |
1364 | QTest::addColumn<float>(name: "z1" ); |
1365 | QTest::addColumn<float>(name: "w1" ); |
1366 | QTest::addColumn<float>(name: "x2" ); |
1367 | QTest::addColumn<float>(name: "y2" ); |
1368 | QTest::addColumn<float>(name: "z2" ); |
1369 | QTest::addColumn<float>(name: "w2" ); |
1370 | QTest::addColumn<float>(name: "x3" ); |
1371 | QTest::addColumn<float>(name: "y3" ); |
1372 | QTest::addColumn<float>(name: "z3" ); |
1373 | QTest::addColumn<float>(name: "w3" ); |
1374 | |
1375 | QTest::newRow(dataTag: "null" ) |
1376 | << 0.0f << 0.0f << 0.0f << 0.0f |
1377 | << 0.0f << 0.0f << 0.0f << 0.0f |
1378 | << 0.0f << 0.0f << 0.0f << 0.0f; |
1379 | |
1380 | QTest::newRow(dataTag: "xonly" ) |
1381 | << 1.0f << 0.0f << 0.0f << 0.0f |
1382 | << 2.0f << 0.0f << 0.0f << 0.0f |
1383 | << 2.0f << 0.0f << 0.0f << 0.0f; |
1384 | |
1385 | QTest::newRow(dataTag: "yonly" ) |
1386 | << 0.0f << 1.0f << 0.0f << 0.0f |
1387 | << 0.0f << 2.0f << 0.0f << 0.0f |
1388 | << 0.0f << 2.0f << 0.0f << 0.0f; |
1389 | |
1390 | QTest::newRow(dataTag: "zonly" ) |
1391 | << 0.0f << 0.0f << 1.0f << 0.0f |
1392 | << 0.0f << 0.0f << 2.0f << 0.0f |
1393 | << 0.0f << 0.0f << 2.0f << 0.0f; |
1394 | |
1395 | QTest::newRow(dataTag: "wonly" ) |
1396 | << 0.0f << 0.0f << 0.0f << 1.0f |
1397 | << 0.0f << 0.0f << 0.0f << 2.0f |
1398 | << 0.0f << 0.0f << 0.0f << 2.0f; |
1399 | |
1400 | QTest::newRow(dataTag: "all" ) |
1401 | << 1.0f << 2.0f << 3.0f << 8.0f |
1402 | << 4.0f << 5.0f << -6.0f << 9.0f |
1403 | << 4.0f << 10.0f << -18.0f << 72.0f; |
1404 | } |
1405 | void tst_QVectorND::multiply4() |
1406 | { |
1407 | QFETCH(float, x1); |
1408 | QFETCH(float, y1); |
1409 | QFETCH(float, z1); |
1410 | QFETCH(float, w1); |
1411 | QFETCH(float, x2); |
1412 | QFETCH(float, y2); |
1413 | QFETCH(float, z2); |
1414 | QFETCH(float, w2); |
1415 | QFETCH(float, x3); |
1416 | QFETCH(float, y3); |
1417 | QFETCH(float, z3); |
1418 | QFETCH(float, w3); |
1419 | |
1420 | QVector4D v1(x1, y1, z1, w1); |
1421 | QVector4D v2(x2, y2, z2, w2); |
1422 | QVector4D v3(x3, y3, z3, w3); |
1423 | |
1424 | QVERIFY((v1 * v2) == v3); |
1425 | |
1426 | QVector4D v4(v1); |
1427 | v4 *= v2; |
1428 | QCOMPARE(v4, v3); |
1429 | |
1430 | QCOMPARE(v4.x(), v1.x() * v2.x()); |
1431 | QCOMPARE(v4.y(), v1.y() * v2.y()); |
1432 | QCOMPARE(v4.z(), v1.z() * v2.z()); |
1433 | QCOMPARE(v4.w(), v1.w() * v2.w()); |
1434 | } |
1435 | |
1436 | // Test vector multiplication by a factor for 2D vectors. |
1437 | void tst_QVectorND::multiplyFactor2_data() |
1438 | { |
1439 | QTest::addColumn<float>(name: "x1" ); |
1440 | QTest::addColumn<float>(name: "y1" ); |
1441 | QTest::addColumn<float>(name: "factor" ); |
1442 | QTest::addColumn<float>(name: "x2" ); |
1443 | QTest::addColumn<float>(name: "y2" ); |
1444 | |
1445 | QTest::newRow(dataTag: "null" ) |
1446 | << 0.0f << 0.0f |
1447 | << 100.0f |
1448 | << 0.0f << 0.0f; |
1449 | |
1450 | QTest::newRow(dataTag: "xonly" ) |
1451 | << 1.0f << 0.0f |
1452 | << 2.0f |
1453 | << 2.0f << 0.0f; |
1454 | |
1455 | QTest::newRow(dataTag: "yonly" ) |
1456 | << 0.0f << 1.0f |
1457 | << 2.0f |
1458 | << 0.0f << 2.0f; |
1459 | |
1460 | QTest::newRow(dataTag: "all" ) |
1461 | << 1.0f << 2.0f |
1462 | << 2.0f |
1463 | << 2.0f << 4.0f; |
1464 | |
1465 | QTest::newRow(dataTag: "allzero" ) |
1466 | << 1.0f << 2.0f |
1467 | << 0.0f |
1468 | << 0.0f << 0.0f; |
1469 | } |
1470 | void tst_QVectorND::multiplyFactor2() |
1471 | { |
1472 | QFETCH(float, x1); |
1473 | QFETCH(float, y1); |
1474 | QFETCH(float, factor); |
1475 | QFETCH(float, x2); |
1476 | QFETCH(float, y2); |
1477 | |
1478 | QVector2D v1(x1, y1); |
1479 | QVector2D v2(x2, y2); |
1480 | |
1481 | QVERIFY((v1 * factor) == v2); |
1482 | QVERIFY((factor * v1) == v2); |
1483 | |
1484 | QVector2D v3(v1); |
1485 | v3 *= factor; |
1486 | QCOMPARE(v3, v2); |
1487 | |
1488 | QCOMPARE(v3.x(), v1.x() * factor); |
1489 | QCOMPARE(v3.y(), v1.y() * factor); |
1490 | } |
1491 | |
1492 | // Test vector multiplication by a factor for 3D vectors. |
1493 | void tst_QVectorND::multiplyFactor3_data() |
1494 | { |
1495 | QTest::addColumn<float>(name: "x1" ); |
1496 | QTest::addColumn<float>(name: "y1" ); |
1497 | QTest::addColumn<float>(name: "z1" ); |
1498 | QTest::addColumn<float>(name: "factor" ); |
1499 | QTest::addColumn<float>(name: "x2" ); |
1500 | QTest::addColumn<float>(name: "y2" ); |
1501 | QTest::addColumn<float>(name: "z2" ); |
1502 | |
1503 | QTest::newRow(dataTag: "null" ) |
1504 | << 0.0f << 0.0f << 0.0f |
1505 | << 100.0f |
1506 | << 0.0f << 0.0f << 0.0f; |
1507 | |
1508 | QTest::newRow(dataTag: "xonly" ) |
1509 | << 1.0f << 0.0f << 0.0f |
1510 | << 2.0f |
1511 | << 2.0f << 0.0f << 0.0f; |
1512 | |
1513 | QTest::newRow(dataTag: "yonly" ) |
1514 | << 0.0f << 1.0f << 0.0f |
1515 | << 2.0f |
1516 | << 0.0f << 2.0f << 0.0f; |
1517 | |
1518 | QTest::newRow(dataTag: "zonly" ) |
1519 | << 0.0f << 0.0f << 1.0f |
1520 | << 2.0f |
1521 | << 0.0f << 0.0f << 2.0f; |
1522 | |
1523 | QTest::newRow(dataTag: "all" ) |
1524 | << 1.0f << 2.0f << -3.0f |
1525 | << 2.0f |
1526 | << 2.0f << 4.0f << -6.0f; |
1527 | |
1528 | QTest::newRow(dataTag: "allzero" ) |
1529 | << 1.0f << 2.0f << -3.0f |
1530 | << 0.0f |
1531 | << 0.0f << 0.0f << 0.0f; |
1532 | } |
1533 | void tst_QVectorND::multiplyFactor3() |
1534 | { |
1535 | QFETCH(float, x1); |
1536 | QFETCH(float, y1); |
1537 | QFETCH(float, z1); |
1538 | QFETCH(float, factor); |
1539 | QFETCH(float, x2); |
1540 | QFETCH(float, y2); |
1541 | QFETCH(float, z2); |
1542 | |
1543 | QVector3D v1(x1, y1, z1); |
1544 | QVector3D v2(x2, y2, z2); |
1545 | |
1546 | QVERIFY((v1 * factor) == v2); |
1547 | QVERIFY((factor * v1) == v2); |
1548 | |
1549 | QVector3D v3(v1); |
1550 | v3 *= factor; |
1551 | QCOMPARE(v3, v2); |
1552 | |
1553 | QCOMPARE(v3.x(), v1.x() * factor); |
1554 | QCOMPARE(v3.y(), v1.y() * factor); |
1555 | QCOMPARE(v3.z(), v1.z() * factor); |
1556 | } |
1557 | |
1558 | // Test vector multiplication by a factor for 4D vectors. |
1559 | void tst_QVectorND::multiplyFactor4_data() |
1560 | { |
1561 | QTest::addColumn<float>(name: "x1" ); |
1562 | QTest::addColumn<float>(name: "y1" ); |
1563 | QTest::addColumn<float>(name: "z1" ); |
1564 | QTest::addColumn<float>(name: "w1" ); |
1565 | QTest::addColumn<float>(name: "factor" ); |
1566 | QTest::addColumn<float>(name: "x2" ); |
1567 | QTest::addColumn<float>(name: "y2" ); |
1568 | QTest::addColumn<float>(name: "z2" ); |
1569 | QTest::addColumn<float>(name: "w2" ); |
1570 | |
1571 | QTest::newRow(dataTag: "null" ) |
1572 | << 0.0f << 0.0f << 0.0f << 0.0f |
1573 | << 100.0f |
1574 | << 0.0f << 0.0f << 0.0f << 0.0f; |
1575 | |
1576 | QTest::newRow(dataTag: "xonly" ) |
1577 | << 1.0f << 0.0f << 0.0f << 0.0f |
1578 | << 2.0f |
1579 | << 2.0f << 0.0f << 0.0f << 0.0f; |
1580 | |
1581 | QTest::newRow(dataTag: "yonly" ) |
1582 | << 0.0f << 1.0f << 0.0f << 0.0f |
1583 | << 2.0f |
1584 | << 0.0f << 2.0f << 0.0f << 0.0f; |
1585 | |
1586 | QTest::newRow(dataTag: "zonly" ) |
1587 | << 0.0f << 0.0f << 1.0f << 0.0f |
1588 | << 2.0f |
1589 | << 0.0f << 0.0f << 2.0f << 0.0f; |
1590 | |
1591 | QTest::newRow(dataTag: "wonly" ) |
1592 | << 0.0f << 0.0f << 0.0f << 1.0f |
1593 | << 2.0f |
1594 | << 0.0f << 0.0f << 0.0f << 2.0f; |
1595 | |
1596 | QTest::newRow(dataTag: "all" ) |
1597 | << 1.0f << 2.0f << -3.0f << 4.0f |
1598 | << 2.0f |
1599 | << 2.0f << 4.0f << -6.0f << 8.0f; |
1600 | |
1601 | QTest::newRow(dataTag: "allzero" ) |
1602 | << 1.0f << 2.0f << -3.0f << 4.0f |
1603 | << 0.0f |
1604 | << 0.0f << 0.0f << 0.0f << 0.0f; |
1605 | } |
1606 | void tst_QVectorND::multiplyFactor4() |
1607 | { |
1608 | QFETCH(float, x1); |
1609 | QFETCH(float, y1); |
1610 | QFETCH(float, z1); |
1611 | QFETCH(float, w1); |
1612 | QFETCH(float, factor); |
1613 | QFETCH(float, x2); |
1614 | QFETCH(float, y2); |
1615 | QFETCH(float, z2); |
1616 | QFETCH(float, w2); |
1617 | |
1618 | QVector4D v1(x1, y1, z1, w1); |
1619 | QVector4D v2(x2, y2, z2, w2); |
1620 | |
1621 | QVERIFY((v1 * factor) == v2); |
1622 | QVERIFY((factor * v1) == v2); |
1623 | |
1624 | QVector4D v3(v1); |
1625 | v3 *= factor; |
1626 | QCOMPARE(v3, v2); |
1627 | |
1628 | QCOMPARE(v3.x(), v1.x() * factor); |
1629 | QCOMPARE(v3.y(), v1.y() * factor); |
1630 | QCOMPARE(v3.z(), v1.z() * factor); |
1631 | QCOMPARE(v3.w(), v1.w() * factor); |
1632 | } |
1633 | |
1634 | // Test component-wise vector division for 2D vectors. |
1635 | void tst_QVectorND::divide2_data() |
1636 | { |
1637 | // Use the same test data as the multiply test. |
1638 | multiply2_data(); |
1639 | } |
1640 | void tst_QVectorND::divide2() |
1641 | { |
1642 | QFETCH(float, x1); |
1643 | QFETCH(float, y1); |
1644 | QFETCH(float, x2); |
1645 | QFETCH(float, y2); |
1646 | QFETCH(float, x3); |
1647 | QFETCH(float, y3); |
1648 | |
1649 | QVector2D v1(x1, y1); |
1650 | QVector2D v2(x2, y2); |
1651 | QVector2D v3(x3, y3); |
1652 | |
1653 | if (v2.x() != 0.0f && v2.y() != 0.0f) { |
1654 | QVERIFY((v3 / v2) == v1); |
1655 | |
1656 | QVector2D v4(v3); |
1657 | v4 /= v2; |
1658 | QCOMPARE(v4, v1); |
1659 | |
1660 | QCOMPARE(v4.x(), v3.x() / v2.x()); |
1661 | QCOMPARE(v4.y(), v3.y() / v2.y()); |
1662 | } |
1663 | if (v1.x() != 0.0f && v1.y() != 0.0f) { |
1664 | QVERIFY((v3 / v1) == v2); |
1665 | |
1666 | QVector2D v4(v3); |
1667 | v4 /= v1; |
1668 | QCOMPARE(v4, v2); |
1669 | |
1670 | QCOMPARE(v4.x(), v3.x() / v1.x()); |
1671 | QCOMPARE(v4.y(), v3.y() / v1.y()); |
1672 | } |
1673 | } |
1674 | |
1675 | // Test component-wise vector division for 3D vectors. |
1676 | void tst_QVectorND::divide3_data() |
1677 | { |
1678 | // Use the same test data as the multiply test. |
1679 | multiply3_data(); |
1680 | } |
1681 | void tst_QVectorND::divide3() |
1682 | { |
1683 | QFETCH(float, x1); |
1684 | QFETCH(float, y1); |
1685 | QFETCH(float, z1); |
1686 | QFETCH(float, x2); |
1687 | QFETCH(float, y2); |
1688 | QFETCH(float, z2); |
1689 | QFETCH(float, x3); |
1690 | QFETCH(float, y3); |
1691 | QFETCH(float, z3); |
1692 | |
1693 | QVector3D v1(x1, y1, z1); |
1694 | QVector3D v2(x2, y2, z2); |
1695 | QVector3D v3(x3, y3, z3); |
1696 | |
1697 | if (v2.x() != 0.0f && v2.y() != 0.0f && v2.z() != 0.0f) { |
1698 | QVERIFY((v3 / v2) == v1); |
1699 | |
1700 | QVector3D v4(v3); |
1701 | v4 /= v2; |
1702 | QCOMPARE(v4, v1); |
1703 | |
1704 | QCOMPARE(v4.x(), v3.x() / v2.x()); |
1705 | QCOMPARE(v4.y(), v3.y() / v2.y()); |
1706 | QCOMPARE(v4.z(), v3.z() / v2.z()); |
1707 | } |
1708 | if (v1.x() != 0.0f && v1.y() != 0.0f && v1.z() != 0.0f) { |
1709 | QVERIFY((v3 / v1) == v2); |
1710 | |
1711 | QVector3D v4(v3); |
1712 | v4 /= v1; |
1713 | QCOMPARE(v4, v2); |
1714 | |
1715 | QCOMPARE(v4.x(), v3.x() / v1.x()); |
1716 | QCOMPARE(v4.y(), v3.y() / v1.y()); |
1717 | QCOMPARE(v4.z(), v3.z() / v1.z()); |
1718 | } |
1719 | } |
1720 | |
1721 | // Test component-wise vector division for 4D vectors. |
1722 | void tst_QVectorND::divide4_data() |
1723 | { |
1724 | // Use the same test data as the multiply test. |
1725 | multiply4_data(); |
1726 | } |
1727 | void tst_QVectorND::divide4() |
1728 | { |
1729 | QFETCH(float, x1); |
1730 | QFETCH(float, y1); |
1731 | QFETCH(float, z1); |
1732 | QFETCH(float, w1); |
1733 | QFETCH(float, x2); |
1734 | QFETCH(float, y2); |
1735 | QFETCH(float, z2); |
1736 | QFETCH(float, w2); |
1737 | QFETCH(float, x3); |
1738 | QFETCH(float, y3); |
1739 | QFETCH(float, z3); |
1740 | QFETCH(float, w3); |
1741 | |
1742 | QVector4D v1(x1, y1, z1, w1); |
1743 | QVector4D v2(x2, y2, z2, w2); |
1744 | QVector4D v3(x3, y3, z3, w3); |
1745 | |
1746 | if (v2.x() != 0.0f && v2.y() != 0.0f && v2.z() != 0.0f && v2.w() != 0.0f) { |
1747 | QVERIFY((v3 / v2) == v1); |
1748 | |
1749 | QVector4D v4(v3); |
1750 | v4 /= v2; |
1751 | QCOMPARE(v4, v1); |
1752 | |
1753 | QCOMPARE(v4.x(), v3.x() / v2.x()); |
1754 | QCOMPARE(v4.y(), v3.y() / v2.y()); |
1755 | QCOMPARE(v4.z(), v3.z() / v2.z()); |
1756 | QCOMPARE(v4.w(), v3.w() / v2.w()); |
1757 | } |
1758 | if (v1.x() != 0.0f && v1.y() != 0.0f && v1.z() != 0.0f && v1.w() != 0.0f) { |
1759 | QVERIFY((v3 / v1) == v2); |
1760 | |
1761 | QVector4D v4(v3); |
1762 | v4 /= v1; |
1763 | QCOMPARE(v4, v2); |
1764 | |
1765 | QCOMPARE(v4.x(), v3.x() / v1.x()); |
1766 | QCOMPARE(v4.y(), v3.y() / v1.y()); |
1767 | QCOMPARE(v4.z(), v3.z() / v1.z()); |
1768 | QCOMPARE(v4.w(), v3.w() / v1.w()); |
1769 | } |
1770 | } |
1771 | |
1772 | // Test vector division by a factor for 2D vectors. |
1773 | void tst_QVectorND::divideFactor2_data() |
1774 | { |
1775 | // Use the same test data as the multiplyFactor test. |
1776 | multiplyFactor2_data(); |
1777 | } |
1778 | void tst_QVectorND::divideFactor2() |
1779 | { |
1780 | QFETCH(float, x1); |
1781 | QFETCH(float, y1); |
1782 | QFETCH(float, factor); |
1783 | QFETCH(float, x2); |
1784 | QFETCH(float, y2); |
1785 | |
1786 | QVector2D v1(x1, y1); |
1787 | QVector2D v2(x2, y2); |
1788 | |
1789 | if (factor == 0.0f) |
1790 | return; |
1791 | |
1792 | QVERIFY((v2 / factor) == v1); |
1793 | |
1794 | QVector2D v3(v2); |
1795 | v3 /= factor; |
1796 | QCOMPARE(v3, v1); |
1797 | |
1798 | QCOMPARE(v3.x(), v2.x() / factor); |
1799 | QCOMPARE(v3.y(), v2.y() / factor); |
1800 | } |
1801 | |
1802 | // Test vector division by a factor for 3D vectors. |
1803 | void tst_QVectorND::divideFactor3_data() |
1804 | { |
1805 | // Use the same test data as the multiplyFactor test. |
1806 | multiplyFactor3_data(); |
1807 | } |
1808 | void tst_QVectorND::divideFactor3() |
1809 | { |
1810 | QFETCH(float, x1); |
1811 | QFETCH(float, y1); |
1812 | QFETCH(float, z1); |
1813 | QFETCH(float, factor); |
1814 | QFETCH(float, x2); |
1815 | QFETCH(float, y2); |
1816 | QFETCH(float, z2); |
1817 | |
1818 | QVector3D v1(x1, y1, z1); |
1819 | QVector3D v2(x2, y2, z2); |
1820 | |
1821 | if (factor == 0.0f) |
1822 | return; |
1823 | |
1824 | QVERIFY((v2 / factor) == v1); |
1825 | |
1826 | QVector3D v3(v2); |
1827 | v3 /= factor; |
1828 | QCOMPARE(v3, v1); |
1829 | |
1830 | QCOMPARE(v3.x(), v2.x() / factor); |
1831 | QCOMPARE(v3.y(), v2.y() / factor); |
1832 | QCOMPARE(v3.z(), v2.z() / factor); |
1833 | } |
1834 | |
1835 | // Test vector division by a factor for 4D vectors. |
1836 | void tst_QVectorND::divideFactor4_data() |
1837 | { |
1838 | // Use the same test data as the multiplyFactor test. |
1839 | multiplyFactor4_data(); |
1840 | } |
1841 | void tst_QVectorND::divideFactor4() |
1842 | { |
1843 | QFETCH(float, x1); |
1844 | QFETCH(float, y1); |
1845 | QFETCH(float, z1); |
1846 | QFETCH(float, w1); |
1847 | QFETCH(float, factor); |
1848 | QFETCH(float, x2); |
1849 | QFETCH(float, y2); |
1850 | QFETCH(float, z2); |
1851 | QFETCH(float, w2); |
1852 | |
1853 | QVector4D v1(x1, y1, z1, w1); |
1854 | QVector4D v2(x2, y2, z2, w2); |
1855 | |
1856 | if (factor == 0.0f) |
1857 | return; |
1858 | |
1859 | QVERIFY((v2 / factor) == v1); |
1860 | |
1861 | QVector4D v3(v2); |
1862 | v3 /= factor; |
1863 | QCOMPARE(v3, v1); |
1864 | |
1865 | QCOMPARE(v3.x(), v2.x() / factor); |
1866 | QCOMPARE(v3.y(), v2.y() / factor); |
1867 | QCOMPARE(v3.z(), v2.z() / factor); |
1868 | QCOMPARE(v3.w(), v2.w() / factor); |
1869 | } |
1870 | |
1871 | // Test vector negation for 2D vectors. |
1872 | void tst_QVectorND::negate2_data() |
1873 | { |
1874 | // Use the same test data as the add test. |
1875 | add2_data(); |
1876 | } |
1877 | void tst_QVectorND::negate2() |
1878 | { |
1879 | QFETCH(float, x1); |
1880 | QFETCH(float, y1); |
1881 | |
1882 | QVector2D v1(x1, y1); |
1883 | QVector2D v2(-x1, -y1); |
1884 | |
1885 | QCOMPARE(-v1, v2); |
1886 | } |
1887 | |
1888 | // Test vector negation for 3D vectors. |
1889 | void tst_QVectorND::negate3_data() |
1890 | { |
1891 | // Use the same test data as the add test. |
1892 | add3_data(); |
1893 | } |
1894 | void tst_QVectorND::negate3() |
1895 | { |
1896 | QFETCH(float, x1); |
1897 | QFETCH(float, y1); |
1898 | QFETCH(float, z1); |
1899 | |
1900 | QVector3D v1(x1, y1, z1); |
1901 | QVector3D v2(-x1, -y1, -z1); |
1902 | |
1903 | QCOMPARE(-v1, v2); |
1904 | } |
1905 | |
1906 | // Test vector negation for 4D vectors. |
1907 | void tst_QVectorND::negate4_data() |
1908 | { |
1909 | // Use the same test data as the add test. |
1910 | add4_data(); |
1911 | } |
1912 | void tst_QVectorND::negate4() |
1913 | { |
1914 | QFETCH(float, x1); |
1915 | QFETCH(float, y1); |
1916 | QFETCH(float, z1); |
1917 | QFETCH(float, w1); |
1918 | |
1919 | QVector4D v1(x1, y1, z1, w1); |
1920 | QVector4D v2(-x1, -y1, -z1, -w1); |
1921 | |
1922 | QCOMPARE(-v1, v2); |
1923 | } |
1924 | |
1925 | // Test the computation of vector cross-products. |
1926 | void tst_QVectorND::crossProduct_data() |
1927 | { |
1928 | QTest::addColumn<float>(name: "x1" ); |
1929 | QTest::addColumn<float>(name: "y1" ); |
1930 | QTest::addColumn<float>(name: "z1" ); |
1931 | QTest::addColumn<float>(name: "x2" ); |
1932 | QTest::addColumn<float>(name: "y2" ); |
1933 | QTest::addColumn<float>(name: "z2" ); |
1934 | QTest::addColumn<float>(name: "x3" ); |
1935 | QTest::addColumn<float>(name: "y3" ); |
1936 | QTest::addColumn<float>(name: "z3" ); |
1937 | QTest::addColumn<float>(name: "dot" ); |
1938 | |
1939 | QTest::newRow(dataTag: "null" ) |
1940 | << 0.0f << 0.0f << 0.0f |
1941 | << 0.0f << 0.0f << 0.0f |
1942 | << 0.0f << 0.0f << 0.0f |
1943 | << 0.0f; |
1944 | |
1945 | QTest::newRow(dataTag: "unitvec" ) |
1946 | << 1.0f << 0.0f << 0.0f |
1947 | << 0.0f << 1.0f << 0.0f |
1948 | << 0.0f << 0.0f << 1.0f |
1949 | << 0.0f; |
1950 | |
1951 | QTest::newRow(dataTag: "complex" ) |
1952 | << 1.0f << 2.0f << 3.0f |
1953 | << 4.0f << 5.0f << 6.0f |
1954 | << -3.0f << 6.0f << -3.0f |
1955 | << 32.0f; |
1956 | } |
1957 | void tst_QVectorND::crossProduct() |
1958 | { |
1959 | QFETCH(float, x1); |
1960 | QFETCH(float, y1); |
1961 | QFETCH(float, z1); |
1962 | QFETCH(float, x2); |
1963 | QFETCH(float, y2); |
1964 | QFETCH(float, z2); |
1965 | QFETCH(float, x3); |
1966 | QFETCH(float, y3); |
1967 | QFETCH(float, z3); |
1968 | |
1969 | QVector3D v1(x1, y1, z1); |
1970 | QVector3D v2(x2, y2, z2); |
1971 | QVector3D v3(x3, y3, z3); |
1972 | |
1973 | QVector3D v4 = QVector3D::crossProduct(v1, v2); |
1974 | QCOMPARE(v4, v3); |
1975 | |
1976 | // Compute the cross-product long-hand and check again. |
1977 | float xres = y1 * z2 - z1 * y2; |
1978 | float yres = z1 * x2 - x1 * z2; |
1979 | float zres = x1 * y2 - y1 * x2; |
1980 | |
1981 | QCOMPARE(v4.x(), xres); |
1982 | QCOMPARE(v4.y(), yres); |
1983 | QCOMPARE(v4.z(), zres); |
1984 | } |
1985 | |
1986 | // Test the computation of normals. |
1987 | void tst_QVectorND::normal_data() |
1988 | { |
1989 | // Use the same test data as the crossProduct test. |
1990 | crossProduct_data(); |
1991 | } |
1992 | void tst_QVectorND::normal() |
1993 | { |
1994 | QFETCH(float, x1); |
1995 | QFETCH(float, y1); |
1996 | QFETCH(float, z1); |
1997 | QFETCH(float, x2); |
1998 | QFETCH(float, y2); |
1999 | QFETCH(float, z2); |
2000 | QFETCH(float, x3); |
2001 | QFETCH(float, y3); |
2002 | QFETCH(float, z3); |
2003 | |
2004 | QVector3D v1(x1, y1, z1); |
2005 | QVector3D v2(x2, y2, z2); |
2006 | QVector3D v3(x3, y3, z3); |
2007 | |
2008 | QVERIFY(QVector3D::normal(v1, v2) == v3.normalized()); |
2009 | QVERIFY(QVector3D::normal(QVector3D(), v1, v2) == v3.normalized()); |
2010 | |
2011 | QVector3D point(1.0f, 2.0f, 3.0f); |
2012 | QVERIFY(QVector3D::normal(point, v1 + point, v2 + point) == v3.normalized()); |
2013 | } |
2014 | |
2015 | // Test distance to point calculations. |
2016 | void tst_QVectorND::distanceToPoint2_data() |
2017 | { |
2018 | QTest::addColumn<float>(name: "x1" ); // Point to test for distance |
2019 | QTest::addColumn<float>(name: "y1" ); |
2020 | QTest::addColumn<float>(name: "x2" ); // Point to test against |
2021 | QTest::addColumn<float>(name: "y2" ); |
2022 | |
2023 | QTest::addColumn<float>(name: "distance" ); |
2024 | |
2025 | QTest::newRow(dataTag: "null" ) |
2026 | << 0.0f << 0.0f |
2027 | << 0.0f << 1.0f |
2028 | << 1.0f; |
2029 | |
2030 | QTest::newRow(dataTag: "on point" ) |
2031 | << 1.0f << 1.0f |
2032 | << 1.0f << 1.0f |
2033 | << 0.0f; |
2034 | |
2035 | QTest::newRow(dataTag: "off point" ) |
2036 | << 0.0f << 1.0f |
2037 | << 0.0f << 2.0f |
2038 | << 1.0f; |
2039 | |
2040 | QTest::newRow(dataTag: "off point 2" ) |
2041 | << 0.0f << 0.0f |
2042 | << 0.0f << 2.0f |
2043 | << 2.0f; |
2044 | |
2045 | QTest::newRow(dataTag: "minus point" ) |
2046 | << 0.0f << 0.0f |
2047 | << 0.0f << -2.0f |
2048 | << 2.0f; |
2049 | } |
2050 | void tst_QVectorND::distanceToPoint2() |
2051 | { |
2052 | QFETCH(float, x1); |
2053 | QFETCH(float, y1); |
2054 | QFETCH(float, x2); |
2055 | QFETCH(float, y2); |
2056 | QFETCH(float, distance); |
2057 | |
2058 | QVector2D v1(x1, y1); |
2059 | QVector2D v2(x2, y2); |
2060 | |
2061 | QCOMPARE(v1.distanceToPoint(v2), distance); |
2062 | } |
2063 | |
2064 | // Test distance to point calculations. |
2065 | void tst_QVectorND::distanceToPoint3_data() |
2066 | { |
2067 | QTest::addColumn<float>(name: "x1" ); // Point to test for distance |
2068 | QTest::addColumn<float>(name: "y1" ); |
2069 | QTest::addColumn<float>(name: "z1" ); |
2070 | QTest::addColumn<float>(name: "x2" ); // Point to test against |
2071 | QTest::addColumn<float>(name: "y2" ); |
2072 | QTest::addColumn<float>(name: "z2" ); |
2073 | |
2074 | QTest::addColumn<float>(name: "distance" ); |
2075 | |
2076 | QTest::newRow(dataTag: "null" ) |
2077 | << 0.0f << 0.0f << 0.0f |
2078 | << 0.0f << 0.0f << 1.0f |
2079 | << 1.0f; |
2080 | |
2081 | QTest::newRow(dataTag: "on point" ) |
2082 | << 0.0f << 0.0f << 0.0f |
2083 | << 0.0f << 0.0f << 0.0f |
2084 | << 0.0f; |
2085 | |
2086 | QTest::newRow(dataTag: "off point" ) |
2087 | << 0.0f << 0.0f << 1.0f |
2088 | << 0.0f << 0.0f << 2.0f |
2089 | << 1.0f; |
2090 | |
2091 | QTest::newRow(dataTag: "off point 2" ) |
2092 | << 0.0f << 0.0f << 0.0f |
2093 | << 0.0f << 2.0f << 0.0f |
2094 | << 2.0f; |
2095 | |
2096 | QTest::newRow(dataTag: "minus point" ) |
2097 | << 0.0f << 0.0f << 0.0f |
2098 | << 0.0f << -2.0f << 0.0f |
2099 | << 2.0f; |
2100 | } |
2101 | void tst_QVectorND::distanceToPoint3() |
2102 | { |
2103 | QFETCH(float, x1); |
2104 | QFETCH(float, y1); |
2105 | QFETCH(float, z1); |
2106 | QFETCH(float, x2); |
2107 | QFETCH(float, y2); |
2108 | QFETCH(float, z2); |
2109 | QFETCH(float, distance); |
2110 | |
2111 | QVector3D v1(x1, y1, z1); |
2112 | QVector3D v2(x2, y2, z2); |
2113 | |
2114 | QCOMPARE(v1.distanceToPoint(v2), distance); |
2115 | } |
2116 | |
2117 | // Test distance to plane calculations. |
2118 | void tst_QVectorND::distanceToPlane_data() |
2119 | { |
2120 | QTest::addColumn<float>(name: "x1" ); // Point on plane |
2121 | QTest::addColumn<float>(name: "y1" ); |
2122 | QTest::addColumn<float>(name: "z1" ); |
2123 | QTest::addColumn<float>(name: "x2" ); // Normal to plane |
2124 | QTest::addColumn<float>(name: "y2" ); |
2125 | QTest::addColumn<float>(name: "z2" ); |
2126 | QTest::addColumn<float>(name: "x3" ); // Point to test for distance |
2127 | QTest::addColumn<float>(name: "y3" ); |
2128 | QTest::addColumn<float>(name: "z3" ); |
2129 | QTest::addColumn<float>(name: "x4" ); // Second point on plane |
2130 | QTest::addColumn<float>(name: "y4" ); |
2131 | QTest::addColumn<float>(name: "z4" ); |
2132 | QTest::addColumn<float>(name: "x5" ); // Third point on plane |
2133 | QTest::addColumn<float>(name: "y5" ); |
2134 | QTest::addColumn<float>(name: "z5" ); |
2135 | QTest::addColumn<float>(name: "distance" ); |
2136 | |
2137 | QTest::newRow(dataTag: "null" ) |
2138 | << 0.0f << 0.0f << 0.0f |
2139 | << 0.0f << 0.0f << 1.0f |
2140 | << 0.0f << 0.0f << 0.0f |
2141 | << 1.0f << 0.0f << 0.0f |
2142 | << 0.0f << 2.0f << 0.0f |
2143 | << 0.0f; |
2144 | |
2145 | QTest::newRow(dataTag: "above" ) |
2146 | << 0.0f << 0.0f << 0.0f |
2147 | << 0.0f << 0.0f << 1.0f |
2148 | << 0.0f << 0.0f << 2.0f |
2149 | << 1.0f << 0.0f << 0.0f |
2150 | << 0.0f << 2.0f << 0.0f |
2151 | << 2.0f; |
2152 | |
2153 | QTest::newRow(dataTag: "below" ) |
2154 | << 0.0f << 0.0f << 0.0f |
2155 | << 0.0f << 0.0f << 1.0f |
2156 | << -1.0f << 1.0f << -2.0f |
2157 | << 1.0f << 0.0f << 0.0f |
2158 | << 0.0f << 2.0f << 0.0f |
2159 | << -2.0f; |
2160 | } |
2161 | void tst_QVectorND::distanceToPlane() |
2162 | { |
2163 | QFETCH(float, x1); |
2164 | QFETCH(float, y1); |
2165 | QFETCH(float, z1); |
2166 | QFETCH(float, x2); |
2167 | QFETCH(float, y2); |
2168 | QFETCH(float, z2); |
2169 | QFETCH(float, x3); |
2170 | QFETCH(float, y3); |
2171 | QFETCH(float, z3); |
2172 | QFETCH(float, x4); |
2173 | QFETCH(float, y4); |
2174 | QFETCH(float, z4); |
2175 | QFETCH(float, x5); |
2176 | QFETCH(float, y5); |
2177 | QFETCH(float, z5); |
2178 | QFETCH(float, distance); |
2179 | |
2180 | QVector3D v1(x1, y1, z1); |
2181 | QVector3D v2(x2, y2, z2); |
2182 | QVector3D v3(x3, y3, z3); |
2183 | QVector3D v4(x4, y4, z4); |
2184 | QVector3D v5(x5, y5, z5); |
2185 | |
2186 | QCOMPARE(v3.distanceToPlane(v1, v2), distance); |
2187 | QCOMPARE(v3.distanceToPlane(v1, v4, v5), distance); |
2188 | } |
2189 | |
2190 | // Test distance to line calculations. |
2191 | void tst_QVectorND::distanceToLine2_data() |
2192 | { |
2193 | QTest::addColumn<float>(name: "x1" ); // Point on line |
2194 | QTest::addColumn<float>(name: "y1" ); |
2195 | QTest::addColumn<float>(name: "x2" ); // Direction of the line |
2196 | QTest::addColumn<float>(name: "y2" ); |
2197 | QTest::addColumn<float>(name: "x3" ); // Point to test for distance |
2198 | QTest::addColumn<float>(name: "y3" ); |
2199 | QTest::addColumn<float>(name: "distance" ); |
2200 | |
2201 | QTest::newRow(dataTag: "null" ) |
2202 | << 0.0f << 0.0f |
2203 | << 0.0f << 0.1f |
2204 | << 0.0f << 0.0f |
2205 | << 0.0f; |
2206 | |
2207 | QTest::newRow(dataTag: "on line" ) |
2208 | << 0.0f << 0.0f |
2209 | << 0.0f << 1.0f |
2210 | << 0.0f << 5.0f |
2211 | << 0.0f; |
2212 | |
2213 | QTest::newRow(dataTag: "off line" ) |
2214 | << 0.0f << 0.0f |
2215 | << 0.0f << 1.0f |
2216 | << 1.0f << 0.0f |
2217 | << 1.0f; |
2218 | |
2219 | QTest::newRow(dataTag: "off line 2" ) |
2220 | << 0.0f << 0.0f |
2221 | << 0.0f << 1.0f |
2222 | << -2.0f << 0.0f |
2223 | << 2.0f; |
2224 | |
2225 | QTest::newRow(dataTag: "points" ) |
2226 | << 0.0f << 0.0f |
2227 | << 0.0f << 0.0f |
2228 | << 0.0f << 5.0f |
2229 | << 5.0f; |
2230 | } |
2231 | |
2232 | void tst_QVectorND::distanceToLine2() |
2233 | { |
2234 | QFETCH(float, x1); |
2235 | QFETCH(float, y1); |
2236 | QFETCH(float, x2); |
2237 | QFETCH(float, y2); |
2238 | QFETCH(float, x3); |
2239 | QFETCH(float, y3); |
2240 | QFETCH(float, distance); |
2241 | |
2242 | QVector2D v1(x1, y1); |
2243 | QVector2D v2(x2, y2); |
2244 | QVector2D v3(x3, y3); |
2245 | |
2246 | QCOMPARE(v3.distanceToLine(v1, v2), distance); |
2247 | } |
2248 | // Test distance to line calculations. |
2249 | void tst_QVectorND::distanceToLine3_data() |
2250 | { |
2251 | QTest::addColumn<float>(name: "x1" ); // Point on line |
2252 | QTest::addColumn<float>(name: "y1" ); |
2253 | QTest::addColumn<float>(name: "z1" ); |
2254 | QTest::addColumn<float>(name: "x2" ); // Direction of the line |
2255 | QTest::addColumn<float>(name: "y2" ); |
2256 | QTest::addColumn<float>(name: "z2" ); |
2257 | QTest::addColumn<float>(name: "x3" ); // Point to test for distance |
2258 | QTest::addColumn<float>(name: "y3" ); |
2259 | QTest::addColumn<float>(name: "z3" ); |
2260 | QTest::addColumn<float>(name: "distance" ); |
2261 | |
2262 | QTest::newRow(dataTag: "null" ) |
2263 | << 0.0f << 0.0f << 0.0f |
2264 | << 0.0f << 0.0f << 1.0f |
2265 | << 0.0f << 0.0f << 0.0f |
2266 | << 0.0f; |
2267 | |
2268 | QTest::newRow(dataTag: "on line" ) |
2269 | << 0.0f << 0.0f << 0.0f |
2270 | << 0.0f << 0.0f << 1.0f |
2271 | << 0.0f << 0.0f << 5.0f |
2272 | << 0.0f; |
2273 | |
2274 | QTest::newRow(dataTag: "off line" ) |
2275 | << 0.0f << 0.0f << 0.0f |
2276 | << 0.0f << 0.0f << 1.0f |
2277 | << 1.0f << 0.0f << 0.0f |
2278 | << 1.0f; |
2279 | |
2280 | QTest::newRow(dataTag: "off line 2" ) |
2281 | << 0.0f << 0.0f << 0.0f |
2282 | << 0.0f << 0.0f << 1.0f |
2283 | << 0.0f << -2.0f << 0.0f |
2284 | << 2.0f; |
2285 | |
2286 | QTest::newRow(dataTag: "points" ) |
2287 | << 0.0f << 0.0f << 0.0f |
2288 | << 0.0f << 0.0f << 0.0f |
2289 | << 0.0f << 5.0f << 0.0f |
2290 | << 5.0f; |
2291 | } |
2292 | void tst_QVectorND::distanceToLine3() |
2293 | { |
2294 | QFETCH(float, x1); |
2295 | QFETCH(float, y1); |
2296 | QFETCH(float, z1); |
2297 | QFETCH(float, x2); |
2298 | QFETCH(float, y2); |
2299 | QFETCH(float, z2); |
2300 | QFETCH(float, x3); |
2301 | QFETCH(float, y3); |
2302 | QFETCH(float, z3); |
2303 | QFETCH(float, distance); |
2304 | |
2305 | QVector3D v1(x1, y1, z1); |
2306 | QVector3D v2(x2, y2, z2); |
2307 | QVector3D v3(x3, y3, z3); |
2308 | |
2309 | QCOMPARE(v3.distanceToLine(v1, v2), distance); |
2310 | } |
2311 | |
2312 | // Test the computation of dot products for 2D vectors. |
2313 | void tst_QVectorND::dotProduct2_data() |
2314 | { |
2315 | QTest::addColumn<float>(name: "x1" ); |
2316 | QTest::addColumn<float>(name: "y1" ); |
2317 | QTest::addColumn<float>(name: "x2" ); |
2318 | QTest::addColumn<float>(name: "y2" ); |
2319 | QTest::addColumn<float>(name: "dot" ); |
2320 | |
2321 | QTest::newRow(dataTag: "null" ) |
2322 | << 0.0f << 0.0f |
2323 | << 0.0f << 0.0f |
2324 | << 0.0f; |
2325 | |
2326 | QTest::newRow(dataTag: "unitvec" ) |
2327 | << 1.0f << 0.0f |
2328 | << 0.0f << 1.0f |
2329 | << 0.0f; |
2330 | |
2331 | QTest::newRow(dataTag: "complex" ) |
2332 | << 1.0f << 2.0f |
2333 | << 4.0f << 5.0f |
2334 | << 14.0f; |
2335 | } |
2336 | void tst_QVectorND::dotProduct2() |
2337 | { |
2338 | QFETCH(float, x1); |
2339 | QFETCH(float, y1); |
2340 | QFETCH(float, x2); |
2341 | QFETCH(float, y2); |
2342 | QFETCH(float, dot); |
2343 | |
2344 | QVector2D v1(x1, y1); |
2345 | QVector2D v2(x2, y2); |
2346 | |
2347 | QVERIFY(QVector2D::dotProduct(v1, v2) == dot); |
2348 | |
2349 | // Compute the dot-product long-hand and check again. |
2350 | float d = x1 * x2 + y1 * y2; |
2351 | |
2352 | QCOMPARE(QVector2D::dotProduct(v1, v2), d); |
2353 | } |
2354 | |
2355 | // Test the computation of dot products for 3D vectors. |
2356 | void tst_QVectorND::dotProduct3_data() |
2357 | { |
2358 | // Use the same test data as the crossProduct test. |
2359 | crossProduct_data(); |
2360 | } |
2361 | void tst_QVectorND::dotProduct3() |
2362 | { |
2363 | QFETCH(float, x1); |
2364 | QFETCH(float, y1); |
2365 | QFETCH(float, z1); |
2366 | QFETCH(float, x2); |
2367 | QFETCH(float, y2); |
2368 | QFETCH(float, z2); |
2369 | QFETCH(float, x3); |
2370 | QFETCH(float, y3); |
2371 | QFETCH(float, z3); |
2372 | QFETCH(float, dot); |
2373 | |
2374 | Q_UNUSED(x3); |
2375 | Q_UNUSED(y3); |
2376 | Q_UNUSED(z3); |
2377 | |
2378 | QVector3D v1(x1, y1, z1); |
2379 | QVector3D v2(x2, y2, z2); |
2380 | |
2381 | QVERIFY(QVector3D::dotProduct(v1, v2) == dot); |
2382 | |
2383 | // Compute the dot-product long-hand and check again. |
2384 | float d = x1 * x2 + y1 * y2 + z1 * z2; |
2385 | |
2386 | QCOMPARE(QVector3D::dotProduct(v1, v2), d); |
2387 | } |
2388 | |
2389 | // Test the computation of dot products for 4D vectors. |
2390 | void tst_QVectorND::dotProduct4_data() |
2391 | { |
2392 | QTest::addColumn<float>(name: "x1" ); |
2393 | QTest::addColumn<float>(name: "y1" ); |
2394 | QTest::addColumn<float>(name: "z1" ); |
2395 | QTest::addColumn<float>(name: "w1" ); |
2396 | QTest::addColumn<float>(name: "x2" ); |
2397 | QTest::addColumn<float>(name: "y2" ); |
2398 | QTest::addColumn<float>(name: "z2" ); |
2399 | QTest::addColumn<float>(name: "w2" ); |
2400 | QTest::addColumn<float>(name: "dot" ); |
2401 | |
2402 | QTest::newRow(dataTag: "null" ) |
2403 | << 0.0f << 0.0f << 0.0f << 0.0f |
2404 | << 0.0f << 0.0f << 0.0f << 0.0f |
2405 | << 0.0f; |
2406 | |
2407 | QTest::newRow(dataTag: "unitvec" ) |
2408 | << 1.0f << 0.0f << 0.0f << 0.0f |
2409 | << 0.0f << 1.0f << 0.0f << 0.0f |
2410 | << 0.0f; |
2411 | |
2412 | QTest::newRow(dataTag: "complex" ) |
2413 | << 1.0f << 2.0f << 3.0f << 4.0f |
2414 | << 4.0f << 5.0f << 6.0f << 7.0f |
2415 | << 60.0f; |
2416 | } |
2417 | void tst_QVectorND::dotProduct4() |
2418 | { |
2419 | QFETCH(float, x1); |
2420 | QFETCH(float, y1); |
2421 | QFETCH(float, z1); |
2422 | QFETCH(float, w1); |
2423 | QFETCH(float, x2); |
2424 | QFETCH(float, y2); |
2425 | QFETCH(float, z2); |
2426 | QFETCH(float, w2); |
2427 | QFETCH(float, dot); |
2428 | |
2429 | QVector4D v1(x1, y1, z1, w1); |
2430 | QVector4D v2(x2, y2, z2, w2); |
2431 | |
2432 | QVERIFY(QVector4D::dotProduct(v1, v2) == dot); |
2433 | |
2434 | // Compute the dot-product long-hand and check again. |
2435 | float d = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2; |
2436 | |
2437 | QCOMPARE(QVector4D::dotProduct(v1, v2), d); |
2438 | } |
2439 | |
2440 | void tst_QVectorND::project_data() |
2441 | { |
2442 | QTest::addColumn<QVector3D>(name: "point" ); |
2443 | QTest::addColumn<QRect>(name: "viewport" ); |
2444 | QTest::addColumn<QMatrix4x4>(name: "projection" ); |
2445 | QTest::addColumn<QMatrix4x4>(name: "view" ); |
2446 | QTest::addColumn<QVector2D>(name: "result" ); |
2447 | |
2448 | QMatrix4x4 projection; |
2449 | projection.ortho(left: -1.0f, right: 1.0f, bottom: -1.0f, top: 1.0f, nearPlane: 0.1f, farPlane: 1000.0f); |
2450 | |
2451 | QMatrix4x4 view; |
2452 | // Located at (0, 0, 10), looking at origin, y is up |
2453 | view.lookAt(eye: QVector3D(0.0f, 0.0f, 10.0f), center: QVector3D(0.0f, 0.0f, 0.0f), up: QVector3D(0.0f, 1.0f, 0.0f)); |
2454 | |
2455 | QMatrix4x4 nullMatrix(0.0f, 0.0f, 0.0f, 0.0f, |
2456 | 0.0f, 0.0f, 0.0f, 0.0f, |
2457 | 0.0f, 0.0f, 0.0f, 0.0f, |
2458 | 0.0f, 0.0f, 0.0f, 0.0f); |
2459 | |
2460 | QTest::newRow(dataTag: "center" ) |
2461 | << QVector3D(0.0f, 0.0f, 0.0f) |
2462 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2463 | << projection |
2464 | << view |
2465 | << QVector2D(400.0f, 300.0f); |
2466 | |
2467 | QTest::newRow(dataTag: "topLeft" ) |
2468 | << QVector3D(-1.0f, 1.0f, 0.0f) |
2469 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2470 | << projection |
2471 | << view |
2472 | << QVector2D(0.0f, 600.0f); |
2473 | |
2474 | QTest::newRow(dataTag: "topRight" ) |
2475 | << QVector3D(1.0f, 1.0f, 0.0f) |
2476 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2477 | << projection |
2478 | << view |
2479 | << QVector2D(800.0f, 600.0f); |
2480 | |
2481 | QTest::newRow(dataTag: "bottomLeft" ) |
2482 | << QVector3D(-1.0f, -1.0f, 0.0f) |
2483 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2484 | << projection |
2485 | << view |
2486 | << QVector2D(0.0f, 0.0f); |
2487 | |
2488 | QTest::newRow(dataTag: "bottomRight" ) |
2489 | << QVector3D(1.0f, -1.0f, 0.0f) |
2490 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2491 | << projection |
2492 | << view |
2493 | << QVector2D(800.0f, 0.0f); |
2494 | |
2495 | QTest::newRow(dataTag: "nullMatrix" ) |
2496 | << QVector3D(0.0f, 0.0f, 0.0f) |
2497 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2498 | << nullMatrix |
2499 | << nullMatrix |
2500 | << QVector2D(400.0f, 300.0f); |
2501 | } |
2502 | |
2503 | void tst_QVectorND::project() |
2504 | { |
2505 | QFETCH(QVector3D, point); |
2506 | QFETCH(QRect, viewport); |
2507 | QFETCH(QMatrix4x4, projection); |
2508 | QFETCH(QMatrix4x4, view); |
2509 | QFETCH(QVector2D, result); |
2510 | |
2511 | QVector3D project = point.project(modelView: view, projection, viewport); |
2512 | |
2513 | QCOMPARE(project.toVector2D(), result); |
2514 | } |
2515 | |
2516 | void tst_QVectorND::unproject_data() |
2517 | { |
2518 | QTest::addColumn<QVector3D>(name: "point" ); |
2519 | QTest::addColumn<QRect>(name: "viewport" ); |
2520 | QTest::addColumn<QMatrix4x4>(name: "projection" ); |
2521 | QTest::addColumn<QMatrix4x4>(name: "view" ); |
2522 | QTest::addColumn<QVector3D>(name: "result" ); |
2523 | |
2524 | QMatrix4x4 projection; |
2525 | projection.ortho(left: -1.0f, right: 1.0f, bottom: -1.0f, top: 1.0f, nearPlane: 0.1f, farPlane: 1000.0f); |
2526 | |
2527 | QMatrix4x4 view; |
2528 | // Located at (0, 0, 10), looking at origin, y is up |
2529 | view.lookAt(eye: QVector3D(0.0f, 0.0f, 10.0f), center: QVector3D(0.0f, 0.0f, 0.0f), up: QVector3D(0.0f, 1.0f, 0.0f)); |
2530 | |
2531 | QMatrix4x4 nullMatrix(0.0f, 0.0f, 0.0f, 0.0f, |
2532 | 0.0f, 0.0f, 0.0f, 0.0f, |
2533 | 0.0f, 0.0f, 0.0f, 0.0f, |
2534 | 0.0f, 0.0f, 0.0f, 0.0f); |
2535 | |
2536 | QTest::newRow(dataTag: "center" ) |
2537 | << QVector3D(400.0f, 300.0f, 0.0f) |
2538 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2539 | << projection |
2540 | << view |
2541 | << QVector3D(0.0f, 0.0f, 9.9f); |
2542 | |
2543 | QTest::newRow(dataTag: "topLeft" ) |
2544 | << QVector3D(0.0f, 600.0f, 0.0f) |
2545 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2546 | << projection |
2547 | << view |
2548 | << QVector3D(-1.0f, 1.0f, 9.9f); |
2549 | |
2550 | QTest::newRow(dataTag: "topRight" ) |
2551 | << QVector3D(800.0f, 600.0f, 0.0f) |
2552 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2553 | << projection |
2554 | << view |
2555 | << QVector3D(1.0f, 1.0f, 9.9f); |
2556 | |
2557 | QTest::newRow(dataTag: "bottomLeft" ) |
2558 | << QVector3D(0.0f, 0.0f, 0.0f) |
2559 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2560 | << projection |
2561 | << view |
2562 | << QVector3D(-1.0, -1.0f, 9.9f); |
2563 | |
2564 | QTest::newRow(dataTag: "bottomRight" ) |
2565 | << QVector3D(800.0f, 0.0f, 0.0f) |
2566 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2567 | << projection |
2568 | << view |
2569 | << QVector3D(1.0f, -1.0f, 9.9f); |
2570 | |
2571 | QTest::newRow(dataTag: "nullMatrix" ) |
2572 | << QVector3D(400.0f, 300.0f, 0.0f) |
2573 | << QRect(0.0f, 0.0f, 800.0f, 600.0f) |
2574 | << nullMatrix |
2575 | << nullMatrix |
2576 | << QVector3D(0.0f, 0.0f, -1.0f); |
2577 | |
2578 | } |
2579 | |
2580 | void tst_QVectorND::unproject() |
2581 | { |
2582 | QFETCH(QVector3D, point); |
2583 | QFETCH(QRect, viewport); |
2584 | QFETCH(QMatrix4x4, projection); |
2585 | QFETCH(QMatrix4x4, view); |
2586 | QFETCH(QVector3D, result); |
2587 | |
2588 | QVector3D unproject = point.unproject(modelView: view, projection, viewport); |
2589 | QVERIFY(qFuzzyCompare(unproject, result)); |
2590 | } |
2591 | |
2592 | class tst_QVectorNDProperties : public QObject |
2593 | { |
2594 | Q_OBJECT |
2595 | Q_PROPERTY(QVector2D vector2D READ vector2D WRITE setVector2D) |
2596 | Q_PROPERTY(QVector3D vector3D READ vector3D WRITE setVector3D) |
2597 | Q_PROPERTY(QVector4D vector4D READ vector4D WRITE setVector4D) |
2598 | public: |
2599 | tst_QVectorNDProperties(QObject *parent = 0) : QObject(parent) {} |
2600 | |
2601 | QVector2D vector2D() const { return v2; } |
2602 | void setVector2D(const QVector2D& value) { v2 = value; } |
2603 | |
2604 | QVector3D vector3D() const { return v3; } |
2605 | void setVector3D(const QVector3D& value) { v3 = value; } |
2606 | |
2607 | QVector4D vector4D() const { return v4; } |
2608 | void setVector4D(const QVector4D& value) { v4 = value; } |
2609 | |
2610 | private: |
2611 | QVector2D v2; |
2612 | QVector3D v3; |
2613 | QVector4D v4; |
2614 | }; |
2615 | |
2616 | // Test getting and setting vector properties via the metaobject system. |
2617 | void tst_QVectorND::properties() |
2618 | { |
2619 | tst_QVectorNDProperties obj; |
2620 | |
2621 | obj.setVector2D(QVector2D(1.0f, 2.0f)); |
2622 | obj.setVector3D(QVector3D(3.0f, 4.0f, 5.0f)); |
2623 | obj.setVector4D(QVector4D(6.0f, 7.0f, 8.0f, 9.0f)); |
2624 | |
2625 | QVector2D v2 = qvariant_cast<QVector2D>(v: obj.property(name: "vector2D" )); |
2626 | QCOMPARE(v2.x(), 1.0f); |
2627 | QCOMPARE(v2.y(), 2.0f); |
2628 | |
2629 | QVector3D v3 = qvariant_cast<QVector3D>(v: obj.property(name: "vector3D" )); |
2630 | QCOMPARE(v3.x(), 3.0f); |
2631 | QCOMPARE(v3.y(), 4.0f); |
2632 | QCOMPARE(v3.z(), 5.0f); |
2633 | |
2634 | QVector4D v4 = qvariant_cast<QVector4D>(v: obj.property(name: "vector4D" )); |
2635 | QCOMPARE(v4.x(), 6.0f); |
2636 | QCOMPARE(v4.y(), 7.0f); |
2637 | QCOMPARE(v4.z(), 8.0f); |
2638 | QCOMPARE(v4.w(), 9.0f); |
2639 | |
2640 | obj.setProperty(name: "vector2D" , |
2641 | value: QVariant::fromValue(value: QVector2D(-1.0f, -2.0f))); |
2642 | obj.setProperty(name: "vector3D" , |
2643 | value: QVariant::fromValue(value: QVector3D(-3.0f, -4.0f, -5.0f))); |
2644 | obj.setProperty(name: "vector4D" , |
2645 | value: QVariant::fromValue(value: QVector4D(-6.0f, -7.0f, -8.0f, -9.0f))); |
2646 | |
2647 | v2 = qvariant_cast<QVector2D>(v: obj.property(name: "vector2D" )); |
2648 | QCOMPARE(v2.x(), -1.0f); |
2649 | QCOMPARE(v2.y(), -2.0f); |
2650 | |
2651 | v3 = qvariant_cast<QVector3D>(v: obj.property(name: "vector3D" )); |
2652 | QCOMPARE(v3.x(), -3.0f); |
2653 | QCOMPARE(v3.y(), -4.0f); |
2654 | QCOMPARE(v3.z(), -5.0f); |
2655 | |
2656 | v4 = qvariant_cast<QVector4D>(v: obj.property(name: "vector4D" )); |
2657 | QCOMPARE(v4.x(), -6.0f); |
2658 | QCOMPARE(v4.y(), -7.0f); |
2659 | QCOMPARE(v4.z(), -8.0f); |
2660 | QCOMPARE(v4.w(), -9.0f); |
2661 | } |
2662 | |
2663 | void tst_QVectorND::metaTypes() |
2664 | { |
2665 | QCOMPARE(QMetaType::type("QVector2D" ), int(QMetaType::QVector2D)); |
2666 | QCOMPARE(QMetaType::type("QVector3D" ), int(QMetaType::QVector3D)); |
2667 | QCOMPARE(QMetaType::type("QVector4D" ), int(QMetaType::QVector4D)); |
2668 | |
2669 | QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector2D)), |
2670 | QByteArray("QVector2D" )); |
2671 | QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector3D)), |
2672 | QByteArray("QVector3D" )); |
2673 | QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector4D)), |
2674 | QByteArray("QVector4D" )); |
2675 | |
2676 | QVERIFY(QMetaType::isRegistered(QMetaType::QVector2D)); |
2677 | QVERIFY(QMetaType::isRegistered(QMetaType::QVector3D)); |
2678 | QVERIFY(QMetaType::isRegistered(QMetaType::QVector4D)); |
2679 | |
2680 | QCOMPARE(qMetaTypeId<QVector2D>(), int(QMetaType::QVector2D)); |
2681 | QCOMPARE(qMetaTypeId<QVector3D>(), int(QMetaType::QVector3D)); |
2682 | QCOMPARE(qMetaTypeId<QVector4D>(), int(QMetaType::QVector4D)); |
2683 | } |
2684 | |
2685 | QTEST_APPLESS_MAIN(tst_QVectorND) |
2686 | |
2687 | #include "tst_qvectornd.moc" |
2688 | |