2013-09-04 2 views
0

내 요구 사항에 대한 첨부 된 이미지를 찾으십시오. 원호를 드래그하여 (원호) 원호와 휠이 마우스 위치를 회전합니다. 제발 나를 도와주십시오. 원호와 바퀴를 회전하면 버튼이 작동합니다. 그러나이 회전을 국경 (원호)으로 돌리고 싶습니다 .i가 계산에 걸렸습니다. 이 라인에테두리를 드래그하여 타원과 테두리를 회전하는 방법은 무엇입니까?

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

:

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

+0

* 작동하지 않는 것은 무엇입니까? 당신의 * 정확한 * 문제가 무엇입니까? – Sheridan

+0

바퀴의 회전이 부드럽게 작동하지 않습니다. 어느 시점에서 역방향으로 작동하기 시작했습니다. 문제는 회전 각도 만 계산하는 것입니다. – Ravuthasamy

답변

0

첫째, 나는이 줄을 바꿀 것

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

나는 그것이 너무 많은 문제를 일으킬 것이라고 의심하지만. 코드에서 angle이 예를 들어 350 인 경우 380으로 끝나 겠지만 WPF는 그 각도를 유효한 각도 20으로 반올림해야합니다.

Ahhhhhhh ... 내가했습니다 ... 마우스를 이동하는 사용자를 원하는 당신은 사용자가 그래서 마우스를 이동 한대로 모양이 단지까지 회전하려는 정확한 요구 사항을 일 실제로 물리적으로 움직이는 것처럼 보입니다.

오른쪽으로 가면 ... 당신이해야 할 일을 설명 할 수는 있지만 당신을 위해하지 마십시오. 수십 년 동안 그것을 사용하지 않았기 때문에 당신의 삼각법이 좋기를 바랍니다! 기본적으로, 정확하게 기억한다면 계산을 위해 수치를 얻기 위해 상상의 삼각형을 만들고 싶습니다. 삼각형의 점은 원의 중심과 원주 주위의 다양한 점에서옵니다. 따라서 가장 먼저 할 일은 동그라미의 중심에있는 정확한 Point을 기록하는 것입니다 ... 나는 그 것을 여러분에게 남겨 둘 것입니다.

다음으로 사용할 다른 숫자를 찾고 싶습니다. 하나는 항상 센터의 바로 위, 아래, 왼쪽 또는 오른쪽 중 하나이므로 삼각형은 항상 직각을 갖습니다 ... Math.SinMath.Cos에 대한 호출이 유효한 결과를 반환하도록하려면이 값이 필요합니다. 삼각법에 대해 잘 모르는 경우 Maths Is Fun 웹 사이트의 Sine, Cosine and Tangent 페이지를보고 더 많은 정보를 얻을 수 있습니다.

각 삼각형의 세 번째 점과 마지막 점은 마우스 커서의 방향 인 방향으로 원주 위의 위치 또는 마우스의 위치가됩니다. 마우스 커서 위치, 원 중심 및 중심의 바로 위, 아래, 왼쪽 또는 오른쪽 중 하나를 포함하는 더 큰 가상 원을 작성하면 더 큰 삼각형도 직각을 갖습니다.

이 가상의 삼각형을 형성 데 (당신은 혜택 상황을 시각화하기 위해 종이에이 도면에서 수), 당신은 다음 필요한 각도가 당신의 모양을 회전 계산 SinCos 메소드 Math 클래스 '를 사용할 수 있습니다. RotateTransform.Angle 속성이도 (MSDN 현재 사용 가능하지 않음)라고 생각하더라도 은 결과 각도 값을 WPF의 이상한 0도 위치에 맞게 조정해야합니다 (약수 90을 더하거나 뺍니다).

마지막으로 내게 행운을 빕니다.

관련 문제