2017-01-26 6 views
1

シンプルなsvgには、赤、青、黄の3つのパスがあります。 私はすべての図形(例えば0.3)を拡大縮小し、赤+青(例えば90度)だけを回転させたいと思います。 回転ポイントは赤いパスの中央にする必要があります。 これらの操作の後、私は黄色の形状に元の距離が0.3でスケールされた赤色のパスまでの距離を持つことを望みます。シンプルな変換

私の試みがあった。

  1. は赤道の真ん中を計算します。
  2. (-redCenterPoint.x、 - redCenterPoint.y)と翻訳することにより、原点(0,0)に変換(翻訳redCenterPoint.x、redCenterPoint 0.3
  3. ムーブバック赤パスによってスケール赤パス
  4. .Y)blueCenterを計算することにより、青と黄色のための同じ
  5. 繰り返し、yellowCenter

は、私の質問は:にはどうすれば元の画像構造を保つが、0.3によってスケーリングおよび90によって回転することができますか? - 青色のパスは赤色のパスに、黄色は元の距離が0.3でスケールされます。

3つのシェイプのredCenterPointを考慮すると、グループはオリジナルと同じに見えますが、縮尺が正しく見えます。 私は同じことをするが、最初の方法を知りたい。

enter image description here

SVGファイル:renderin SVGのためRiversoftコンポーネントを使用して、Delphiで

<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

あなたは達成したいことを理解するのが少し難しいと感じますが、青と赤をグループ化してそれを自分のものに変えたいと思うように思えますが、3つのパスをすべて保持するグループ全体を拡大しますかなり確かです。それは特に私が確信している黄色い道についての少しです。 MBoとして - 図面を作成できますか? –

答えて

0

何をやっている個々の形状のため、一定の中心を保つことです。それはあなたがしたいことではありません。全体の形状の中心を一定に保つ必要があります。これは、あなたが赤い中心を3つの形すべてに適用する2回目の試行でやっていることです。そのため、よりよく見えるのです。あなたは別の中心を選んで、それを行うためのさまざまなアルゴリズムがあるかもしれませんし、原点をそのままにしておくこともできます(中心を動かすのは気にしません)。しかし、あなたが望むものを実現するためには、あなたが選んだ同じセンターをすべての図形に適用しなければならず、回転にも適用しなければなりません(あなたの場合は、2つの図形にのみ回転を適用します)。回転の中心は、スケーリングの中心と同じである必要はありません。

それぞれの場合に新しいセンターを計算する最も効果的な操作については、重心計算を使用しますが、センターの単純な平均もうまくいくでしょう。

関連する問題