C++ 几何svg\U映射器svg原点,我的图像被翻转了吗?
我在svg_映射器上有一些奇怪的行为 svg的原点似乎位于左下角,但据我所知,svg的默认原点应该位于左上角。svg_映射器似乎没有任何界面来操作坐标系,因此我很确定我没有错误地配置映射器 下面的代码只是一个示例,我实际上在绘制网格结构,但问题是相同的。我所期望的是一条从左上角(0,0)开始的红线,第二个点稍微向右,然后最后一个点在右下角。但不是,它从左下角到右上角 这是svg_映射器的预期行为还是我没有正确使用它C++ 几何svg\U映射器svg原点,我的图像被翻转了吗?,c++,svg,boost,boost-geometry,C++,Svg,Boost,Boost Geometry,我在svg_映射器上有一些奇怪的行为 svg的原点似乎位于左下角,但据我所知,svg的默认原点应该位于左上角。svg_映射器似乎没有任何界面来操作坐标系,因此我很确定我没有错误地配置映射器 下面的代码只是一个示例,我实际上在绘制网格结构,但问题是相同的。我所期望的是一条从左上角(0,0)开始的红线,第二个点稍微向右,然后最后一个点在右下角。但不是,它从左下角到右上角 这是svg_映射器的预期行为还是我没有正确使用它 typedef boost::geometry::model::d2::poin
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");
typedef boost::geometry::model::d2::point\u xy point\u type;
typedef boost::geometry::model::linestring linestring_type;
typedef boost::geometry::svg_mapper_mapper_type;
std::流svg(“map.svg”);
映射器_型映射器(svg,400400);
linestring_类型ls2{{0.0,0.0},{100.0,0.0},{400.0,400.0};
mapper.add(ls2);
地图(ls2,“笔划:rgb(250,0,0);笔划宽度: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_映射器及其输出,可以看到生成的图形的原点位于左下角
有关如何发生的详细信息,请参见定义转换器的部分:
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;
typedef策略::转换::映射\u转换器
<
计算类型:,
几何体::尺寸::类型::值,
几何体::尺寸::类型::值,
true,//transformer\u type;
说明了第四个模板参数:
如果真贴图倒转镜像(在大多数情况下,像素从顶部开始)
到底部,而贴图是从下到上)
镜像被硬编码到svg\u mapper
,因此要生成原点位于左上角的svg,您需要自己处理。一些可能的方法可以做到这一点:
- 将反射预应用于几何体
- 编写自己的映射器类
- 对生成的XML进行后期处理
您将获得预期的输出。如果查看文档页面底部的
svg_映射器及其输出,可以看到生成的图形的原点位于左下角
有关如何发生的详细信息,请参见定义转换器的部分:
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;
typedef策略::转换::映射\u转换器
<
计算类型:,
几何体::尺寸::类型::值,
几何体::尺寸::类型::值,
true,//transformer\u type;
说明了第四个模板参数:
如果真贴图倒转镜像(在大多数情况下,像素从顶部开始)
到底部,而贴图是从下到上)
镜像被硬编码到svg\u mapper
,因此要生成原点位于左上角的svg,您需要自己处理。一些可能的方法可以做到这一点:
- 将反射预应用于几何体
- 编写自己的映射器类
- 对生成的XML进行后期处理
一个很好的解释。谢谢你rhashimoto!对于硬编码的转换策略有点奇怪,如果您可以替换您自己的策略,那就好了,但至少现在我知道了原因:)我会解决它。注意到svg_映射器的另一个“奇怪”的地方。所有内容都在正x方向上转换为svg宽度的一半。您应该确保svg实际绘制在HTML页面中或任何位置,其宽度和高度(或至少具有相同的纵横比)与svg\u映射器
构造函数(示例代码中为400x400)中设置的宽度和高度相同。这是一个很好的解释。谢谢你rhashimoto!对于硬编码的转换策略有点奇怪,如果您可以替换您自己的策略,那就好了,但至少现在我知道了原因:)我会解决它。注意到svg_映射器的另一个“奇怪”的地方。所有内容都在正x方向上转换为svg宽度的一半。您应该确保svg实际绘制在HTML页面中,或者在任何地方,具有与svg\u映射器
构造函数(示例代码中为400x400)中设置的相同宽度和高度(或至少相同的纵横比)。