UWP:如何确定2个TransformGroup大致相同?

时间:2017-11-17 03:32:02

标签: c# uwp geometry windows-10-universal

我在画布上有1个形状。

  1. 案例1:我正在将TransformGroup用于带旋转的新地方
  2. 案例2:在案例1中,我用手移动并将形状从原始位置旋转到最后位置。
  3. 我想检查一下是否正确放置了形状。 所以我想比较2个TransformGroup值。你对此有什么想法吗?

    enter image description here

    我也想处理对称的形状。

2 个答案:

答案 0 :(得分:1)

  

所以我想比较2个TransformGroup值。

我不确定如何实现您的功能,但是为了比较TransformGroup值,您可以只命名组内的变换对象并获取每个变换的属性以进行比较。例如,以下代码段获取旋转角度并转换值:

XAML

<StackPanel Margin="15">
    <StackPanel.Resources>
        <Storyboard x:Name="myStoryboard">
            <DoubleAnimation
                RepeatBehavior="Forever"
                Storyboard.TargetName="rotateTransform"
                Storyboard.TargetProperty="Angle"
                From="0"
                To="360"
                Duration="0:0:8" />
            <DoubleAnimation
                RepeatBehavior="Forever"
                Storyboard.TargetName="translateTransform"
                Storyboard.TargetProperty="X"
                To="200"
                Duration="0:0:8" />
        </Storyboard>
    </StackPanel.Resources>
    <Rectangle
        Width="50"
        Height="50"
        Fill="RoyalBlue"
        PointerPressed="StartAnimation" >
        <Rectangle.RenderTransform>
            <TransformGroup x:Name="transformgroup">
            <RotateTransform x:Name="rotateTransform" Angle="45" CenterX="25" CenterY="25"   />
                <TranslateTransform x:Name="translateTransform" X="0" />                    
            </TransformGroup>
        </Rectangle.RenderTransform>
    </Rectangle>

    <TextBox x:Name="txtAngle" Header="CurrentAngle" />
    <TextBox x:Name="txtX" Header="CurrentX" />
    <Button
        x:Name="btnget"
        Click="btnget_Click"
        Content="gettransform" />
</StackPanel>

背后的代码

private void StartAnimation(object sender, PointerRoutedEventArgs e)
{
    myStoryboard.Begin();
}

private void btnget_Click(object sender, RoutedEventArgs e)
{
    txtAngle.Text= rotateTransform.Angle.ToString();
    txtX.Text = translateTransform.X.ToString();
    //RotateTransform rotatetransget= transformgroup.Children[0] as RotateTransform;
}

答案 1 :(得分:0)

这是我的解决方案,仅适用于多边形,如果形状是对称的,则会更正。

只需通过比较转换后的点数来比较转换

Boolean CompareTransform(TransformGroup transformGroupA, TransformGroup transformGroupB)
{
    if (element is Polygon)
    {
        Polygon p = element as Polygon;
        List<Point> listPointA = new List<Point>();
        List<Point> listPointB = new List<Point>();

        for (int i = 0; i < p.Points.Count; i++)
        {
            Point pointA = transformGroupA.Value.Transform(p.Points[i]);
            Point pointB = transformGroupB.Value.Transform(p.Points[i]);
            listPointA.Add(pointA);
            listPointB.Add(pointB);
        }


        for (int i = 0; i < listPointB.Count; i++)
        {
            if (GetDistance(listPointA[0].X, listPointA[0].Y, listPointB[i].X, listPointB[i].Y) < 10)
            {
                List<Point> newList = new List<Point>();
                newList.AddRange(listPointB.GetRange(i, listPointB.Count - i));
                newList.AddRange(listPointB.GetRange(0, i));

                return ComparePointsList(listPointA, newList);

            }
        }


        return false;

    }
    return false;
}            

bool ComparePointsList(List<Point> listA, List<Point> listB)
    {
        for (int i = 0; i < listA.Count; i++)
        {
            if (GetDistance(listA[i].X, listA[i].Y, listB[i].X, listB[i].Y) > 10)
            {
                return false;
            }
        }
        return true;
    }

    double GetDistance(double x1, double y1, double x2, double y2)
    {
        return Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2));
    }

你对eclipse有什么想法吗?