2016-07-09 32 views
0

我有一些奇怪的行为与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"); 

enter image description here

上面的图片是一个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

回答

2

你得到预期的输出。如果您查看文档页面底部的svg_mapperexample program及其输出,则可以看到生成的图形的起点位于左下角。

如何出现这种情况的细节是在它定义了一个变压器svg_mapper class

typedef strategy::transform::map_transformer 
    < 
     calculation_type, 
     geometry::dimension<Point>::type::value, 
     geometry::dimension<Point>::type::value, 
     true, // <== Mirror in Y direction!!! 
     SameScale 
    > transformer_type; 

map_transformer documentation解释第四模板参数:

如果真图镜像颠倒(在大多数情况下,像素从顶部 到底部,而地图从底部到顶部)

镜像被硬编码为svg_mapper,所以为了制作SVG的原点位于左上方,您需要自己处理。一些可能的方法来做到这一点:

  • 预先应用反射到你的几何。
  • 编写您自己的映射器类
  • 后处理生成的XML。
+0

一个很好的解释。谢谢rhashimoto! 硬编码转换策略有点奇怪,如果你可以用自己的策略替代,本来会很好,但至少现在我知道为什么了:)我会解决它。 – DbgCtrl

+0

注意到svg_mapper的另一个“奇怪”的东西。在正x方向上,所有的东西都被转换成svg宽度的一半。 – DbgCtrl

+0

您应该确保SVG实际上是在HTML页面中绘制的,或者是具有与'svg_mapper'构造函数(示例代码中的400x400)相同的宽度和高度(或至少具有相同宽高比)的任何位置。 – rhashimoto