boost::geometry svg_mapper svg origin,我的图片翻转了?

boost::geometry svg_mapper svg origin, my image is flipped?

我在使用 svg_mapper 时出现了一些奇怪的行为。

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

您正在获得预期的输出。如果您查看 svg_mapper example 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解释第四个模板参数:

if true map is mirrored upside-down (in most cases pixels are from top to bottom, while map is from bottom to top)

镜像被硬编码到 svg_mapper,因此要生成原点在左上角的 SVG,您需要自己处理。一些可行的方法:

  • 为您的几何体预先应用反射。
  • 编写自己的映射器class
  • Post-处理结果XML.