2017-01-26 111 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個形狀時所做的,這就是爲什麼它看起來更好。你可能想要選擇一個不同的中心,並且有多種算法可以做到這一點,甚至可以將原點保留在原點(根本不打算移動中心)。但是,無論您選擇何種形狀,您都必須將相同的中心應用於所有形狀,以達到您想要的效果,並且這也適用於旋轉(儘管在您的情況下,您只將旋轉應用於兩個形狀)。但是,旋轉中心不必與縮放中心相同。

對於每種情況下計算新中心的最有效操作,我將使用重心計算,但只是簡單的平均值中心也可以。