Страницы

Поиск по вопросам

четверг, 7 марта 2019 г.

Аппроксимация движения пальца в кривые Безье

Существуют ли готовые решения для Android? Если нет, как лучше реализовать?


Ответ

Да, вы можете отследить точки начала и конца, max и min отклонения и использовать преобразования bezier. В классе Path, есть Квадратичные и Кубические преобразования кривых cubicTo и quadTo
Вот простой пример для теста с методом quadTo:
public class DrawBezierLine extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new DrawView(this)); }
class DrawView extends View { Paint p; public DrawView(Context context) { super(context); p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setStrokeWidth(5); p.setStyle(Paint.Style.STROKE); }
@Override protected void onDraw(Canvas canvas) { p.setColor(Color.RED); canvas.drawPath(makeBezierLine(50, 50, 200, 300), p);
} } private Path makeBezierLine(float x1, float y1, float x3, float y3) { final Path path = new Path(); path.moveTo(x1, y1); final float x2 = 0; final float y2 = 200; path.quadTo(x2,y2, x3,y3); return path; } }
где x1,y1 -начальная точка. x3,y3 - конечная точка, x2,y2 - точка отклонения.
Но для вашего примера, больше подойдет кубическое преобразование, очень часто используется в рисовалках.
Добавлю: Интерполяторы используют аналогию сложных кривых Безье и могут быть использованы, для решения многих задач. Также никто вам не мешает создать свой алгоритм преобразования, используя свои данные, что может быть актуальней и возможно проще.

Комментариев нет:

Отправить комментарий