1
私はNGraphicsを使用してカスタムビューにストロークを描画しています。ストロークが描画されたときのイメージです。赤い円は、滑らかでないエッジの表示です。マウス移動イベントが呼び出されたときに受け取ったコントロールポイントの小さな赤い矩形を示す2番目の画像。コントロールポイントが十分に閉じていれば、カーブはよりよく見えます。Xamarin NGraphics:Path.CurveToとPath.ContineCurveToを使用してもスムースなパスがありません
私は曲線がベジェパスとして描画しないように見える、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);
}
をウィルそれはない十分なサンプルサイズ理由?
私は 'NGraphics'エキスパートではありませんが、あなたの' LineTo'について疑問を感じます。あなたの 'CurveTo'は十分なはずはありませんか? –
申し訳ありません。私は実際に私のアプリケーションでLineToを削除しましたが、結果は実際にはジグザグパターンのような最悪のものでもあります...私は自分のベジェアルゴリズムを書こうとしました。最初はタッチイベントでそれを行う方法がわかりませんでした。 – LittleFunny
ジグザグは、あなたが「CurveTo」と「ContinueCurveTo」のパラメータをどの順序で供給しているのかを示す目印になりますか? –