@schurin
Люблю катать с гор, особенно на санках

Как расчитывать трансформацию одного объекта относительно другого?

Пытаюсь расчитать смещение для группы svg объектов и положить их над исходным прямоугольником, чтобы группа не выходила за размеры прямоугольника и находилась по центру, родитель у группы элементов и прямоугольника общий общий.

А исходный он от того, что уже был в документе, а группу элементов подгружаю и вставляю в дерево.

Масштаб было расчитать лекго, а вот трансформации ввели в ступор, никак не могу добится центровки.
Привожу пример кода.

<svg>
		<g transform="translate(396.85,-130.759)">
			<g transform="matrix(1,0,0,1,0,0)"></g>
			<rect x="0" y="552.756" width="28.3465" height="42.5197" class="start-object"></rect>
			<g transform="translate(51.0442,-37.0855)" class="transform-object">
				<g transform="translate(47.0826,-46.7717)">
					<rect x="0" y="167.4" width="14.1732" height="75.1181"></rect>
				</g>
				<g transform="translate(47.0826,0)">
					<rect x="0" y="73.8569" width="14.1732" height="168.661"></rect>
				</g>
				<g transform="translate(271.884,151.101) rotate(90)">
					<rect x="0" y="192.912" width="14.1732" height="49.6063"></rect>
				</g>
			</g>
		</g>
	</svg>


var startObj = $('.start-object'), // Объект тносительно которого будем выравнивать
			tfmObj = $('.transform-object'), // Объект который будем выравнивать
			svg = $('svg'); 

		var tfmList = tfmObj[0].transform.baseVal, // трансформ лист смещаемого объекта
			startObj = startObj[0].getBBox(),
			tfmObjBBox = tfmObj[0].getBBox(),
			scale = {},
			tfmScale, tfmTranslate, startObjRect, tfmObjRect, offset;

		scale.width = startObj.width / tfmObjBBox.width;
		scale.height = startObj.height / tfmObjBBox.height;

		scale.result = scale.height < scale.width ? scale.height : scale.width;

		tfmScale = svg[0].createSVGTransform();
		tfmScale.setScale(scale.result, scale.result);
		tfmList.appendItem(tfmScale);

		startObjRect = startObj[0].getBoundingClientRect();
		tfmObjRect = tfmObj[0].getBoundingClientRect();

		offset.x = pr.left - sr.left + (pr.width - sr.width) / 2;
		offset.y = pr.top - sr.top + (pr.height - sr.height) / 2;

		tfmTranslate = svg[0].createSVGTransform();
		tfmTranslate.setTranslate(offset.x, offset.y);
		tfmList.appendItem(tfmTranslate);

		tfmList.consolidate();


html, body, svg{
			width: 100%;
			height: 100%;
		}
		body{
			margin: 0;
		}
		.start-object{
			fill: transparent;
			stroke: red;
		}
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы