2016-12-02 13 views
0

У меня есть форма, которая движется по открытой дорожке, и мне интересно, как я могу получить ее относительное положение, то есть заданную координату (x, y) формы и длину (L) path (p), функция должна возвращать отношение (r), где находится точка.Относительное положение вдоль пути

Например, г = 0 означает, что точка находится в самом начале пути, 0,25 на четверть, 0,5 половины и т.д.

Один из способов я мог бы сделать это было бы итерации по функции p.getPointAtLength() для разных приращений по длине, пока данная позиция не окажется в допустимом диапазоне от моей исходной точки (x, y). А затем просто разделите это значение на p.getTotalLength().

Но есть ли более эффективный и точный способ сделать это, зная, что в моем случае путь представляет собой кривую 4-го уровня?

+0

Как вы позиционирование формы, а не вы уже знаете, как вы должны были рассчитать как далеко по пути, чтобы заставить х, у позиционировать его? – Ian

+0

Да, я установил начальное положение фигуры на половине кривой, но если она сильно ушла, то возникает проблема ... – pomeKRANK

ответ

0

Короткий ответ: нет.

Репараметрирование кривой Безье для расстояния, а не времени, является нетривиальной задачей без общего решения, поэтому наиболее эффективным способом сделать это для «перемещения по пути на экране компьютера» является LUT основанный подход как http://pomax.github.io/bezierinfo/#tracing

0

для тех, кто может быть заинтересованы, вот как я работал вокруг:

getLengthAtPoint = function(x, y, curve){ 
    var len = curve.getTotalLength(), 
    tol = len/100, 
    inc = len/100, 
    err, 
    errMin = 99999, // infinity 
    cond = true, 
    lengthIter = 0, 
    lengthMin = 0; 

    do { 
    err = dist(curve.getPointAtLength(lengthIter), {x, y}); //pythagore 
    cond = err>tol; 
    if (err < errMin){ 
     errMin = err; 
     lengthMin = lengthIter; 
    } 
    lengthIter = lengthIter + inc; 
    if (lengthIter > len) {cond = false;} 
    } while (cond); 

    return (lengthMin/len); 
} 

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

  • Нет связанных вопросов^_^