如何根据拖动边框旋转椭圆和边框?

时间:2013-09-04 07:02:40

标签: wpf rotation wpf-controls rotateanimation wpf-animation

请根据我的要求找到附图。当拖动圆弧(边框)时,圆弧和滚轮通过鼠标位置旋转。你能帮我吗?如果旋转圆弧和滚轮按钮单击它工作。但我想在拖动边框(圆弧)中旋转它.i卡住了计算。

XAML:
<Grid HorizontalAlignment="Center">
    <StackPanel Orientation="Horizontal" x:Name="mainStackPanel" RenderTransformOrigin="0.5,0.5">
        <Grid>
            <Border BorderThickness="10" BorderBrush="Blue" MouseMove="Border_MouseMove" MouseLeftButtonDown="Border_MouseLeftButtonDown"
                    MouseLeftButtonUp="Border_MouseLeftButtonUp" Width="10" Height="90" />
        </Grid>
        <Grid x:Name="rotateGrid" Margin="20 0 0 0" RenderTransformOrigin="0.5,0.5">
            <Ellipse Height="250" Width="250" Stroke="Red" StrokeThickness="20"/>
            <Border BorderThickness="10" BorderBrush="Red" Height="15" Width="250"
            HorizontalAlignment="Stretch" VerticalAlignment="Center"/>

            <Border BorderThickness="10" BorderBrush="Red" Width="15"  Height="250"
            HorizontalAlignment="Center" VerticalAlignment="Stretch"/>

            <Border BorderThickness="10" BorderBrush="Red" Width="15"  Height="246" RenderTransformOrigin="0.5,0.5"
            HorizontalAlignment="Center" VerticalAlignment="Stretch">
                <Border.RenderTransform>
                    <RotateTransform Angle="45"/>
                </Border.RenderTransform>
            </Border>
            <Border BorderThickness="10" BorderBrush="Red" Width="15"  Height="246" RenderTransformOrigin="0.5,0.5"
            HorizontalAlignment="Center" VerticalAlignment="Stretch">
                <Border.RenderTransform>
                    <RotateTransform Angle="135"/>
                </Border.RenderTransform>
            </Border>

        </Grid>
        <Grid Margin="20 0 0 0">
            <Border BorderThickness="10" BorderBrush="Blue" Width="10" Height="90" />
        </Grid>

    </StackPanel>

    

Code Behind:
RotateTransform trans = new RotateTransform();
    double angle = 30;
    Point oldPoint;
    Point newPoint;
    bool dragStarted = false;

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        trans.Angle = angle;
        mainStackPanel.RenderTransform = trans;
        if (angle >= 360)
            angle = 0;
        angle += 30;
    }

    private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        dragStarted = true;
        oldPoint = e.GetPosition(this);
        Mouse.Capture(sender as IInputElement);
    }

    private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        Mouse.Capture(null);
        oldPoint = new Point(0, 0);
        newPoint = new Point(0, 0);
        dragStarted = false;
    }
    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        Mouse.Capture(null);
        oldPoint = new Point(0, 0);
        newPoint = new Point(0, 0);
        dragStarted = false;
        base.OnMouseLeftButtonUp(e);
    }

    private void Border_MouseMove(object sender, MouseEventArgs e)
    {
        if (dragStarted)
        {
            newPoint = e.GetPosition(this);
            if (oldPoint.Y != newPoint.Y)
            {
                if (oldPoint.Y > newPoint.Y)
                    trans.Angle = (oldPoint.Y - newPoint.Y);
                else
                    trans.Angle += (newPoint.Y - oldPoint.Y);

                mainStackPanel.RenderTransform = trans;
            }
        }
    }

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,我会更改这些行:

if (angle >= 360)
        angle = 0;
    angle += 30;

到这一行:

angle = angle >= 330 ? 0 : angle + 30;

虽然我怀疑这会导致太多问题。在你的代码中,如果angle等于350,那么它最终将为380,但是WPF应该将该角度包围到有效角度20。

Ahhhhhhh ......我只是计算出你的完全要求...你希望用户移动鼠标,你希望形状旋转就像用户移动鼠标时,实际上看起来实际上是在移动鼠标。

是的,这里......我可以解释你要做什么,但不能为你做。我希望你的三角学很好,因为我已经使用了几十年了!基本上,如果我没记错的话,我们想要创建一些假想的三角形来得到我们的计算数据。三角形的点将来自圆的中心和围绕其圆周的各个点。所以首先要记下圆圈中心所在的确切Point ......我会把它留给你。

接下来,我们想找到其他要使用的数字。一个将始终位于中心的正上方,下方,左侧或右侧,这样我们的三角形将始终具有直角...如果我们想要调用Math.Sin和{{1},我们需要这个返回有效结果。如果您不了解三角学,可以通过查看Maths Is Fun网站上的Sine, Cosine and Tangent页面了解更多信息。

每个三角形的第三个和最后一个点将是鼠标的位置,或者更确切地说,是鼠标光标方向上圆周上的位置。这是通过创建一个更大的虚圆来实现的,其中包括鼠标光标位置,圆心和中心正上方,下方,左侧或右侧的位置,这样我们更大的三角形也有一个直角。

形成这些虚构的三角形(你可能从纸上绘制这些三角形有助于可视化情况),然后你可以使用Math.Cos类'Math和{ {1}}计算旋转形状所需角度的方法。虽然我认为Sin属性是以度为单位(此时MSDN不可用),但可能需要调整生成的角度值以适应WPF奇怪的0度位置(通过加上或减去90的除数。

最后一件事是祝你好运。