У меня проблема с написанием функции beizer. Я написал простой код на С#:
public static PointF[] BeizerFunction (int interval, PointF point0, PointF point1, PointF point2) {
//x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
//y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
var Points = new PointF[interval];
var time = 1.0f / (float) interval;
for (var i=0; i<Points.Length; i++) {
var point = Points [i];
point = new PointF ();
point.X = (1 - time) * (1 - time) * point0.X
+ 2 * (1 - time) * time * point1.X
+ time * time * point2.X;
point.Y = (1 - time) * (1 - time) * point0.Y
+ 2 * (1 - time) * time * point1.Y
+ time * time * point2.Y;
Points [i] = point;
time ++;
}
return Points;
}
Приложение прослушивает движение мыши, поэтому я предполагаю, что указатель мыши будет контрольными точками для этой функции. Приведенный выше код, если он правильный, должен дать мне кривую Бейзера по трем точкам.
На самом деле кривых несколько, поэтому точек будет больше 3. Чтобы соединить кривую бейза вместе, я делаю что-то вроде этого.
Bezier(p0.5, p1, p1.5);
Bezier(p1.5, p2, p2.5);
Bezier(p2.5, p3, p3.5);
Код С# для рисования всего 3 точки таков:
var p0 = new PointF (50, 50);
var p1 = new PointF (100, 100);
var p2 = new PointF (150, 50);
var points = QuadraticBezierFunction.BeizerFunction (100, p0, p1, p2);
for (var i=0; points != null && i<points.Length-1; i=i+1)
canvas.DrawLine (points[i].X, points[i].Y, points[i+1].X, points[i+1].Y, new Android.Graphics.Paint ());
Когда я пытаюсь нарисовать кривую, она не выглядит кривой.
(p0,p0,p0,p1),(p0,p0,p1,p2),(p0,p1,p2,p3),(p1,p2,p3,p4),(p2,p3,p4,p5)...
для получения дополнительной информации см. Связанный QA ... Вы также можете использовать для этого любой тип куба (мой любимый для этого - интерполяционный куб также в этом связанном контенте) . PS чтобы отметить пользователя комментарием, вам нужно добавить@
передnick
и сайт сделает это за вас. (например,@Spektre
) - person Spektre   schedule 22.05.2016