2011-01-08 8 views
0

私は最初に私の英語については申し訳ありません、私はしたいと思って説明しようとします 私はauraを表すwpfで楕円を描き、それを表す "deformations"特定の点で実行時に変形することができる楕円形の問題のある領域実行時間の楕円を変形する方法

私は楕円形を形成するいくつかのベジェ曲線を描画しようとしていますが、それは非常に難しいです(そして、私は方法はわかりません)その楕円内に凸または中空のゾーンを形成するようにドラッグすることができるポイントを作る。

私はspellishでmyselftをクリアしましたか?それを行う簡単な方法はありますか?事前

答えて

0

おかげで私はあなたがやろうとしている内容を正確に把握していないが、私は楕円の高解像度版を作り、変形、自分のトラックを保つことをお勧めします。ここにあなたを始めるためのサンプルプログラムがあります。これは、XAMLをデモの

は単純である:

<Canvas Name="canvas" Focusable="True" KeyDown="canvas_KeyDown" MouseDown="canvas_MouseDown" MouseMove="canvas_MouseMove" MouseUp="canvas_MouseUp"/> 

とコードビハインド:

public partial class EllipseDemo : Window 
{ 
    const int resolution = 1000; 
    const double major = 150; 
    const double minor = 100; 
    const double xOrigin = 200; 
    const double yOrigin = 200; 
    const double radius = 10; 
    const double scale = 0.1; 
    const double spread = 10; 
    const double magnitude = 10; 

    Path path; 
    Ellipse controlPoint; 
    LineSegment[] segments; 
    double[] deformation; 
    double[] perturbation; 
    int controlPointIndex; 

    public EllipseDemo() 
    { 
     InitializeComponent(); 

     segments = new LineSegment[resolution]; 
     deformation = new double[resolution]; 
     perturbation = new double[resolution]; 
     for (int i = 0; i < resolution; i++) 
     { 
      var x = i >= resolution/2 ? i - resolution : i; 
      perturbation[i] = magnitude * Math.Exp(-Math.Pow(scale * x, 2)/spread); 
     } 
     path = new Path(); 
     path.Stroke = new SolidColorBrush(Colors.Black); 
     path.StrokeThickness = 5; 
     CalculateEllipse(); 
     canvas.Children.Add(path); 

     controlPoint = new Ellipse(); 
     controlPoint.Stroke = new SolidColorBrush(Colors.Red); 
     controlPoint.Fill = new SolidColorBrush(Colors.Transparent); 
     controlPoint.Width = 2 * radius; 
     controlPoint.Height = 2 * radius; 
     MoveControlPoint(0); 
     canvas.Children.Add(controlPoint); 

     canvas.Focus(); 
    } 

    void CalculateEllipse() 
    { 
     for (int i = 0; i < resolution; i++) 
     { 
      double angle = 2 * Math.PI * i/resolution; 
      double x = xOrigin + Math.Cos(angle) * (major + deformation[i]); 
      double y = yOrigin + Math.Sin(angle) * (minor + deformation[i]); 
      segments[i] = new LineSegment(new Point(x, y), true); 
     } 
     var figure = new PathFigure(segments[0].Point, segments, true); 
     var figures = new PathFigureCollection(); 
     figures.Add(figure); 
     var geometry = new PathGeometry(); 
     geometry.Figures = figures; 
     path.Data = geometry; 
    } 

    void MoveControlPoint(int index) 
    { 
     controlPointIndex = index; 
     Canvas.SetLeft(controlPoint, segments[index].Point.X - radius); 
     Canvas.SetTop(controlPoint, segments[index].Point.Y - radius); 
    } 

    bool mouseDown; 

    void canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (Mouse.DirectlyOver != controlPoint) 
      return; 
     mouseDown = true; 
     controlPoint.CaptureMouse(); 
    } 

    void canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (!mouseDown) 
      return; 
     int index = FindNearestIndex(e.GetPosition(canvas)); 
     MoveControlPoint(index); 
    } 

    void canvas_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     if (!mouseDown) 
      return; 
     controlPoint.ReleaseMouseCapture(); 
     mouseDown = false; 
    } 

    private void canvas_KeyDown(object sender, KeyEventArgs e) 
    { 
     int delta = 0; 
     switch (e.Key) 
     { 
      case Key.Up: 
       delta = 1; 
       break; 
      case Key.Down: 
       delta = -1; 
       break; 
     } 
     if (delta == 0) 
      return; 
     int index = controlPointIndex; 
     for (int i = 0; i < resolution; i++) 
      deformation[(i + index) % resolution] += delta * perturbation[i]; 
     CalculateEllipse(); 
     MoveControlPoint(index); 
    } 

    int FindNearestIndex(Point point) 
    { 
     var min = double.PositiveInfinity; 
     var index = -1; 
     for (int i = 0; i < segments.Length; i++) 
     { 
      var vector = point - segments[i].Point; 
      var distance = vector.LengthSquared; 
      if (distance < min) 
      { 
       index = i; 
       min = distance; 
      } 
     } 
     return index; 
    } 
} 

これは、制御ポイントとして線分とEllipseで表さPathとほとんど動作します。マウスは楕円の周りの制御点を移動し、矢印キーは缶詰の摂動を追加または削除します。すべてがハードコードされていますが、あなたが数学でOKならば、それはあなたが始めるのを助けるはずです。

はここでアクションでプログラムです:

Ellipse Demo

+0

おかげで答えが遅れて申し訳ありません私はそれをしようとしますが、私はこれは私が必要なものであると思います! – Indy81

関連する問題