флип СВГ системы координат

есть ли способ перевернуть систему координат SVG так, чтобы [0,0] находился в левом нижнем углу вместо верхнего левого?

8 ответов


Я провел много экспериментов, и единственный логический метод заключается в следующем:

<g transform="translate(0,400)">
<g transform="scale(1,-1)">

где 400-высота изображения. Что это делает, он перемещает все вниз, так что верхняя часть изображения теперь и нижняя часть изображения, а затем операция масштабирования переворачивает координаты Y, так что бит, который теперь находится вне страницы/изображения, переворачивается назад, чтобы заполнить оставшееся пространство.


Я знаю, что это старый, но я делал то же самое, пробовал версию @Nippysaurus, но это слишком раздражает, так как все будет вращаться (так что если вы поместите изображения, вам придется повернуть их обратно). Есть еще одно решение, хотя

то, что я сделал, было просто переместить окно просмотра svg и инвертировать все координаты на оси y (и удалить высоту объекта, чтобы быть в левом нижнем углу на нем тоже), например:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="300" viewBox="0 -300 200 300">
  <rect x="20" y="-40" width="20" height="20" stroke="black" stroke-width="1px"></rect>
</svg>

это поставит rect в 20,20 из нижнего левого угла svg см. http://jsfiddle.net/DUVGz/


да, координатное вращение -90 с последующим переводом + высоты вашей новой фигуры должно это сделать. Есть пример в W3C по.


лучшее все вокруг комбо, которое я нашел для преобразования в декартову систему координат, довольно просто:

в CSS

svg.cartesian {
  display:flex;
}

svg.cartesian > g {
  transform: scaleY(-1);
}

svg.cartesian > g text {
  transform: scaleY(-1);
}
<html>
  <head></head>
  <body>

<svg class="cartesian" viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet">
  <g>
    
    <path d="M0 -100 V 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
    <path d="M-100 0 H 200" stroke="green" stroke-width="0.5" stroke-opacity="0.5" />
    
    <g transform="translate(20, 20)">
      <circle r="1" />
      <text>(20, 20)</text>
    </g>
    
    
    <g transform="translate(-50, -35)">
      <circle r="0.5" />
      <text>(-50, -35)</text>
    </g>
      
  </g>
</svg>
    
    </body>
  </html>

это автоматически разблокирует все текстовые элементы на странице через css scaleY(-1).


<g transform="translate(0,400) scale(1,-1)">

что также эквивалентно ниже

<g transform="scale(1,-1) translate(0,-400) ">

Если вы не знаете размер svg, чем вы можете использовать преобразования CSS для всего элемента SVG:

#parrot {
    transform-origin: 50% 50%; /* center of rotation is set to the center of the element */
    transform: scale(1,-1);
}

кредиты: https://sarasoueidan.com/blog/svg-transformations/#transforming-svgs-with-css


альтернативой является использование D3 v4 scaleLinear чтобы создать функцию, которая будет выполнять замену для вас.

import * as d3 from "d3";

...

// Set the height to the actual value to where you want to shift the coords.
// Most likely based on the size of the element it is contained within
let height = 1; 
let y = d3.scaleLinear()
  .domain([0,1])
  .range([height,0]);

console.log("0 = " + y(0));       // = 1
console.log("0.5 = " + y(0.5));   // = 0.5
console.log("1 = " + y(1));       // = 0
console.log("100 = " + y(100));   // = -99
console.log("-100 = " + y(-100)); // = 101

посмотреть runable код через тоник


Я думаю, что самый простой способ повернуть элемент на 180 ° - это повернуть на 180,1°;

transform= " перевести(180.1,0,0)"