Я решил проблему, но я (пока) не могу дать вам исчерпывающего объяснения, почему она работает.
Первое, что нужно знать, это то, что вы можете цепочка SVG-преобразования .
Итак, где бы вы ни писали transform="scale(2)"
, вы можете добавить translate(x, y)
в цепочку, например:
transform="scale(2) translate(x, y)"
Пока что, так хорошо ... но если scale
равно 2
, то какие значения мы должны дать x
и y
из translate
?
Чтобы выяснить, я решил наложить большее и добавьте меньшие масштабированные версии вашей SVG-фигуры (по одной для каждого цвета радуги) и посмотрите, какие образцы я смог найти.
Поверх вашей серой фигуры я поместил идентичный размер зеленая форма.
Я дал зеленую форму преобразование:
transform="scale(1) translate(0, 0)"
, чтобы оно было в точности совпадать с вашим оригиналом серый форма.
Затем я приступил к наложению крупномасштабных версий ( желтый , оранжевый , красный ) и наложение меньших масштабированных версий ( синий , инди go, фиолетовый ).
Я предсказал что x
и y
в каждом случае будут относиться к коэффициенту scale
, применяемому к этой форме, а также к общему размеру исходного viewBox
.
С 3 меньшими версиями и 3 большими версиями возникла модель:
- Красный ,
8
больше / x
& y
Значение преобразования 50% of ((1000 / 8) - 1000)
- Оранжевый , * в 1071 * раз больше /
x
& y
Значение преобразования 50% of ((1000 / 4) - 1000)
- Желтый ,
2
раз больше / x
& y
значение преобразования 50% of ((1000 / 2) - 1000)
- Зеленый ,
1
больше / x
& y
значение преобразования 50% of ((1000 / 1) - 1000)
- Синий , * в 1095 * раз больше /
x
& y
Значение преобразования 50% of ((1000 / 0.5) - 1000)
- Инди go,
0.25
раз как большое / x
& y
значение преобразования равно 50% of ((1000 / 0.25) - 1000)
- Фиолетовый , * 1 В 111 * раз больше /
x
& y
значение преобразования равно 50% of ((1000 / 0.125) - 1000)
Исходя из этого, мы можем заключить, что если вы располагаете фигуру с центром в 50%, 50%
вашего viewBox
и вы хотите отобразить фигуру в той же позиции с помощью scale(2)
, вы должны также применить translate
для x
из:
50% of ((width of canvas / scale-factor) - (width of canvas))
где 50%
соответствует позиции x
, по которой вы хотите центрировать фигуру.
И translate
для y
из:
50% of ((height of canvas / scale-factor) - (height of canvas))
, где 50%
соответствует y
положение, в котором вы хотите центрировать фигуру.
Это работает последовательно, но я еще не потратил достаточно времени на его изучение, чтобы правильно понять, почему.
Рабочий пример :
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
<!-- Grey Original -->
<path fill="#555" d="M500 500 400 400 400 600 600 600 600 400z" />
<!-- Red Transform [50% of ((1000 / 8) - 1000) is -437.5] -->
<path fill="rgb(255, 0, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(8) translate(-437.5, -437.5)" />
<!-- Orange Transform [50% of ((1000 / 4) - 1000) is -375] -->
<path fill="rgb(255, 125, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(4) translate(-375, -375)" />
<!-- Yellow Transform [50% of ((1000 / 2) - 1000) is -250] -->
<path fill="rgb(255, 255, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(2) translate(-250, -250)" />
<!-- Green Transform [50% of ((1000 / 1) - 1000) is 0] -->
<path fill="rgb(0, 125, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(1) translate(0, 0)" />
<!-- Blue Transform [50% of ((1000 / 0.5) - 1000) is 500] -->
<path fill="rgb(0, 0, 125)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(0.5) translate(500, 500)" />
<!-- Indigo Transform [50% of ((1000 / 0.25) - 1000) is 1500] -->
<path fill="rgb(63, 0, 255)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(0.25) translate(1500, 1500)" />
<!-- Violet Transform [50% of ((1000 / 0.125) - 1000) is 3500] -->
<path fill="rgb(199, 125, 243)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(0.125) translate(3500, 3500)" />
</svg>