Масштабировать SVG без изменения его позиции в C ++ - PullRequest
0 голосов
/ 22 ноября 2018

Я сейчас работаю над проектом для моей школы.Мне нужно сделать SVG генератор ландшафта в C ++.Мой учитель дает нам различные функции C ++, которые рисуют svg-формы на output.svg.Затем мы открываем файл в веб-браузере и появляется сгенерированный ландшафт.Его функции пишут теги HTML5 для рисования svg, например <circle> и <polygon>.

Например, функция рисования шестиугольника:

void Svgfile::addHexagone(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,
                      double x5,double y5,double x6,double y6, std::string colorFill){
m_ostrm << "<polygon points=\"" << x1 << "," << y1 << " " << x2 << "," << y2 << " " << x3 << "," << y3
        << " " << x4 << "," << y4 << " " << x5 << "," << y5 << " " << x6 << "," << y6
        << "\" style=\"fill:" << colorFill << "\" ></polygon>";

Проблема в том, что моя программа должна масштабироваться по-разномуКаждый объект SVG моего ландшафта добавляет разнообразия.Я сделал очень простой камень, представленный серым шестиугольником, используя addHexagone.Но <polygon> использует положение 6 точек, и единственный способ найти для него изменение - это умножить каждый x и y каждой точки на переменную *size.Это работает, но это меняет положение моей фигуры, а это не то, что мне нужно.Я прочитал несколько документов об атрибуте ViewBox в SVG, но мне не удалось его использовать.Я также попытался добавить атрибут transform='size(10em)', но ничего не изменилось.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете использовать свойство transform, как в примере:

<svg xmlns="http://www.w3.org/2000/svg" width="200px" height="200px" viewBox="0 0 200 200">
<g>
    <circle cx="20" cy="20" r="10"/>
 </g>
<g transform="scale(2)">
    <circle cx="50" cy="50" r="10"/>
</g>
</svg>
0 голосов
/ 22 ноября 2018

Я не уверен, почему мы должны выполнять ваши задания за вас ...

Очевидно, что вам нужно масштабировать свои очки хагона, прежде чем вы его разместите.Создайте функцию, которая генерирует нужные вам шестигранные точки, а затем вызовите ваш addHexagon() fmethod.

Примерно так:

void generateHexagon(double centreX, double centreY, double hexagonSize, std::string fillColour)
{
  double[][]  pts = new double[6][2];
  for (int step=0; step<6; step++)
  {
    double angle = step * 60f;
    pts[step][0] = centreX + hexagonSize * cos(angle);
    pts[step][1] = centreY + hexagonSize * sin(angle);
  }
  Svgfile::addHexagone(pts[0][0], pts[0][1],
                       pts[1][0], pts[1][1],
                       pts[2][0], pts[2][1],
                       pts[3][0], pts[3][1],
                       pts[4][0], pts[4][1],
                       pts[5][0], pts[5][1],
                       fillColour);
}
0 голосов
/ 22 ноября 2018

Чтобы масштабировать объект без изменения его положения, вы должны сначала найти его положение.Один из способов определить это «центр масс» Найти метод центра масс точек (просто используйте 1 для каждой точки в качестве «массы», так что это простое среднее значение).Как только у вас есть позиция, вычтите ее из всех точек вашего объекта (в данном случае, многоугольника), это приведет к центру масс, расположенному в начале координат, а затем масштабируйте координаты новой точки, как вы это сделали, умножив намасштаб.Затем просто добавьте обратно координаты центра масс к каждой точке вашего объекта, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...