0

UI要素(長方形)で操作を使用しようとしていますが、問題なく回転および変換できます。私が達成したいのは、最初の(長方形)に続く別のUI要素(たとえば楕円)を作成することです。

長方形に使用したのと同じ変換グループを楕円に適用すると、平行移動操作中は正常に機能しますが、回転中は楕円が長方形に追従しません。

どういうわけか、楕円に提供するのに適した複合変換中心点を見つける必要があると思いますが、その方法がわかりません。

対応するサンプルコードは次のとおりです。

    public MainPage()
    {
        this.InitializeComponent();

        rectMy.ManipulationMode = ManipulationModes.None | ManipulationModes.TranslateX | ManipulationModes.TranslateY | ManipulationModes.Rotate;
        rectMy.ManipulationStarted += rectMy_ManipulationStarted;
        rectMy.ManipulationDelta += rectMy_ManipulationDelta;
        rectMy.ManipulationCompleted += rectMy_ManipulationCompleted;

        transformGroup.Children.Add(previousTransform);
        transformGroup.Children.Add(compositeTransform);

        rectMy.RenderTransform = transformGroup;
    }

    void rectMy_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
    {
        e.Handled = true;
    }

    void rectMy_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        previousTransform.Matrix = transformGroup.Value;

        Point center = previousTransform.TransformPoint(new Point(rectMy.Width / 2, rectMy.Height / 2));
        compositeTransform.CenterX = center.X;
        compositeTransform.CenterY = center.Y;

        compositeTransform.Rotation = e.Delta.Rotation;
        compositeTransform.ScaleX = compositeTransform.ScaleY = e.Delta.Scale;
        compositeTransform.TranslateX = e.Delta.Translation.X;
        compositeTransform.TranslateY = e.Delta.Translation.Y;
    }

    void rectMy_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
    {
        e.Handled = true;
    }
4

1 に答える 1

0

わかった。私は今それをよりよく理解し、解決策を見つけました。それはすべて、複合変換の中心点に関するものです(私が最初に推測したように)。楕円の中心については、長方形の中心をフィードする必要がありました。ただし、楕円を基準にして座標を指定する必要がありました。私の場合、楕円は長方形の右上隅にあるので、以下は複合変換の中心として指定したものです。

Point centerE = previousTransformE.TransformPoint(new Point(-rectMy.Width / 2 + ellipseMy.Width / 2, rectMy.Height / 2 + ellipseMy.Height / 2));

長方形の場合、複合変換の中心点は次のとおりです。

Point center = previousTransform.TransformPoint(new Point(rectMy.Width / 2, rectMy.Height / 2));

Stackoverflowでは、画像を投稿して物事をより適切に視覚化することはできません。ごめん!

コード全体:

previousTransform.Matrix = transformGroup.Value;
previousTransformE.Matrix = transformGroupE.Value;

Point center = previousTransform.TransformPoint(new Point(rectMy.Width / 2, rectMy.Height / 2));
compositeTransform.CenterX = center.X;
compositeTransform.CenterY = center.Y;

compositeTransform.Rotation = e.Delta.Rotation;
compositeTransform.TranslateX = e.Delta.Translation.X;
compositeTransform.TranslateY = e.Delta.Translation.Y;

Point centerE = previousTransformE.TransformPoint(new Point(-rectMy.Width / 2 + ellipseMy.Width / 2, rectMy.Height / 2 + ellipseMy.Height / 2));
compositeTransformE.CenterX = centerE.X;
compositeTransformE.CenterY = centerE.Y;

compositeTransformE.Rotation = e.Delta.Rotation;
compositeTransformE.TranslateX = e.Delta.Translation.X;
compositeTransformE.TranslateY = e.Delta.Translation.Y;
于 2012-10-14T21:04:02.803 に答える