2016-07-09 2 views
0

У меня возникло странное поведение с помощью svg_mapper. По крайней мере, я думаю, что это странно, но я также новичок в повышении геометрии, поэтому я мог бы делать что-то глупое.boost :: geometry svg_mapper svg origin, мое изображение перевернуто?

Происхождение 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> 

Edit >> Использование подталкивание 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

Отличное объяснение. Спасибо, рашимото! Немного странно с жестко закодированной стратегией преобразования, было бы хорошо, если бы вы могли подменить свою собственную стратегию, но по крайней мере теперь я знаю, почему :) Я буду работать вокруг нее. – DbgCtrl

+0

Заметил еще одну «странную» вещь с помощью svg_mapper. Все преобразуется в половину ширины svg в положительном x направлении. – DbgCtrl

+0

Вы должны убедиться, что SVG действительно нарисован на вашей HTML-странице или везде с одинаковой шириной и высотой (или, по крайней мере, с тем же соотношением сторон), что и в конструкторе 'svg_mapper' (400x400 в вашем примере кода). – rhashimoto

Смежные вопросы