Смещение ограничивающего прямоугольника пути fabricjs
Я пытаюсь создать фигуру с помощью ткани.Путь, и я хотел бы иметь возможность вращать его вокруг своего центра. Проблема в том, что ограничивающий прямоугольник смещен, и фактическая форма танцует вокруг его центра:
this.canvas = new fabric.Canvas('c')
this.canvas.clear();
var triangle = new fabric.Triangle({
width: 20,
height: 20,
fill: '#35a2da',
left: 410,
top: 350,
angle: 90
});
var path = new fabric.Path(
"M 200 175 A 25 25 0 1 0 217.678 217.678",
{
fill : '',
stroke : '#35a2da',
strokeWidth : 7,
left: 200,
top:200
});
var rotate = new fabric.Group([path, triangle], {left:200, top:200});
this.canvas.add(rotate);
Приведенный выше код можно найтиздесь .
1 ответ:
Пока вы фиксируете размеры объекта
fabric.Path
на основе дуги SVG, которую вы рисуете, и фиксируете размеры объектаfabric.Group
к этим же размерам, вы должны быть в состоянии получить форму, идеально центрированную.Пример Скрипки
Причины эксплицитности калибровки
fabric.Path
Причина, по которой вы хотите явно задать ширину и высоту
fabric.Path
, заключается в том, что в противном случае размер по умолчанию будет включать дополнительный размер от удара по дуге.
fabric.Group
Причина явного задания размера
fabric.Group
заключается в том, что при расположенииfabric.Triangle
в начале дуги границы будут выходить за пределы той окружности, на которой вы хотите быть идеально центрированы.Как динамически вычислить путь SVG значка поворота
Я написал эту функцию, которая возвращает объект с точками, которые вам понадобятся для визуализации дуги SVG, учитывая радиус:
function rotatePoints(radius) { // Get 45 degrees in radians var angle = Math.PI / 4; return { radius: radius, startPos: { x: radius, y: 0 }, endPos: { x: radius + (radius * Math.cos(angle)), y: radius + (radius * Math.sin(angle)) } } }
Например, учитывая радиус 30, вы можете построить путь SVG следующим образом:
var pathPts = rotatePoints(30); var pathSVG = [ 'M', pathPts.startPos.x, pathPts.startPos.y, 'A', pathPts.radius, pathPts.radius, 0, 1, 0, pathPts.endPos.x, pathPts.endPos.y ]; pathSVG.join(' ') // result: "M 30 0 A 30 30 0 1 0 51.21320343559643 51.21320343559643"
Координаты холста против координат группы
Имейте в виду, что как только вы добавляете
Path
иTriangle
кGroup
, Если вы хотите установить положение любого из них, координаты относительно границGroup
, а не всего холста (см. скрипку для примера того, как их позиции корректируются, добавляясь кGroup
.