我有一个简单的svg 3路径:红色,蓝色和黄色。 我想要:缩放所有形状(例如0.3),只旋转红色+蓝色(例如90度)。 旋转点应该是红色路径的中间。 完成这些操作后,我希望黄色形状与红色路径的距离为0.3,缩放原始距离。Svg简单转换
我的尝试是:
- 计算红色通道的中间;
- 翻译的原点(0,0),通过与(-redCenterPoint.x, - redCenterPoint.y)译
- 规模红色路0.3
- 回迁红色路径由翻译(redCenterPoint.x,redCenterPoint .Y)
- 重复相同的蓝色和黄色的计算blueCenter,yellowCenter
我的问题是:我如何才能保持原始图像的结构,而是由0.3缩小和旋转90? - 蓝色路径与红色路径接触,黄色路径的原始距离按0.3缩放。
我看到,如果我考虑所有3形状的redCenterPoint,那么该组看起来与原始相同,但缩放,看起来是正确的。 我想知道如何使用第一种方法。
SVG文件:使用Riversoft组件,用于renderin 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" />
代码德尔福:
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 - 你可以创建一个绘图。 –