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