2016-05-21 1 views
0

У меня возникла проблема написания функции beizer. Я написал простой код в C#:Как сделать инструменты для пера, которые кривая идет гладко с использованием функции 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); 

C# код нарисовать всего в 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()); 

Когда я пытаюсь нарисовать кривую она не выглядит кривой.

+0

Что вы ориентируетесь: Winforms, WPF, ASP ..? __Always__ правильно помечайте свой вопрос! - Также: я надеюсь, что вы не используете __all__ те многие моменты, которые вы получаете от mousemove, чтобы построить кривую Безье, поскольку весь смысл (или один основной) заключается в том, что вам нужно всего __very few__ создавать приятные кривые. – TaW

+0

не используют квадратичный BEZIER, а вместо него кубик (4 контрольные точки). Квадратичный BEZIER (3 контрольные точки) действительно трудно присоединяться к приятным результатам (вам нужно подгонять). С кубиками вам не нужно ничего, просто используйте точки в правильном порядке. См. Http://stackoverflow.com/a/30438865/2521214 также я думаю, что это ваша цель http://stackoverflow.com/a/30750626/2521214 – Spektre

+0

Спасибо Spektre. Вы имеете в виду Cubics, мне нужно только применить что-то вроде этого: Cubic (p0, p1, p2, p3), затем Cubic (p3, p4, p5, p6). Извините, что мое понимание математики довольно ограничено. – LittleFunny

ответ

1

Согласно наблюдению @ fang, не используйте time ++;, потому что вы не хотите переходить с 0.xyz на 1.xyz, вы хотите увеличивать его на небольшие фракции. Функция Безье работает только «работа» (то есть, как и для обычных графических целей) для параметра времени от 0 до 1 (включительно), поэтому вы хотите начать с time=0;, повторяйте несколько раз с небольшим time += step; и стоп один раз time>=1+step.

(а затем, если вы чрезвычайно повезло, что вы, вероятно, нужно вручную добавить конечную точку для time=1 так вы гарантированно правильный конечная точка)

Смежные вопросы