я знаю, что это старо, но здесь идет.
W3C SVG 1.1 - 7 Системы координат, преобразования и единицы
В разделе 7.6 они описывают преобразование вращения вокруг точки (cx
, cy
)
Проще - это матричное умножение:
translate(<cx>, <cy>) • rotate(<rotate-angle>) • translate(-<cx>, -<cy>)
Чтобы применить это к skewX, используйте:
translate(<cx>, <cy>) • skewX(<skew-angle>) • translate(-<cx>, -<cy>)
общая матрица
матрица перевода
матрица skewX
var skewer = function(element, angle, x, y) {
var box, radians, svg, transform;
// x and y are defined in terms of the elements bounding box
// (0,0)
// --------------
// | |
// | |
// --------------
// (1,1)
// it defaults to the center (0.5, 0.5)
// this can easily be modifed to use absolute coordinates
if (isNaN(x)) {
x = 0.5;
}
if (isNaN(y)) {
y = 0.5;
}
box = element.getBBox();
x = x * box.width + box.x;
y = y * box.height + box.y;
radians = angle * Math.PI / 180.0;
svg = document.querySelector('svg');
transform = svg.createSVGTransform();
//creates this matrix
// | 1 0 0 | => see first 2 rows of
// | 0 1 0 | generic matrix above for mapping
// translate(<cx>, <cy>)
transform.matrix.e = x;
transform.matrix.f = y;
// appending transform will perform matrix multiplications
element.transform.baseVal.appendItem(transform);
transform = svg.createSVGTransform();
// skewX(<skew-angle>)
transform.matrix.c = Math.tan(radians);
element.transform.baseVal.appendItem(transform);
transform = svg.createSVGTransform();
// translate(-<cx>, -<cy>)
transform.matrix.e = -x;
transform.matrix.f = -y;
element.transform.baseVal.appendItem(transform);
};
я раздвоил твой jsfiddle
обновление - новая скрипка с использованием встроенных методов SVGMatrix. Я считаю, что легче читать и понимать