• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry
2 // Unit Test
3 
4 // Copyright (c) 2016-2017 Oracle and/or its affiliates.
5 
6 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
7 
8 // Use, modification and distribution is subject to the Boost Software License,
9 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11 
12 #ifdef TEST_WITH_SVG
13 #include <fstream>
14 #endif
15 
16 #include <sstream>
17 #include <string>
18 
19 #include <boost/variant.hpp>
20 
21 #include <geometry_test_common.hpp>
22 
23 #include <boost/geometry/algorithms/area.hpp>
24 #include <boost/geometry/algorithms/correct.hpp>
25 
26 #include <boost/geometry/geometries/geometries.hpp>
27 #include <boost/geometry/geometries/point_xy.hpp>
28 
29 #include <boost/geometry/io/svg/svg_mapper.hpp>
30 #include <boost/geometry/io/svg/write.hpp>
31 
32 #include <boost/geometry/strategies/strategies.hpp>
33 
34 
35 template <typename R, typename T>
push_back_square(R & rng,T const & mi,T const & ma)36 inline void push_back_square(R & rng, T const& mi, T const& ma)
37 {
38     typedef typename bg::point_type<R>::type P;
39     rng.push_back(P(mi, mi));
40     rng.push_back(P(mi, ma));
41     rng.push_back(P(ma, ma));
42     rng.push_back(P(ma, mi));
43     rng.push_back(P(mi, mi));
44 }
45 
46 template <typename P>
test_all()47 void test_all()
48 {
49     typedef bg::model::box<P> box;
50     typedef bg::model::segment<P> segment;
51     typedef bg::model::linestring<P> linestring;
52     typedef bg::model::ring<P> ring;
53     typedef bg::model::polygon<P> polygon;
54 
55     typedef bg::model::multi_point<P> multi_point;
56     typedef bg::model::multi_linestring<linestring> multi_linestring;
57     typedef bg::model::multi_polygon<polygon> multi_polygon;
58 
59     P pt(0, 0);
60     box b(P(10, 10), P(20, 20));
61     segment s(P(30, 30), P(40, 40));
62 
63     linestring ls;
64     push_back_square(ls, 50, 60);
65 
66     ring r;
67     push_back_square(r, 70, 80);
68 
69     polygon po;
70     push_back_square(po.outer(), 90, 120);
71     po.inners().resize(1);
72     push_back_square(po.inners()[0], 100, 110);
73     bg::correct(po);
74 
75     multi_point m_pt;
76     m_pt.push_back(pt);
77 
78     multi_linestring m_ls;
79     m_ls.push_back(ls);
80 
81     multi_polygon m_po;
82     m_po.push_back(po);
83 
84     boost::variant<P, linestring, polygon> var;
85     linestring lsv;
86     push_back_square(lsv, 130, 140);
87     var = lsv;
88 
89     std::string style = "fill-opacity:0.5;fill:rgb(200,0,0);stroke:rgb(200,0,0);stroke-width:3";
90     std::string m_style = "fill-opacity:0.5;fill:rgb(0,200,0);stroke:rgb(0,200,0);stroke-width:1";
91 
92     {
93 #ifdef TEST_WITH_SVG
94         std::ofstream os("test1.svg", std::ios::trunc);
95 #else
96         std::stringstream os;
97 #endif
98         os << "<?xml version=\"1.0\" standalone=\"no\"?>"
99            << "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">"
100            << "<svg height=\"200\" width=\"200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">";
101 
102         os << bg::svg(pt, style);
103         os << bg::svg(b, style);
104         os << bg::svg(s, style);
105         os << bg::svg(ls, style);
106         os << bg::svg(r, style);
107         os << bg::svg(po, style);
108         os << bg::svg(m_pt, m_style);
109         os << bg::svg(m_ls, m_style);
110         os << bg::svg(m_po, m_style);
111         os << bg::svg(var, style);
112 
113         os << "</svg>";
114     }
115 
116     {
117 #ifdef TEST_WITH_SVG
118         std::ofstream os("test2.svg", std::ios::trunc);
119 #else
120         std::stringstream os;
121 #endif
122         bg::svg_mapper<P> mapper(os, 500, 500);
123         mapper.add(pt);
124         mapper.add(b);
125         mapper.add(s);
126         mapper.add(ls);
127         mapper.add(r);
128         mapper.add(po);
129         mapper.add(m_pt);
130         mapper.add(m_ls);
131         mapper.add(m_po);
132         mapper.add(var);
133 
134         mapper.map(pt, style);
135         mapper.map(b, style);
136         mapper.map(s, style);
137         mapper.map(ls, style);
138         mapper.map(r, style);
139         mapper.map(po, style);
140         mapper.map(m_pt, m_style);
141         mapper.map(m_ls, m_style);
142         mapper.map(m_po, m_style);
143         mapper.map(var, m_style);
144     }
145 }
146 
test_main(int,char * [])147 int test_main(int, char* [])
148 {
149     test_all< boost::geometry::model::d2::point_xy<double> >();
150     test_all< boost::geometry::model::d2::point_xy<int> >();
151 
152 #if defined(HAVE_TTMATH)
153     test_all< boost::geometry::model::d2::point_xy<ttmath_big> >();
154 #endif
155 
156     return 0;
157 }
158