我有一些奇怪的行为与svg_mapper。至少我觉得这很奇怪,但我也是新来提升:: geometry,所以我可能会做一些愚蠢的事情。boost :: geometry svg_mapper svg起源,我的图像翻转?
svg的起源似乎位于左下角,但据我所知,一个svg的默认原点应该在左上角。 svg_mapper似乎没有任何操作坐标系的接口,所以我很确定我没有错误地配置我的映射器。
下面的代码只是一个例子,实际上我绘制了一个网格结构,但问题是一样的。我期望的是从左上角开始的一条红线(0,0),第二个点位于右侧,然后是右下角的最后一个位置。但不,它从左下到右上。
这是从svg_mapper的预期行为还是我没有正确使用它?
typedef boost::geometry::model::d2::point_xy<double> point_type;
typedef boost::geometry::model::linestring<point_type> linestring_type;
typedef boost::geometry::svg_mapper<point_type> mapper_type;
std::ofstream svg("map.svg");
mapper_type mapper(svg, 400, 400);
linestring_type ls2{{0.0, 0.0}, {100.0, 0.0}, {400.0, 400.0}};
mapper.add(ls2);
mapper.map(ls2, "stroke:rgb(250,0,0);stroke-width:2");
上面的图片是一个PNG但SVG生成这个样子的:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<polyline points="0,400 100,400 400,0" style="stroke:rgb(250,0,0);stroke-width:2;fill:none"/>
</svg>
编辑>>使用boost 1.61
一个很好的解释。谢谢rhashimoto! 硬编码转换策略有点奇怪,如果你可以用自己的策略替代,本来会很好,但至少现在我知道为什么了:)我会解决它。 – DbgCtrl
注意到svg_mapper的另一个“奇怪”的东西。在正x方向上,所有的东西都被转换成svg宽度的一半。 – DbgCtrl
您应该确保SVG实际上是在HTML页面中绘制的,或者是具有与'svg_mapper'构造函数(示例代码中的400x400)相同的宽度和高度(或至少具有相同宽高比)的任何位置。 – rhashimoto