2016-07-09 24 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