2016-07-09 7 views
0

Ich habe ein seltsames Verhalten mit dem Svg_mapper. Zumindest finde ich es seltsam, aber ich bin auch neu bei boost :: geometry, also könnte ich etwas Dummes machen.boost :: Geometrie Svg_mapper Svg Herkunft, mein Bild ist umgedreht?

Der Ursprung des Svg scheint in der unteren linken Ecke zu liegen, aber soweit ich weiß, sollte ein Svg seinen Standardursprung in der oberen linken Ecke haben. Der svg_mapper scheint keine Schnittstelle zu haben, um das Koordinatensystem zu manipulieren, so dass ich ziemlich sicher bin, dass ich meinen Mapper nicht falsch konfiguriert habe.

Der folgende Code ist nur ein Beispiel, ich zeichne tatsächlich eine Gitterstruktur, aber das Problem ist das gleiche. Was ich davon erwarte, ist eine rote Linie, die oben links (0,0) beginnt, ein zweiter Punkt ein bisschen nach rechts und dann der letzte Punkt in der unteren rechten Ecke. Aber nein, es geht von links unten nach rechts oben.

Ist dieses erwartete Verhalten von der Svg_mapper oder verwende ich es nicht richtig?

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

Das obige Bild ist ein png, aber der SVG erzeugt sieht wie folgt aus:

<?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> 

Bearbeiten >> Mit Boost 1,61

Antwort

2

Sie die erwartete Ausgabe bekommen. Wenn Sie sich die svg_mapperexample program und ihre Ausgabe am unteren Rand der Dokumentationsseite ansehen, können Sie sehen, dass die erstellte Zeichnung ihren Ursprung unten links hat.

Die Details, wie das geschieht, sind in der svg_mapper class wo es einen Transformator definiert:

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; 

Die map_transformer documentation erklärt die vierte Vorlage Argument:

wenn sie wahr Karte upside-down gespiegelt (in den meisten Fällen sind die Pixel von oben nach unten, während die Karte von unten nach oben verläuft)

Die Spiegelung ist fest in svg_mapper codiert, so dass SVGs mit dem Ursprung oben links erstellt werden müssen, müssen Sie selbst damit umgehen. Einige Möglichkeiten, dies zu tun:

  • Eine Reflektion auf Ihre Geometrie anwenden.
  • Schreiben Sie Ihre eigene Mapper-Klasse
  • Post-Prozess das resultierende XML.
+0

Eine ausgezeichnete Erklärung. Danke rhashimoto! Ein bisschen seltsam mit einer hart codierten Transformationsstrategie, wäre schön gewesen, wenn Sie Ihre eigene Strategie ersetzen könnten, aber jetzt weiß ich zumindest warum :) Ich werde es umgehen. – DbgCtrl

+0

bemerkte eine andere "seltsame" Sache mit dem Svg_mapper. Alles ist in positiver x-Richtung halb so groß wie die svg-Breite. – DbgCtrl

+0

Sie sollten sicherstellen, dass das SVG tatsächlich in Ihrer HTML-Seite gezeichnet wird oder wo die gleiche Breite und Höhe (oder mindestens das gleiche Seitenverhältnis) wie im Konstruktor 'svg_mapper' (400x400 in Ihrem Beispielcode). – rhashimoto