Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 几何svg\U映射器svg原点,我的图像被翻转了吗?_C++_Svg_Boost_Boost Geometry - Fatal编程技术网

C++ 几何svg\U映射器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

我在svg_映射器上有一些奇怪的行为

svg的原点似乎位于左下角,但据我所知,svg的默认原点应该位于左上角。svg_映射器似乎没有任何界面来操作坐标系,因此我很确定我没有错误地配置映射器

下面的代码只是一个示例,我实际上在绘制网格结构,但问题是相同的。我所期望的是一条从左上角(0,0)开始的红线,第二个点稍微向右,然后最后一个点在右下角。但不是,它从左下角到右上角

这是svg_映射器的预期行为还是我没有正确使用它

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)中设置的相同宽度和高度(或至少相同的纵横比)。