У меня есть простой svg с тремя дорожками: красный, синий и желтый. Я хочу: масштабировать все фигуры (например, 0,3) и поворачивать только красный + синий (например, 90 градусов). Точка вращения должна быть средней красной дорожкой. После этих операций я хочу, чтобы желтая форма имела расстояние до красной дорожки, расстояние оригинала до 0,3.Svg простые преобразования
Моя попытка была:
- вычислить середину красной дорожке;
- перевести в начало координат (0,0), по переведенный с (-redCenterPoint.x, - redCenterPoint.y)
- Scale красный путь от 0,3
- двигаться назад красный путь от перевода (redCenterPoint.x, redCenterPoint .y)
- повторите то же самое для синего и желтого, вычисляя blueCenter, yellowCenter
Мой вопрос: Как я могу сохранить первоначальную структуру изображения, но масштабируется на 0,3 и повернуть на 90? - синий путь для контакта с красным дорожкой и желтый, чтобы иметь исходное расстояние, масштабируемое на 0,3.
Я увидел, что если я рассмотрю redCenterPoint для всех трех форм, то группа будет выглядеть так же, как оригинальная, но масштабированная, выглядит правильно. Я хочу знать, чтобы сделать то же самое, но с первым методом.
Файл .SVG:
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="opacity:1;fill:#ff0000"
d="m 146.98669,417.50473 561.36408,0 0,206.40686 -561.36408,0 z"
id="red"
inkscape:label="#table" />
<path
style="opacity:1;fill:#0000ff"
d="m 641.11218,339.32031 65.67491,0 0,82.87548 -65.67491,0 z"
id="blue" />
<path
style="opacity:1;fill:#ffff00"
d="m 764.69525,515.63883 55.28473,-55.28473 46.43917,46.43918 -55.28473,55.28472 z"
id="yellow"
inkscape:connector-curvature="0"
inkscape:label="#yellow" />
код в Дельфах, используя компонент RiverSoft для Предоставление SVG:
redBounds: TSVGRect;
redCenterPoint: TPointF;
redMatrix: TSVGMatrix
redBounds := (svgDoc.SVG.AllItems['red'] as TSVGGraphicElement).BoundsRect;
redCenterPoint.x := bDiamond.Left + (bDiamond.Width)/2;
redCenterPoint.y := bDiamond.Top + (bDiamond.Height)/2;
redMatrix := CreateTranslateRSMatrix(-redCenterPoint.x, -redCenterPoint.y);
redMatrix := RSMatrixMultiply(redMatrix,
CreateRotationRSMatrix(TPoint(0,0), DegToRad(90)));
redMatrix := RSMatrixMultiply(redMatrix,
CreateScaleRSMatrix(0.3, 0.3));
redMatrix := RSMatrixMultiply(redMatrix,
CreateTranslateRSMatrix(redCenterPoint.x, redCenterPoint.y));
(svgDoc.SVG.AllItems['red'] as TSVGGraphicElement)
.Matrix := mainMatrix;
Это мой вопрос: я хочу, чтобы после этих преобразований сохранилось исходное изображение: синий путь, чтобы быть на связи с красным дорожкой и желтым, чтобы иметь исходное расстояние, масштабируемое на 0,3. Как я могу контролировать положение синего пути после преобразования aply. Я хочу быть тем же изображением, что и попрошайничество, но масштабируется на 0,3. – Geanni
Я не понимаю, что вы действительно хотите сделать. Поворот? Масштаб? «сохранить исходное изображение»? Не могли бы вы показать изображение желаемого результата? – MBo
Хотя мне сложно понять, чего вы хотите достичь, похоже, что вы хотите сгруппировать синие и красные и повернуть, что на собственном уровне, масштабируя общую группу, которая содержит все три пути вместе, но я не могу быть уверенным. Это особенно бит о желтом пути, о котором я не знаю. Как MBo - вы могли бы создать чертеж. –