2016-09-05 6 views
1

私はNGraphicsを使用してカスタムビューにストロークを描画しています。ストロークが描画されたときのイメージです。赤い円は、滑らかでないエッジの表示です。マウス移動イベントが呼び出されたときに受け取ったコントロールポイントの小さな赤い矩形を示す2番目の画像。コントロールポイントが十分に閉じていれば、カーブはよりよく見えます。Xamarin NGraphics:Path.CurveToとPath.ContineCurveToを使用してもスムースなパスがありません

enter image description here

enter image description here

enter image description here

私は曲線がベジェパスとして描画しないように見える、NGraphicsコード内で見てきました。

public Point GetPoint (Point prevPoint, double t) 
    { 
     var u = 1 - t; 
     return 
      u * u * u * prevPoint + 
      3 * u * u * t * Control1 + 
      3 * u * t * t * Control2 + 
      t * t * t * Point; 
    } 

public override EdgeSamples[] GetEdgeSamples (Point startPoint, Point prevPoint, double tolerance, int minSamples, int maxSamples) 
     { 
      var n = (3*prevPoint.DistanceTo (Point))/tolerance; 
      if (n < minSamples) 
       n = minSamples; 
      if (n > maxSamples) 
       n = maxSamples; 

      var r = new List<Point>(); 

      var dt = 1.0/(n - 1); 

      for (var i = 0; i < n; i++) { 
       var t = i * dt; 
       var p = GetPoint (prevPoint, t); 
       r.Add (p); 
      } 

      return new[]{ new EdgeSamples { Points = r.ToArray() } }; 
     } 

私はcurvetoといったとcontinueCurveTo使用タッチイベント:

#region Drawing Event 
    private bool DrawingBegan(TouchData touchData) 
    { 
     var stroke = new StrokeModel(); 
     stroke.Points = new ObservableCollection<PointModel>(); 
     stroke.Pointer = touchData.PointerId; 
     stroke.Path = new Path(); 
     stroke.PenColor = Pen.Color; 
     stroke.PenWidth = Pen.Width; 
     stroke.DeviceOrientation = DeviceInfo.DeviceOrientation; 

     _localStroke.Add(stroke); 

     return base.TouchesBegan(touchData); 
    } 

    private bool DrawingMove(TouchData touchData) 
    { 
     foreach (var stroke in _localStroke) 
     { 
      if (stroke.Pointer == touchData.PointerId) 
      { 
       var length = stroke.Points.Count - 1; 

       if (stroke.Points.Count == 2) 
       { 
        var p1 = ConvertGlobalToLocal(new Point(stroke.Points[length - 1].X, stroke.Points[length - 1].Y)); 
        var p2 = ConvertGlobalToLocal(new Point(stroke.Points[length].X, stroke.Points[length].Y)); 
        var p3 = touchData.Point; 
        stroke.Path.MoveTo(p1); 
        stroke.Path.CurveTo(p1, p2, p3); 
       } 
       else if (stroke.Points.Count > 2) 
       { 
        var p2 = ConvertGlobalToLocal(new Point(stroke.Points[length].X, stroke.Points[length].Y)); 
        var p3 = touchData.Point; 
        stroke.Path.LineTo(p2); 
        stroke.Path.ContinueCurveTo(p2, p3); 
       } 

       var newPoint = ConvertLocalToGlobal(touchData.Point); 
       var point = new PointModel(); 
       point.X = newPoint.X; 
       point.Y = newPoint.Y; 

       stroke.Points.Add(point); 
       break; 
      } 
     } 

     return base.TouchesMoved(touchData); 
    } 

をウィルそれはない十分なサンプルサイズ理由?

+0

私は 'NGraphics'エキスパートではありませんが、あなたの' LineTo'について疑問を感じます。あなたの 'CurveTo'は十分なはずはありませんか? –

+0

申し訳ありません。私は実際に私のアプリケーションでLineToを削除しましたが、結果は実際にはジグザグパターンのような最悪のものでもあります...私は自分のベジェアルゴリズムを書こうとしました。最初はタッチイベントでそれを行う方法がわかりませんでした。 – LittleFunny

+0

ジグザグは、あなたが「CurveTo」と「ContinueCurveTo」のパラメータをどの順序で供給しているのかを示す目印になりますか? –

答えて

0

私は、HistoricalXとHistoricalYを使用して問題を解決しました。使用しない場合、一部のタッチデータが欠落します。

関連する問題