Кривая, подходящая к серии отрезков - PullRequest
4 голосов
/ 27 августа 2011

На SO много вопросов по подгонке кривых, но я не могу найти ни одного, который бы отвечал на то, что я ищу.

Сценарий прост: я фиксирую точки X / Y на экране планшета. Я хотел бы нарисовать результирующие отрезки как плавную кривую вместо серии отрезков. Многие приложения делают это, например: Предпоследняя ( демонстрация эскизов в 0: 36 ) или Autodesk Sketchbook .

Алгоритмы кривой Безье берут фиксированное число точек, чтобы нарисовать кривую, и, похоже, плохо работают с многочисленными множественными точками. Кто-нибудь может указать на алгоритм, который делает это хорошо?

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Fit-Curve - это сплайн, а не кривая Безье.Однако вы можете сделать кривую Безье, похожую на ваш сплайн (у сплайнов нет контрольных точек).Я много искал по этой проблеме и представил / внедрил много слишком сложных алгоритмов для себя, и, наконец, я обнаружил, что задача намного проще, чем я предполагал (я чувствовал, что должен, клянусь :))

Вот лучшее описание этого, я возьму выдержку из этой статьи:

В большинстве реализаций функция рисования кривой Безье принимаетдве контрольные точки и сама точка (для сегмента) в качестве аргументов, поэтому все, что вам нужно, это просто итеративно находить контрольные точки для новых сегментов (я думаю, что лучше обновить последний сегмент и нарисовать новый в конце кривойдля каждой новой точки):

Вот код JavaScript (t для простейшего случая - это постоянная плавность кривой):

function getControlPoints(x0,y0,x1,y1,x2,y2,t){
    var d01=Math.sqrt(Math.pow(x1-x0,2)+Math.pow(y1-y0,2));
    var d12=Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));
    var fa=t*d01/(d01+d12);
    var fb=t*d12/(d01+d12);
    var p1x=x1-fa*(x2-x0);
    var p1y=y1-fa*(y2-y0);
    var p2x=x1+fb*(x2-x0);
    var p2y=y1+fb*(y2-y0);  
    return [p1x,p1y,p2x,p2y];
}

Пожалуйста, прочитайте и поймитестатья, я думаю, самая лучшая, самая короткая и ясная.

0 голосов
/ 27 августа 2011

Проверьте сплайны.Они в основном принимают набор контрольных точек в качестве входных данных и выводят набор кубических кривых, где каждая кривая касается предыдущей и дает плавный контур.

...