2017-01-26 76 views
1

我有一个简单的svg 3路径:红色,蓝色和黄色。 我想要:缩放所有形状(例如0.3),只旋转红色+蓝色(例如90度)。 旋转点应该是红色路径的中间。 完成这些操作后,我希望黄色形状与红色路径的距离为0.3,缩放原始距离。Svg简单转换

我的尝试是:

  1. 计算红色通道的中间;
  2. 翻译的原点(0,0),通过与(-redCenterPoint.x, - redCenterPoint.y)译
  3. 规模红色路0.3
  4. 回迁红色路径由翻译(redCenterPoint.x,redCenterPoint .Y)
  5. 重复相同的蓝色和黄色的计算blueCenter,yellowCenter

我的问题是:我如何才能保持原始图像的结构,而是由0.3缩小和旋转90? - 蓝色路径与红色路径接触,黄色路径的原始距离按0.3缩放。

我看到,如果我考虑所有3形状的redCenterPoint,那么该组看起来与原始相同,但缩放,看起来是正确的。 我想知道如何使用第一种方法。

enter image description here

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

这是我的问题:我想要在这些转换之后保留原始图像:蓝色路径与红色路径保持联系,黄色的原始距离按0.3缩放。如何在aply转换后控制蓝色路径的位置。我想成为与乞讨相同的图像,但缩放了0.3。 – Geanni

+0

我不明白你真正想做什么。旋转?规模? “保留原始图像”?你能展示一幅想要的结果吗? – MBo

+0

虽然我觉得有点难以理解你想要达到的目标,但是听起来好像你想要将蓝色和红色分组,并旋转它自己,同时缩放将所有三条路径放在一起的整个组,但是我不能相当肯定。特别是关于我不确定的黄色路径。作为MBo - 你可以创建一个绘图。 –

回答

0

什么,你正在做的是保持中心定为每个形状。这不是你想要做的。你想保持整个形状的中心不变。这就是你在第二次尝试中将红色中心应用到所有3个形状时所做的,这就是为什么它看起来更好。你可能想要选择一个不同的中心,并且有多种算法可以做到这一点,甚至可以将原点保留在原点(根本不打算移动中心)。但是,无论您选择何种形状,您都必须将相同的中心应用于所有形状,以达到您想要的效果,并且这也适用于旋转(尽管在您的情况下,您只将旋转应用于两个形状)。但是,旋转中心不必与缩放中心相同。

对于每种情况下计算新中心的最有效操作,我将使用重心计算,但只是简单的平均值中心也可以。