Changeset View
Changeset View
Standalone View
Standalone View
libs/image/tests/kis_distance_information_test.cpp
- This file was added.
1 | #include "kis_distance_information_test.h" | ||||
---|---|---|---|---|---|
2 | | ||||
3 | #include <QTest> | ||||
4 | #include <QDomDocument> | ||||
5 | #include <QDomElement> | ||||
6 | #include <QPointF> | ||||
7 | | ||||
8 | #include "kis_algebra_2d.h" | ||||
9 | #include "kis_distance_information.h" | ||||
10 | #include "kis_paint_information.h" | ||||
11 | | ||||
12 | void KisDistanceInformationTest::testInitInfo() | ||||
13 | { | ||||
14 | // Test equality checking operators. | ||||
15 | testInitInfoEquality(); | ||||
16 | | ||||
17 | // Test XML cloning. | ||||
18 | testInitInfoXMLClone(); | ||||
19 | } | ||||
20 | | ||||
21 | void KisDistanceInformationTest::testInterpolation() | ||||
22 | { | ||||
23 | // Set up a scenario for interpolation. | ||||
24 | | ||||
25 | QPointF startPos; | ||||
26 | QPointF endPos(100.0, -50.0); | ||||
27 | qreal dist = KisAlgebra2D::norm(endPos - startPos); | ||||
28 | | ||||
29 | qreal startTime = 0.0; | ||||
30 | qreal endTime = 1000.0; | ||||
31 | qreal interval = endTime - startTime; | ||||
32 | | ||||
33 | KisPaintInformation p1(startPos, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, startTime, 0.0); | ||||
34 | KisPaintInformation p2(endPos, 1.0, 0.0, 0.0, 5.0, 0.0, 1.0, endTime, 0.0); | ||||
35 | | ||||
36 | // Test interpolation with various spacing settings. | ||||
37 | | ||||
38 | static const qreal interpTolerance = 0.000001; | ||||
39 | | ||||
40 | KisDistanceInformation dist1; | ||||
41 | dist1.setSpacing(KisSpacingInformation(dist/10.0)); | ||||
42 | testInterpolationImpl(p1, p2, dist1, 1.0/10.0, false, interpTolerance); | ||||
43 | | ||||
44 | KisDistanceInformation dist2(interval/2.0); | ||||
45 | dist2.setSpacing(KisSpacingInformation(dist*2.0, interval*1.5)); | ||||
46 | testInterpolationImpl(p1, p2, dist2, -1.0, true, interpTolerance); | ||||
47 | | ||||
48 | KisDistanceInformation dist3(interval*1.1); | ||||
49 | dist3.setSpacing(KisSpacingInformation(dist/40.0)); | ||||
50 | testInterpolationImpl(p1, p2, dist3, 1.0/40.0, false, interpTolerance); | ||||
51 | | ||||
52 | KisDistanceInformation dist4; | ||||
53 | dist4.setSpacing(KisSpacingInformation(false, 1.0, false, 1.0)); | ||||
54 | testInterpolationImpl(p1, p2, dist4, -1.0, false, interpTolerance); | ||||
55 | | ||||
56 | KisDistanceInformation dist5; | ||||
57 | dist5.setSpacing(KisSpacingInformation(false, 1.0, true, interval/20.0)); | ||||
58 | testInterpolationImpl(p1, p2, dist5, 1.0/20.0, false, interpTolerance); | ||||
59 | | ||||
60 | KisDistanceInformation dist6; | ||||
61 | dist6.setSpacing(KisSpacingInformation(true, dist/10.0, true, interval/15.0)); | ||||
62 | testInterpolationImpl(p1, p2, dist6, 1.0/15.0, false, interpTolerance); | ||||
63 | | ||||
64 | KisDistanceInformation dist7; | ||||
65 | dist7.setSpacing(KisSpacingInformation(true, dist/15.0, true, interval/10.0)); | ||||
66 | testInterpolationImpl(p1, p2, dist7, 1.0/15.0, false, interpTolerance); | ||||
67 | | ||||
68 | KisDistanceInformation dist8; | ||||
69 | dist8.setSpacing(KisSpacingInformation(true, dist * 2.0, true, interval * 1.5)); | ||||
70 | testInterpolationImpl(p1, p2, dist8, -1.0, false, interpTolerance); | ||||
71 | | ||||
72 | KisDistanceInformation dist9; | ||||
73 | qreal a = 50.0; | ||||
74 | qreal b = 25.0; | ||||
75 | dist9.setSpacing(KisSpacingInformation(QPointF(a * 2.0, b * 2.0), 0.0, false)); | ||||
76 | // Compute the expected interpolation factor; we are using anisotropic spacing here. | ||||
77 | qreal angle = KisAlgebra2D::directionBetweenPoints(startPos, endPos, 0.0); | ||||
78 | qreal cosTermSqrt = qCos(angle) / a; | ||||
79 | qreal sinTermSqrt = qSin(angle) / b; | ||||
80 | qreal spacingDist = 2.0 / qSqrt(cosTermSqrt * cosTermSqrt + sinTermSqrt * sinTermSqrt); | ||||
81 | qreal expectedInterp = spacingDist / dist; | ||||
82 | testInterpolationImpl(p1, p2, dist9, expectedInterp, false, interpTolerance); | ||||
83 | } | ||||
84 | | ||||
85 | void KisDistanceInformationTest::testInitInfoEquality() const | ||||
86 | { | ||||
87 | KisDistanceInitInfo info1; | ||||
88 | KisDistanceInitInfo info2; | ||||
89 | QVERIFY(info1 == info2); | ||||
90 | QVERIFY(!(info1 != info2)); | ||||
91 | | ||||
92 | KisDistanceInitInfo info3(0.1); | ||||
93 | KisDistanceInitInfo info4(0.1); | ||||
94 | QVERIFY(info3 == info4); | ||||
95 | QVERIFY(!(info3 != info4)); | ||||
96 | | ||||
97 | KisDistanceInitInfo info5(QPointF(1.1, -10.7), 100.0, 3.3); | ||||
98 | KisDistanceInitInfo info6(QPointF(1.1, -10.7), 100.0, 3.3); | ||||
99 | QVERIFY(info5 == info6); | ||||
100 | QVERIFY(!(info5 != info6)); | ||||
101 | | ||||
102 | KisDistanceInitInfo info7(QPointF(-12.3, 24.0), 104.0, 5.0, 20.1); | ||||
103 | KisDistanceInitInfo info8(QPointF(-12.3, 24.0), 104.0, 5.0, 20.1); | ||||
104 | QVERIFY(info7 == info8); | ||||
105 | QVERIFY(!(info7 != info8)); | ||||
106 | | ||||
107 | QVERIFY(info1 != info3); | ||||
108 | QVERIFY(info1 != info5); | ||||
109 | QVERIFY(info1 != info7); | ||||
110 | QVERIFY(info3 != info5); | ||||
111 | QVERIFY(info3 != info7); | ||||
112 | QVERIFY(info5 != info7); | ||||
113 | } | ||||
114 | | ||||
115 | void KisDistanceInformationTest::testInitInfoXMLClone() const | ||||
116 | { | ||||
117 | // Note: Numeric values used here must be values that get serialized to XML exactly (e.g. small | ||||
118 | // integers). Otherwise, roundoff error in serialization may cause a failure. | ||||
119 | | ||||
120 | KisDistanceInitInfo info1; | ||||
121 | QDomDocument doc; | ||||
122 | QDomElement elt1 = doc.createElement("Test1"); | ||||
123 | info1.toXML(doc, elt1); | ||||
124 | KisDistanceInitInfo clone1 = KisDistanceInitInfo::fromXML(elt1); | ||||
125 | QVERIFY(clone1 == info1); | ||||
126 | | ||||
127 | KisDistanceInitInfo info2(40.0); | ||||
128 | QDomElement elt2 = doc.createElement("Test2"); | ||||
129 | info2.toXML(doc, elt2); | ||||
130 | KisDistanceInitInfo clone2 = KisDistanceInitInfo::fromXML(elt2); | ||||
131 | QVERIFY(clone2 == info2); | ||||
132 | | ||||
133 | KisDistanceInitInfo info3(QPointF(-8.0, -5.0), 0.0, 60.0); | ||||
134 | QDomElement elt3 = doc.createElement("Test3"); | ||||
135 | info3.toXML(doc, elt3); | ||||
136 | KisDistanceInitInfo clone3 = KisDistanceInitInfo::fromXML(elt3); | ||||
137 | QVERIFY(clone3 == info3); | ||||
138 | | ||||
139 | KisDistanceInitInfo info4(QPointF(0.0, 9.0), 10.0, 6.0, 1.0); | ||||
140 | QDomElement elt4 = doc.createElement("Test4"); | ||||
141 | info4.toXML(doc, elt4); | ||||
142 | KisDistanceInitInfo clone4 = KisDistanceInitInfo::fromXML(elt4); | ||||
143 | QVERIFY(clone4 == info4); | ||||
144 | } | ||||
145 | | ||||
146 | void KisDistanceInformationTest::testInterpolationImpl(const KisPaintInformation &p1, | ||||
147 | const KisPaintInformation &p2, | ||||
148 | KisDistanceInformation &dist, | ||||
149 | qreal interpFactor, | ||||
150 | bool needSpacingUpdate, | ||||
151 | qreal interpTolerance) const | ||||
152 | { | ||||
153 | qreal actualInterpFactor = dist.getNextPointPosition(p1.pos(), p2.pos(), p1.currentTime(), | ||||
154 | p2.currentTime()); | ||||
155 | QVERIFY(qAbs(interpFactor - actualInterpFactor) <= interpTolerance); | ||||
156 | QCOMPARE(dist.needsSpacingUpdate(), needSpacingUpdate); | ||||
157 | } | ||||
158 | | ||||
159 | QTEST_MAIN(KisDistanceInformationTest) |