1 #include "testlib/testlib_test.h"
2
3 #include "vgl/vgl_ellipse_scan_iterator.h"
4
5 static void
test_circle()6 test_circle()
7 {
8 // Scan convert the unit circle
9 vgl_ellipse_scan_iterator<double> circle1(0, 0, 1, 1, 0);
10 TEST("unit circle", circle1.count(), 5);
11
12 vgl_ellipse_scan_iterator<double> circle2(10, 10, 1, 1, 0);
13 TEST("offset unit circle", circle2.count(), 5);
14
15 vgl_ellipse_scan_iterator<double> circle3(0, 0, 1.001, 1.001, 0.2);
16 TEST("rotated unit circle", circle3.count(), 5);
17
18 vgl_ellipse_scan_iterator<double> circle4(0, 0, 3, 3, 0);
19 TEST("radius 3 circle", circle4.count(), 29);
20
21 vgl_ellipse_scan_iterator<double> circle5(-5, 15, 3, 3, 0);
22 TEST("offset radius 3 circle", circle5.count(), 29);
23
24 vgl_ellipse_scan_iterator<double> circle6(20, 5, 3.001, 3.001, 3.6);
25 TEST("offset, rotated radius 3 circle", circle6.count(), 29);
26 }
27
28 static void
test_ellipse()29 test_ellipse()
30 {
31 // Scan convert simple ellipses
32 vgl_ellipse_scan_iterator<float> ellipse1(0, 0, 1, 2, 0);
33 TEST("centred ellipse radius 1,2", ellipse1.count(), 7);
34
35 vgl_ellipse_scan_iterator<float> ellipse2(10, -10, 2, 1, 0);
36 TEST("offset ellipse radius 2,1", ellipse2.count(), 7);
37
38 vgl_ellipse_scan_iterator<float> ellipse3(0, 0, 2.001f, 1.001f, 0.1f);
39 TEST("centred, rotated ellipse radius 2,1", ellipse3.count(), 5);
40
41 vgl_ellipse_scan_iterator<float> ellipse4(0, 0, 2.001f, 3.001f, -3.14f / 4);
42 TEST("centred, rotated ellipse radius 2,3", ellipse4.count(), 19);
43 }
44
45 static void
test_sliver()46 test_sliver()
47 {
48 vgl_ellipse_scan_iterator<double> ellipse1(0, 0, 0.01, 3, 0);
49 TEST("vertical sliver: 0.01,3", ellipse1.count(), 7);
50
51 vgl_ellipse_scan_iterator<double> ellipse2(0, 0, 2, 0.01, 0);
52 TEST("horizontal sliver: 2,0.01", ellipse2.count(), 5);
53
54 vgl_ellipse_scan_iterator<double> ellipse3(1, -1, 2, 0.01, 0);
55 TEST("shifted horizontal sliver: 2,0.01", ellipse3.count(), 5);
56
57 vgl_ellipse_scan_iterator<double> ellipse4(0, 0, 0.01, 3.001, 1.4);
58 TEST("rotated sliver (3,0.01)", ellipse4.count(), 1);
59 }
60
61
62 static void
test_degenerate()63 test_degenerate()
64 {
65 vgl_ellipse_scan_iterator<float> ellipse1(0.5f, 0.5f, 0.3f, 0.1f, 3.14f);
66 TEST("empty ellipse", ellipse1.count(), 0);
67
68 vgl_ellipse_scan_iterator<float> ellipse2(0, 0, 2, 0, 0);
69 TEST("horizontal line", ellipse2.count(), 5);
70
71 vgl_ellipse_scan_iterator<float> ellipse3(0, 0, 0, 2, 0);
72 TEST("vertical line", ellipse3.count(), 5);
73
74 vgl_ellipse_scan_iterator<float> ellipse4(4, -5, 0, 0, 3.14f);
75 TEST("point at integer coordinates", ellipse4.count(), 1);
76
77 vgl_ellipse_scan_iterator<float> ellipse5(0.1f, 0.1f, 0, 0, 3.14f);
78 TEST("point at non-integer coordinates", ellipse5.count(), 0);
79 }
80
81 static void
test_ellipse_scan_iterator()82 test_ellipse_scan_iterator()
83 {
84 test_circle();
85 test_ellipse();
86 test_sliver();
87 test_degenerate();
88 }
89
90 TESTMAIN(test_ellipse_scan_iterator);
91