mirror of
https://github.com/boostorg/geometry.git
synced 2025-05-09 23:24:02 +00:00
[svg] Add scale function and examples of it
This commit is contained in:
parent
ee3509f2f3
commit
1c06875105
BIN
doc/html/img/io/svg_mapper_scale.png
Normal file
BIN
doc/html/img/io/svg_mapper_scale.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
@ -151,6 +151,7 @@
|
|||||||
[import src/examples/geometries/register/multi_polygon.cpp]
|
[import src/examples/geometries/register/multi_polygon.cpp]
|
||||||
|
|
||||||
[import src/examples/io/svg.cpp]
|
[import src/examples/io/svg.cpp]
|
||||||
|
[import src/examples/io/svg_mapper_scale.cpp]
|
||||||
[import src/examples/io/wkt.cpp]
|
[import src/examples/io/wkt.cpp]
|
||||||
[import src/examples/io/read_wkt.cpp]
|
[import src/examples/io/read_wkt.cpp]
|
||||||
|
|
||||||
|
@ -12,5 +12,9 @@
|
|||||||
[svg_mapper]
|
[svg_mapper]
|
||||||
[svg_mapper_output]
|
[svg_mapper_output]
|
||||||
|
|
||||||
|
[heading Example with arrows and groups]
|
||||||
|
[svg_mapper_scale]
|
||||||
|
[svg_mapper_scale_output]
|
||||||
|
|
||||||
[heading See also]
|
[heading See also]
|
||||||
* [link geometry.reference.io.svg.svg The SVG manipulator]
|
* [link geometry.reference.io.svg.svg The SVG manipulator]
|
||||||
|
@ -15,5 +15,6 @@ project boost-geometry-doc-example-io
|
|||||||
;
|
;
|
||||||
|
|
||||||
exe svg : svg.cpp ;
|
exe svg : svg.cpp ;
|
||||||
|
exe svg_mapper_scale : svg_mapper_scale.cpp ;
|
||||||
exe wkt : wkt.cpp ;
|
exe wkt : wkt.cpp ;
|
||||||
exe read_wkt : read_wkt.cpp ;
|
exe read_wkt : read_wkt.cpp ;
|
||||||
|
@ -37,7 +37,7 @@ int main()
|
|||||||
std::ofstream svg("my_map.svg");
|
std::ofstream svg("my_map.svg");
|
||||||
boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400);
|
boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400);
|
||||||
|
|
||||||
// Add geometries such that all these geometries fit on the map
|
// Add geometries such that all these geometries fit exactly on the map
|
||||||
mapper.add(a);
|
mapper.add(a);
|
||||||
mapper.add(b);
|
mapper.add(b);
|
||||||
mapper.add(c);
|
mapper.add(c);
|
||||||
|
75
doc/src/examples/io/svg_mapper_scale.cpp
Normal file
75
doc/src/examples/io/svg_mapper_scale.cpp
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
// Boost.Geometry
|
||||||
|
// QuickBook Example
|
||||||
|
|
||||||
|
// Copyright (c) 2020 Barend Gehrels, Amsterdam, the Netherlands.
|
||||||
|
|
||||||
|
// Use, modification and distribution is subject to the Boost Software License,
|
||||||
|
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
//[svg_mapper_scale
|
||||||
|
//` Shows the usage of svg_mapper with the scale function
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include <boost/geometry.hpp>
|
||||||
|
#include <boost/geometry/geometries/point_xy.hpp>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// Specify the basic type
|
||||||
|
using point_type = boost::geometry::model::d2::point_xy<double>;
|
||||||
|
|
||||||
|
// Declare linestrings and set their values
|
||||||
|
boost::geometry::model::linestring<point_type> a, b, c;
|
||||||
|
a.push_back({1, 0});
|
||||||
|
a.push_back({3, 3});
|
||||||
|
|
||||||
|
b.push_back({5, 0});
|
||||||
|
b.push_back({3, 2});
|
||||||
|
|
||||||
|
c.push_back({4, 5});
|
||||||
|
c.push_back({3, 4});
|
||||||
|
|
||||||
|
// Declare a stream and an SVG mapper
|
||||||
|
std::ofstream svg("my_map.svg");
|
||||||
|
boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400);
|
||||||
|
|
||||||
|
// Add geometries such that all these geometries fit exactly on the map
|
||||||
|
mapper.add(a);
|
||||||
|
mapper.add(b);
|
||||||
|
mapper.add(c);
|
||||||
|
|
||||||
|
// Zoom out 5% to have a bit margin around the geometries
|
||||||
|
// This also forces writing the SVG header.
|
||||||
|
mapper.scale(0.95);
|
||||||
|
|
||||||
|
// Write a marker definition.
|
||||||
|
svg << "<defs>";
|
||||||
|
svg << "<marker id=\"arrowhead\" markerWidth=\"5\" markerHeight=\"3.5\""
|
||||||
|
" refX=\"0\" refY=\"1.75\" orient=\"auto\">"
|
||||||
|
" <polygon points=\"0 0, 5 1.75, 0 3.5\"/></marker>";
|
||||||
|
svg << "</defs>";
|
||||||
|
|
||||||
|
// Group the first two geometries
|
||||||
|
svg << "<g>";
|
||||||
|
mapper.map(a, "opacity:0.5;stroke-width:1;stroke:gray;marker-end:url(#arrowhead)");
|
||||||
|
mapper.map(b, "opacity:0.5;stroke-width:3;stroke:gray;marker-end:url(#arrowhead)");
|
||||||
|
svg << "</g>";
|
||||||
|
|
||||||
|
mapper.map(c, "opacity:0.5;stroke-width:5;stroke:red;marker-end:url(#arrowhead)");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//]
|
||||||
|
|
||||||
|
|
||||||
|
//[svg_mapper_scale_output
|
||||||
|
/*`
|
||||||
|
Output:
|
||||||
|
|
||||||
|
[$img/io/svg_mapper_scale.png]
|
||||||
|
*/
|
||||||
|
//]
|
@ -368,6 +368,35 @@ public :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Optional step, zoom in or zoom out, and forces writing the header. After writing the
|
||||||
|
transformation, geometries should not be added, and mapping can begin. After writing the
|
||||||
|
header, other SVG elements can be streamed (for example defs) which can later be used
|
||||||
|
in styles.
|
||||||
|
Call this function after add and before map or text.
|
||||||
|
\param scale A value larger than 1.0 zooms in, a value smaller than 1.0 zooms out.
|
||||||
|
A scale of 1.0 doesn't change any scaling, but still writes the SVG header.
|
||||||
|
*/
|
||||||
|
void scale(double scale = 1.0)
|
||||||
|
{
|
||||||
|
if (scale != 1.0 && scale > 0)
|
||||||
|
{
|
||||||
|
// Zoom out (scale < 1) or zoom in (scale > 1).
|
||||||
|
// Typically, users might specify 0.95, to have a small margin around their geometries.
|
||||||
|
auto& b = m_bounding_box;
|
||||||
|
auto const w = geometry::get<1, 0>(b) - geometry::get<0, 0>(b);
|
||||||
|
auto const h = geometry::get<1, 1>(b) - geometry::get<0, 1>(b);
|
||||||
|
|
||||||
|
auto const& m = std::max(w, h) * (1.0 - scale);
|
||||||
|
geometry::set<0, 0>(b, geometry::get<0, 0>(b) - m);
|
||||||
|
geometry::set<0, 1>(b, geometry::get<0, 1>(b) - m);
|
||||||
|
geometry::set<1, 0>(b, geometry::get<1, 0>(b) + m);
|
||||||
|
geometry::set<1, 1>(b, geometry::get<1, 1>(b) + m);
|
||||||
|
}
|
||||||
|
|
||||||
|
init_matrix();
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Maps a geometry into the SVG map using the specified style
|
\brief Maps a geometry into the SVG map using the specified style
|
||||||
\tparam Geometry \tparam_geometry
|
\tparam Geometry \tparam_geometry
|
||||||
|
@ -131,6 +131,8 @@ void test_all()
|
|||||||
mapper.add(m_po);
|
mapper.add(m_po);
|
||||||
mapper.add(var);
|
mapper.add(var);
|
||||||
|
|
||||||
|
mapper.scale(0.95);
|
||||||
|
|
||||||
mapper.map(pt, style);
|
mapper.map(pt, style);
|
||||||
mapper.map(b, style);
|
mapper.map(b, style);
|
||||||
mapper.map(s, style);
|
mapper.map(s, style);
|
||||||
|
@ -259,11 +259,11 @@ inline void geom_to_svg(std::string const& wkt1, std::string const& wkt2, std::s
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct to_svg_assign_policy
|
struct to_svg_assign_policy
|
||||||
: boost::geometry::detail::overlay::assign_null_policy
|
|
||||||
{
|
{
|
||||||
static bool const include_no_turn = false;
|
static bool const include_no_turn = false;
|
||||||
static bool const include_degenerate = false;
|
static bool const include_degenerate = false;
|
||||||
static bool const include_opposite = false;
|
static bool const include_opposite = false;
|
||||||
|
static bool const include_start_turn = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename G>
|
template <typename G>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user