Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Igors от Июнь 15, 2018, 08:02



Название: Поиск готового решения
Отправлено: Igors от Июнь 15, 2018, 08:02
Добрый день

Есть N точек (x, y, z) с регулярным шагом по времени. Порядок N - сотни, тысячи и больше. Требуется заменить их кубическим сплайном Безье с минимальным числом контрольных точек. Ну т.е. кривой проходящей через все N точек, разумеется с какой-то заданной погрешностью.

Отпихнуться от этой противной задачки я не могу, эта опция интенсивно используется, но сейчас она реализована великом (не мной) и работает просто ужасно  :'(  Ну и я не спрашиваю "алгоритм", давайте поговорим о том "как его найти".

Нахожу это http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.5193&rep=rep1&type=pdf (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.5193&rep=rep1&type=pdf)
По названию вроде "точно в масть", но выкладки довольно обширны и как реализовать - хз. Это, кстати, типичный рез-т для источников с "академическим уклоном".

Ладно, нашел это  http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c (http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c)
Тут все конкретно, причем по своему опыту знаю: джемсовский код работает железно. Но.. как Вам нравится такой код? :)  К тому же он 30-летней давности. (а как любят кричать "велик!", "костыль!").
Попробовал найти тех кто ссылается на этот алгоритм - ну неск работ в стиле первой ссылки.

И что делать? Понятно что просторы инета безбрежны и всегда можно сказать "плохо искал". Но практически.. ну погуглю еще пару дней, останусь там же. Дальше что? Решение принимать все равно придется. Поэтому спрошу так:

Стоит ли связываться с найденным готовым решением и пытаться тащить его в рабочий код ?

Спасибо


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 15, 2018, 09:02
Решал такую задачу лет 15 назад). Попробую найти материалы.
Пока что в общем виде так:
- Выбираем вид сплайна. Кубический сплайн или Безье 3-го порядка - это всего 4 управляющие точки.
- Далее с помощью метода наименьших квадратов выражаем искомые величины - коэффициенты или контрольные точки.

Метод наименьших квадратов не сложный. Возможно, пока ищу материалы уже решите задачу)).


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 15, 2018, 11:01
ssoft, спасибо за желание помочь
- Выбираем вид сплайна. Кубический сплайн или Безье 3-го порядка - это всего 4 управляющие точки.
Однозначно кубик (2 управляющие точки на сегмент), ну или каждая контрольная точка сплайна имеет 2 управляющие.

Метод наименьших квадратов не сложный. Возможно, пока ищу материалы уже решите задачу)).
МНК навскидку не помню, но разберусь, тоже когда-то делал, НО он ведь ищет прямую проходящую "наилучшим образом" через N точек. Ну может и не только прямую, но "заданную" ф-цию.  А для Безье что задавать? Там же с управляющими точками кривые могут быть любые.

А мож все-таки велик? Ну вот "душонка" (как говорил складской работник) у меня такая - все к велику тянется  :)  Да и ковыряться в том кале мамонта ой несладко.


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 18, 2018, 07:29
Следующие 2 дня гугления ничего принципиально нового не внесли, нашел с десяток перепечаток того же алгоритма 90 года. Ну думаю, значит это классика, надо его брать. Перевел на плюсы без проблем, все скомпилил и, наконец, попытался разобраться как он работает. Во-первых, он вычисляет вектора по паре первых/последних точек, а значит если в исходных точках есть "шумы" -  будет работать плохо. Ну то ладно, как-то загладить можно. Но "во-вторых" - просто облом. Он ведь только для "одномерной" кривой типа y = f(t), и на мои 3D точки (x, y, z) не распространяется :'(  А сделать 3 кривые - да, можно, но их никак не удается "склеить". В общем, пока сижу "у разбитого корыта"


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 18, 2018, 08:05
Пока не нашел материалов, еще по архивам поищу ...

Он ведь только для "одномерной" кривой типа y = f(t), и на мои 3D точки (x, y, z) не распространяется ...

А почему для одномерной? Ведь в общем виде кривая представляет собой P = f(t), для кубического сплайна P = P0 + P1 * t + P2 * t^2 + P3 * t^3, где t - вещественное число, P - любой вектор состояния, например, координаты {x, y, z}.
Нужно просто определить для типа точек P алгебраические операции "+", "-" между точками и "*", "/" на число. Формулы те же, результат в виде точек.


Название: Re: Поиск готового решения
Отправлено: m_ax от Июнь 18, 2018, 11:23
Цитировать
Нужно просто определить для типа точек P алгебраические операции "+", "-" между точками и "*", "/" на число.
Да можно проще.. Всё в конечном счёте сводится к СЛАУ на P0, P1, и т.д..


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 19, 2018, 17:12
Нашел давние материалы (см. во вложении). С тех пор навряд ли что-то изменилось)).


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 20, 2018, 11:55
Нашел давние материалы (см. во вложении). С тех пор навряд ли что-то изменилось)).
Довольно общие выкладки, до конкретики еще далеко, но все равно спасибо.

Нашел я одну неказистую ссылочку (файл в аттаче), где товарищ Муртаза Хан предлагает реализацию МНК для кубического Безье. См описание в маленьклм pdf. Правда исходники на языке какого-то мат пакета, но понять можно. И очень мне его метод понравился. Во-первых, четко заявляется что исходные точки могут быть любой размерности. Во-вторых, нет никакой завязки на касательные в крайних точках как в алгоритме Шнейдера (гарантированный геморрой). Ну и вообще гораздо проще.

Ладно, решил я провериться. Строю свою кривую (пока всего 2 точки сплайна + 2 управляющие), потом перевожу ее в N точек и скармливаю алгоритму Хана. РАБОТАЕТ! Получаю те же  управляющие точки что и в исходной кривой. Хотелось похвастаться рисунком, но там просто 2 одинаковые кривые.

Это что же получается? А как же Academic Press, Ньютон, Рафсон и десятки статей которые, в принципе, всему этому вторят? Если вышел Муртаза и довольно простой алгеброй все решил - зачем все это нужно? Может его решение как-то ограничено, чего-то не учитывает? Не вижу чего

Правда с последним пунктом ("Fitting Strategy") я пока не разобрался. Ну побил все рекурсивно, и что дальше? Как работает "break-and-fit" не понял

К сожалению, это еще не все, есть еще проблема, напишу позже


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 21, 2018, 08:36
Довольно общие выкладки, до конкретики еще далеко, но все равно спасибо.

??? Написал пример получения СЛАУ (во вложении).

Обычно вопросы возникают при определении ti, которые должны обеспечить наилучшую параметризацию.
http://www.mathnet.ru/php/archive.phtml?wshow=paper&jrnid=zvmmf&paperid=773&option_lang=rus
http://www.dissercat.com/content/nailuchshaya-parametrizatsiya-v-zadachakh-priblizheniya-krivykh-i-poverkhnostei

Вывод этих работ по поиску наилучшей параметризации такой:
Цитировать
Параметризация, при которой в качестве параметра принимается длина интерполируемой кривой, является наилучшей. При использовании в качестве параметра длины ломаной получается параметризация близкая к наилучшей, причем для задачи параметрической аппроксимации этот параметр будет наилучшим.


Название: Re: Поиск готового решения
Отправлено: Racheengel от Июнь 22, 2018, 00:50
А мне одному интересно стало, как же юзеру то с этими 100500 точек работать?
А главное-зачем?


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 22, 2018, 07:41
А мне одному интересно стало, как же юзеру то с этими 100500 точек работать?
А главное-зачем?
Обычно 100500 точек - это какие-то дискретные измерения, которые хотелось бы заменить простой непрерывной аналитической зависимостью.
Задач, где это необходимо большое количество - наука, графические редакторы, CAD, имитация плавного движения по данным измерения и т.п.
100500 точек аппроксимируются и заменяются, например, 4-мя, с которыми пользователь впоследствии и работает.


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 22, 2018, 10:43
??? Написал пример получения СЛАУ (во вложении).
Да, спасибо, понял. Однако Ваш стартовый "знак удивления" не вполне уместен :), въехать о чем речь не так уж просто. 

1) Кто такие "фи" которыми прямо-таки засыпан весь pdf?
Это коэффициенты сплайна (для каждого сегмента) которые зависят только параметра t. Напр все данные есть, рисуем кривую
Цитировать
b0(t) = (1-t)^3
b1(t) = 3 (1-t)^2 t,
b2(t) = 3 (1-t) t^2
b3(t) = t^3

bezier(t) = b0(t) * A0  +  b1(t) * A1  +  b2(t) * A2  +  b3(t) * A3
где
A0 и A3 - точки сплайна, кривая проходит через них
A1 и A2 - управляющие точки, перемещая их юзер настраивает кривизну
Меняя t от 0 до 1 с каким-то шагом получаем кривую

2)
Цитировать
Для аппроксимации требуется решить систему линейных алгебраических
уравнений относительно A вида
Тут я довольно долго "лупал глазками" - откуда эта система взялась, в чем ее смысл и кто такие phi(k)? Наконец сообразил что это рез-т решения МНК который принимается без доказательств. А "k" - индексы коэффициентов (b0 (1, 2, 3) выше)

3)
Цитировать
Если требуется, чтобы сплайн начинался в точке 0 p , а заканчивался в точке
Np p , то СЛАУ можно привести к виду
Ну так получится "масло масляное", т.е. первое и второе ур-я обратятся в тождества. Просто A0 и A3 известны, имеем СЛАУ 2x2, т.е. оставляем только 2-е и 3-е ур-е, и в них суммы при A0 и A3 переносим вправо. Получаем именно то что у Хана - оказывается он ничего не изобретал а воспользовался известным в математике решением (о котором я не знал).

Но то "легко критиковать", в целом - отличное объяснение, еще раз спасибо. Обычно ж вообще ни хрена не получиnь, махнет хвостиком (типа "можно проще")  - и все   

Обычно вопросы возникают при определении ti, которые должны обеспечить наилучшую параметризацию.
Да, возникают, похоже я опять все неправильно понял. Напишу большой пост (с картинками  :))


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 22, 2018, 11:53
Еще раз как нарисовать кривую
Цитировать
b0(t) = (1-t)^3
b1(t) = 3 (1-t)^2 t,
b2(t) = 3 (1-t) t^2
b3(t) = t^3

bezier(t) = b0(t) * P0  +  b1(t) * P1  +  b2(t) * P2  +  b3(t) * P3
где
P0 и P3 - точки сплайна, кривая проходит через них
P1 и P2 - управляющие точки, перемещая их юзер настраивает кривизну
Меняя t от 0 до 1 с каким-то шагом получаем кривую

Это соответствует первому аттачу. Слева - путь, т.е. кривая на плоскости, справа - зависимости X и Y от времени t (x(t), y(t)). В верхней точке кривой скорость по Y = 0, а скорость по X везде постоянна. Ну такие вектора мы и даем драгать юзеру в левом окне. Хорошо, он взял и увеличил вектор по X (второй аттач). Путь как-то искривился, при этом у(t) остается без изменений, а вот x(t) - уже не движение с постоянной скоростью.

И вот это изменение X юзера может и не устроить, он хочет чтобы скорость по X оставалась постоянной. Очевидно это возможно (третий аттач), но как сделать это (интерактивной) настройкой? Ведь скорость по Y в верней точке уже 0.

Решается так: втихаря двигаем контрольные точки (в левом окне юзеру это не показываем), НО компенсируем это модуляцией t. Т.е. на вход рисования поступает уже не текущее время, а измененное

t = c3 * t^3 + c2 * t^2 + c1 * t + c0

Коэффициенты "с" вычисляются на основании доп параметра "W" (вес) который есть у каждой точки упр-я. Заметим что на 3-м аттаче вектора в правом  окне стали длиннее - это как раз и есть интерактивное упр-е весами. Чем длиннее вектор - тем больше W, это как бы "замедляет время" в окрестности точки (хотя и звучит бредово)

Ну и, естественно, кривые записанные с W != 1 под МНК не ложатся (не восстанавливаются). Так может Academic Press об этом и толковал? (вряд ли они не знали об МНК). В общем, пока не понял, думаю



Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 22, 2018, 14:27
Ну и, естественно, кривые записанные с W != 1 под МНК не ложатся (не восстанавливаются).

Ложатся ложатся).

Для МНК абсолютно без разницы какой набор базисных функций будет использован - ряд Тейлора, ряд Эйлера, полиномы Бернштейна, NURBS и т.п.
Не важно с весами кривые или нет.

Если в процессе аппроксимации необходимо найти еще  эти самые веса, то необходимо сформулировать аналитические зависимости, через которые можно эти самые веса вычислить.
Если зависимости для весов не линейные, то скорее всего, задача будет решаться методом последовательных приближений.

Цитировать
Ну так получится "масло масляное", т.е. первое и второе ур-я обратятся в тождества. Просто A0 и A3 известны ...

Значения A0 и A3 известны - это только для полиномов Бернштейна (Безье, NURBS и иже с ними).
A0=p0 и A3=p3

Для ряда Тейлора, например, будет
A0 = p0
A0 + A1 + A2 + A3 = p3.

Все зависит от вида сплайна, который определяется видом базисной функции "фи".


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 23, 2018, 09:07
Если в процессе аппроксимации необходимо найти еще  эти самые веса, то необходимо сформулировать аналитические зависимости, через которые можно эти самые веса вычислить.
Вот они
Цитировать
P0, P1, P2. P3 - точки сплайна. P0, P3 известны, нужно найти управляющие P1, P2
W1, W2 - веса точек P1 и P2, их тоже нужно найти

Модуляция параметра t
c3 * t^3 + c2 * t^2 + c1 * t = user_T
где
 user_T - "исходное" время на сегменте (от 0 до 1)
 t - модулированное время для вычисления коэффициентов Безье

Т.е. сначала решается кубическое ур-е и находится t

Коэффициенты "c" зависят от W1, W2

c1 = 3.0 * W1;
c2 = 3.0 * (-2.0 * W1 + W2);
c3 = 1 + 3.0 * (W1 - W2);

При W1 = 1/3 и W2 = 2/3 получим user_T = t

И вот еще: наше обсуждение игнорирует (или никак не учитывает) эту ссылку
http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c (http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c)
Которая по сути перепечатывалась много раз. Наивно полагать что авторы не знали общей математики (МНК, метод последовательных приближений и.т.п). Однако мои попытки "разобраться" в этой работе пока безуспешны. Первое на чем я затыкаюсь - это параметризация по длине пути (хорде chord). Ну ладно, пусть t - расстояние по пути (тоже от 0 до 1), как-то посчитали P1 и P2, и.. что мне с этим делать? У меня входные точки (x, y, z)(t) и выходные должны быть "в том же формате". Можете прояснить этот момент?

Спасибо

Update: подправил вычисление t.


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 25, 2018, 08:43
Ну ладно, пусть t - расстояние по пути (тоже от 0 до 1), как-то посчитали P1 и P2, и.. что мне с этим делать? У меня входные точки (x, y, z)(t) и выходные должны быть "в том же формате". Можете прояснить этот момент?

Вот как бы я решал задачу:

Пусть входные точки - это координаты пространства (x, y, z).
Тогда для каждой точки (xi, yi, zi) сопоставил бы параметр ti
Вариант 1 - как нормированную длину ломаной линии, проходящей через эти точки (близко к лучшей пространственной параметризации).
Вариант 2 - как нормированное время прохождения через эти точки (близко к лучшей параметризации по времени).

Далее использовал бы МНК и получил точки (x, y, z) сплайна P0, P1, P2, P3.

Сплайн определяет аналитическое множество точек "в том же формате", что и исходное аппроксимируемое множество - (x, y, z).

Вообще, мне не совсем ясен этот вопрос. Результат для МНК всегда "в том же формате", что и исходные данные (если, конечно, Вы не пытаетесь решить задачу по каждой компоненте отдельно).
Параметр ti должен быть одинаков для всех компонент, каждому  (xi, yi, zi) соответствует единственное значение ti.

Есть N точек (x, y, z) с регулярным шагом по времени. Порядок N - сотни, тысячи и больше. Требуется заменить их кубическим сплайном Безье с минимальным числом контрольных точек. Ну т.е. кривой проходящей через все N точек, разумеется с какой-то заданной погрешностью.

Вообще, правильное ли начальное описание задачи?

1. Есть ли в данных регулярный шаг по времени? Если да, то наилучшая параметризация для ti будет нормированное время, а не расстояние.

2. Что значит "кубическим сплайном Безье с минимальным числом контрольных точек"? У кубического сплайна Безье всегда 4 управляющие точки.
В общем случае для построения кривой, аппроксимирующей все N точек с какой-то заданной погрешностью, может потребоваться либо более одного сплайна Безье, либо другой вид сплайна, либо сплайн Безье более высокого порядка.
В первом случае требуется использовать более одного сплайна Безье и стыковать их по условиям неразрывности и гладкости, либо использовать более сложные B-сплайны или NURBS и добиваться нужной точности путем последовательного увеличения количества используемых контрольных точек сплайна.

Цитировать
И вот еще: наше обсуждение игнорирует (или никак не учитывает) эту ссылку
http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c

Ссылку посмотрю чуть позднее.


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 25, 2018, 12:21
Вот как бы я решал задачу:

Пусть входные точки - это координаты пространства (x, y, z).
Тогда для каждой точки (xi, yi, zi) сопоставил бы параметр ti
Вариант 1 - как нормированную длину ломаной линии, проходящей через эти точки (близко к лучшей пространственной параметризации).
Вариант 2 - как нормированное время прохождения через эти точки (близко к лучшей параметризации по времени).

Далее использовал бы МНК и получил точки (x, y, z) сплайна P0, P1, P2, P3.
А есть ли здесь 2 варианта? Вот как я понял (не стесняйтесь поправлять). Геометрическая (пространственная) параметризация - значит параметр t сопоставляется с (относительной) длиной пути. Вначале t каждой точки считается как сумма длин пройденных отрезков, но потом может меняться - вместо ломаной уже есть какая-то кривая, расстояние по ней может быть значительно больше чем по начальной ломаной.

А вот параметризация "по времени" никаким изменениям уже не подлежит, т.к. время жестко привязано к точкам. И вот теория концентрируется на параметризации "по длине". Т.е. "есть исходные точки" (2D или 3D) и по ним нужно найти сплайн - а время тут как бы и ни причем. Вообще-то это разумно - ведь когда мы видим путь (траекторию) - мы ничего не можем сказать как он проходился по времени. Но меня-то это не устраивает, требуется получить не только траекторию в пр-ве, но и x(t), y(t) и z(t). Поэтому для искомых точек P1 и P2 нужно получить не только (x, y, z) но и время - а где его взять? См 3 картинки выше - в правом окне ведь тоже есть управляющие точки, и они должны иметь 2 координаты.

Использовать найденное решение можно если исходные точки представить как пары "время + значение". И тупо передрать код, пусть себе параметризует по хорде. А на выходе для P1 и P2 мы получим и значение и время. Но увы, на 3 координаты это никак не распространяется (ну это я так думаю).

Выходит остается только "вариант 2" (параметризуемся по времени, дальше МНК).  Он совсем не плох (сейчас доделываю), но никак не учитывает модуляцию по времени (фактически ре-параметризацию). На выходе имеем P1(x, y, z) и P2(x, y, z), времени-то все равно нет, остается положить его 1/3 для P1 и 2/3 для P2 (работает)

Вообще, правильное ли начальное описание задачи?
Ну то уже включается "думать неохота" :) Все там правильно, и все Вы прекрасно поняли 


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 25, 2018, 15:17
Варианты параметризации - это следствие прикладных целей задачи. Поэтому легко может быть и больше, чем 2 варианта)).
Вариант с параметризацией по пространству имеет цель - наилучшее приближение геометрии, поэтому и параметр t выбирается через дистанция вдоль кривой.
Вариант с параметризацией по времени преследует наиболее точное соответствие данных к времени. Например, экспериментальные зависимости и т.п.

Можно построить и сплайн вида P(u), где P - это точки (x, y, z, t), тогда время t - это одна из компонент, а в качестве параметра будет выступать u.
Параметризацию u можно выполнить по пространственным хордам sqrt(dx2+dy2+dz2), координата времени не участвует.
В этом случае t = t0 + t1u + t2u2 + t3u3, и чтобы найти точку на момент t потребуется решить уравнение относительно u, а затем найти уже x, y и z.


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 26, 2018, 09:05
Цитировать
И вот еще: наше обсуждение игнорирует (или никак не учитывает) эту ссылку
http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c

Ссылку посмотрю чуть позднее.

По ссылке реализовано приближение точек набором сплайнов Безье 3-го порядка с целью геометрического приближения с заданной точностью.
Этот вариант мы тоже рассматривали.

Цитировать
В общем случае для построения кривой, аппроксимирующей все N точек с какой-то заданной погрешностью, может потребоваться либо более одного сплайна Безье ...

Для стыковки сплайнов между собой введены дополнительные условия неразрывности и гладкости, которые в 2D случае выражаются в равенстве точек и тангенсов, а в общем виде - в равенстве производных сплайнов по параметру t в крайних точках.
Далее набор точек параметризуется по длинам хорд и аппроксимируется сплайном Безье.
Если точности недостаточно, то сначала уточняют параметризацию, рассчитывая длины вдоль дуг.
Если и в этом случае точности недостаточно, то делят наборы точек на два множества в месте наибольшего отклонения.
Для каждого из набора точек повторяют операцию построения сплайна Безье.

Представленная реализация - это частный случай для 2D точек и сплайна Безье 3-го порядка. Обобщить на 3D или сплайны другого порядка нельзя, так как вместо производных тангенсы, да и уравнения преобразованы.
То что я писал - это самый общий случай, из которого получается и представленный частный.
Равномерность по времени здесь не учитывается (если она нужна), так как цель - наилучшее пространственное приближение.


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 26, 2018, 12:10
Если и в этом случае точности недостаточно, то делят наборы точек на два множества в месте наибольшего отклонения.
Это нужно делать для любого метода, нельзя надеяться  что любой набоо точек ляжет под 1 сегмент (кривую всего из 2 точек). Сейчас этим и занимаюсь, и выплыла такая деталь:  "точка наибольшего отклонения" вовсе не означает "точку наилучшего разбиения", иногда начинает молотить так:

[0..60]  - пытаемся аппроксимировать 61 точку одним сегментом. Не выходит, погрешность больше допустимой, наибольшая в точке.. 1(?). Затем в точке 2 и.т.д. пяток-десяток "лишних" сегментов наструячит. Сейчас убираю их вторым проходом.

Для стыковки сплайнов между собой введены дополнительные условия неразрывности и гладкости,
Нет, это юзер решает интерактивно


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 26, 2018, 13:05
Переформулируем задачу с учетом предыдущего обсуждения. Всякие разжевывания опускаем

Для сегмента сплайна (P0, P1, P2, P3) требуется найти P1 и P2. Это успешно решается МНК с параметризацией по времени. Теперь хотелось бы большего - уметь находить "веса" W1 и W2 для точек P1 и P2. См. аттач. Углы наклона симметричны, но W1 = 2, W2 = 1, поэтому кривая несимметрична.  Собсно ничего страшного не случится с обычным МНК - ну да, не вытянет он такое одним сегментом, накидает 1-2 лишних точек, это не катастрофа. Но все-таки хотелось бы. Как используются веса

Цитировать
1) Модулируется время
c3 * t^3 + c2 * t^2 + c1 * t = user_T

Т.е. сначала решается кубическое ур-е и находится параметр t.  Коэффициенты "c"

q1 = W1 / 3
q2 = 1 - W2 / 3
c1 = 3.0 * q1;
c2 = 3.0 * (-2.0 * q1 + q2);
c3 = 1 + 3.0 * (q1 - q2);

Выше это уже было. просто здесь W1 и W2 как их видит юзер (по умолчанию единички)

2) И с подделанным t рисуем кривую "увеличивая" управляющие точки, т.е.

bezier(t) = P0 * b0(t) + (P0 + (P1 -  P0) * W1) * b1(t) + (P3 - (P3 - P2) * W2) * b2(t) + P3 * b3(t)

В рез-те углы наклона остаются теми же, но кривая больше "прижимается" к касательной с большим весом
Здесь пока мы никак не продвинулись (ну это нормально, задачка непростая)
Можно построить и сплайн вида P(u), где P - это точки (x, y, z, t), тогда время t - это одна из компонент, а в качестве параметра будет выступать u.
Параметризацию u можно выполнить по пространственным хордам sqrt(dx2+dy2+dz2), координата времени не участвует.
В этом случае t = t0 + t1u + t2u2 + t3u3, и чтобы найти точку на момент t потребуется решить уравнение относительно u, а затем найти уже x, y и z.
Думаю параметризация по длине/хорде здесь вообще ни причем. Гарантируется что шаг по времени между исходными точками достаточно мал (обычно это данные "кадр за кадром"). Др словами нет опасности что сплайн выбросит какую-то "петлю" между 2 исходными точками. Да, мы можем параметризоваться по длине и посчитать время таким же образом как x, y. z - но что это за значения и что с ними дальше делать? Не вижу как они связаны с искомыми W1 и W2


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 26, 2018, 16:37
Направление для размышления).

Кривая Безье 3-го порядка выглядит так:

bezier(t) = p0 * b0(t) + p1 * b1(t) + p2 * b2(t) + p3 * b3(t)

Для удобства пользователя ее представляют с весами в виде:

bezier(t) = P0 * b0(t) + (P0 + (P1 -  P0) * W1) * b1(t) + (P3 - (P3 - P2) * W2) * b2(t) + P3 * b3(t)

Соответственно соотношения между точками pi, найденными с помощью МНК, и точками Pi с весами будет таким

p0 = P0
p1 = P0 + (P1 -  P0) * W1
p2 = P3 - (P3 - P2) * W2
p3 = P3

4-е уравнения, 6-ть неизвестных P0, P1, P2, P3, W1, W2.

Если построить сплайн в том числе и для компоненты времени T, то при параметризации по хордам получим хорошее приближение к правильному движению вдоль кривой. В нужном месте в нужное время).

T = T0 + T1 * t + T2 * t^2 + T3 * t^3

Рассчитанные Ti не являются ci в Ваших выражениях?

c3 * t^3 + c2 * t^2 + c1 * t = user_T

Тогда дополним 4-е уравнения еще такими:

c1 = T1
c2 = T2
c3 = T3
q1 = W1 / 3
q2 = 1 - W2 / 3
c1 = 3.0 * q1;
c2 = 3.0 * (-2.0 * q1 + q2);
c3 = 1 + 3.0 * (q1 - q2);

Уравнений стало больше, чем неизвестных))). 12-ть уравнений, 11-ть неизвестных - P0, P1, P2, P3, W1, W2, c1, c2, c3, q1, q2.
Чем-то нужно пренебречь или дополнить ещё другими условиями или допущениями.


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 26, 2018, 17:39
ssoft, завтра подумаю о Вашем предложении. А сегодня наконец доделал второй проход. Очень прилично работает (аттач). "Синицу" уже имеем  :)


Название: Re: Поиск готового решения
Отправлено: m_ax от Июнь 26, 2018, 21:33
Ой, товарищь ssoft Вам уже всё разжевал.. Время взять и сделать уже наконец)


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 27, 2018, 13:11
Если построить сплайн в том числе и для компоненты времени T, то при параметризации по хордам получим хорошее приближение к правильному движению вдоль кривой. В нужном месте в нужное время).
Получим P1 и P2 для "скорости от пути". И что с ними делать? С весами W1, W2 они никак не связаны. Напр при W1 = W2 = 1 скорость может гулять как хочет в зависимости от исходных точек.

Рассчитанные Ti не являются ci в Ваших выражениях?
К сожалению - нет. Правду сказать, идей нет - может ларчик просто "не открывался" т.е. задача не решаема?

товарищь
Для фанов дуста объясняю еще раз: в существительных мужского рода оканчивающихся на шипящую - мягкий знак НЕ пишется.


Название: Re: Поиск готового решения
Отправлено: ViTech от Июнь 27, 2018, 13:22
товарищь
Для фанов дуста объясняю еще раз: в существительных мужского рода оканчивающихся на шипящую - мягкий знак НЕ пишется.

Правильно. Тру товарищ должен быть товарищЪ :).


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 28, 2018, 10:38
Есть мысль искать W1 и W2 на втором проходе. Это выглядит так:

- ключи посчитаны (имеются P1 и P2) в точках напр 10, 20, 30. Пытаемся посчитать W1 и W2 в точках 10 и 30, и, если получится, выкинуть точку 20. 

Чувствую это уже решается, правда пока не знаю как  :)


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 28, 2018, 14:48
Есть мысль искать W1 и W2 на втором проходе.
...  и, если получится, выкинуть точку 20.

Веса введены для удобства работы со сплайном. Их наличие или отсутствие никаким образом не влияет на полученную форму кривых Безье.
В Вашем случае веса связаны также с законом изменения времени вдоль сплайна.
Таким образом найти значения весов можно только, имея эту самую зависимость времени вдоль сплайна.
Именно поэтому я предложил построить сплайн в том числе и относительно времени.

Я ранее случайно написал сплайн по времени в виде полинома, а нужно было в виде сплайна Безье), так будет правильнее

Цитировать
Если построить сплайн в том числе и для компоненты времени T, то при параметризации по хордам получим хорошее приближение к правильному движению вдоль кривой.

T =  T0 * b0(t) + T1 * b1(t) + T2 * b2(t) + T3 * b3(t)

Если я правильно понимаю, то запись c3 * t^3 + c2 * t^2 + c1 * t = user_T означает заданный пользователем закон изменения времени вдоль кривой.
Используя известные зависимости

q1 = W1 / 3
q2 = 1 - W2 / 3
c1 = 3.0 * q1;
c2 = 3.0 * (-2.0 * q1 + q2);
c3 = 1 + 3.0 * (q1 - q2);

это уравнение можно привести к виду

W1 * phi1(t) + W2 * phi2(t) = 0;

и решить задачу МНК относительно поиска W1 и W2.
(Так не получится, но можно по-другому. Конкретнее в следующем посте.)

После этого определить P0, P1, P2, P3 из найденых W1, W2, p0, p1, p2, p3
(p0, p1, p2, p3 - найденные с помощью МНК опорные точки для сплайна Безье 3-го порядка)

p0 = P0
p1 = P0 + (P1 -  P0) * W1
p2 = P3 - (P3 - P2) * W2
p3 = P3


Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 28, 2018, 15:32
Веса введены для удобства работы со сплайном. Их наличие или отсутствие никаким образом не влияет на полученную форму кривых Безье.
В Вашем случае веса связаны также с законом изменения времени вдоль сплайна.
...
Если я правильно понимаю, то запись c3 * t^3 + c2 * t^2 + c1 * t = user_T означает заданный пользователем закон изменения времени вдоль кривой.
Все что делает юзер влияет на форму кривой - иначе эта операция не имеет для него смысла. См напр эффект применения весов на картинке выше. Как работают веса

- да, меняется параметризация, и это зависит только от весов W1 и W2
- НО длины векторов (P1 - P0) и (P3 - P2) также меняются  (множатся на W1 и W2) - причем втихаря                                                                                         

Вот выше было 3 картинки. Само по себе изменение управляющих точек P1 и P2 соответствует изменению скоростей вдоль (x, y, z), т.е. повороту векторов в левом окне. А при изменении весов скорости в крайних точках остаются неизменными, т.к. бОльшие вектора компенсируются параметризацией.

Собсно по-другому "веса" никак и не сделать. Ну и все это довольно стандартно, просмотрев пяток 3D приложений увидим такое же поведение.

это уравнение можно привести к виду

W1 * phi1(t) + W2 * phi2(t) = 0;

и решить задачу МНК относительно поиска W1 и W2.
Так t теперь уже не овечка-костанта. Как его выразить через user_T (исходное время)? 


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 29, 2018, 14:27
Попробовал решить задачу.

Пришел к выводу, что не понимаю откуда "ноги растут" в выражении - откуда оно берется и какой смысл несёт.

c3 * t^3 + c2 * t^2 + c1 * t = user_T

и почему

q1 = W1 / 3
q2 = 1 - W2 / 3
c1 = 3.0 * q1;
c2 = 3.0 * (-2.0 * q1 + q2);
c3 = 1 + 3.0 * (q1 - q2);

Подставляя разные значения вместо W1 и W2 получаем практически произвольные кривые для нахождения t, причем не из какого-то фиксированного диапазона [0,1] (см.аттач).

Вопрос 1 - что это и как конкретно с этим работают?

Вопрос 2 - может мы вообще имеем дело с рациональными сплайнами Безье? Там веса имеют вполне определенный смысл.
http://edu.alnam.ru/book_cpsp.php?id=47



Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 29, 2018, 15:55
Попробовал решить задачу.

Пришел к выводу, что не понимаю откуда "ноги растут" в выражении - откуда оно берется и какой смысл несёт.

c3 * t^3 + c2 * t^2 + c1 * t = user_T

и почему

q1 = W1 / 3
q2 = 1 - W2 / 3
c1 = 3.0 * q1;
c2 = 3.0 * (-2.0 * q1 + q2);
c3 = 1 + 3.0 * (q1 - q2);

Подставляя разные значения вместо W1 и W2 получаем практически произвольные кривые для нахождения t, причем не из какого-то фиксированного диапазона [0,1] (см.аттач).

Вопрос 1 - что это и как конкретно с этим работают?
Да, это место действительно мозголомное :) "Чего хочет юзер" - см аттач. Это "значение одной из компонент от ВРЕМЕНИ"  (не кривая на плоскости). Синие вектора - это скорости (точнее тангенсы углов касательных). А вот длины этих векторов - веса. Формулы для коэффициентов "с" я просто передрал. Предполагаю что выводятся они так:  в ур-е кривой подставляются новые управляющие точки

P1' = P0 + (P1 - P0) * W1
P2' = P3 - (P3 - P2) * W2

И берется производная ф-ции  bezier(func(user_T))  по user_T. При этом производные func(user_T) по user_T в крайних точках известны - они те же самые что для W1 = W2 = 1. (скорости там какими были такими и остались при любых W1 и W2). Если всю эту бадягу расписать - то получим коэффициенты  "c" зависящие только от W1 и W2 (ну это я так думаю)

Вопрос 2 - может мы вообще имеем дело с рациональными сплайнами Безье? Там веса имеют вполне определенный смысл.
http://edu.alnam.ru/book_cpsp.php?id=47
Точно НЕТ, я сначала тоже клюнул на это взвешивание, долго бился - ну не работает оно как надо! Ключевой момент/соображение - веса W1 и W2 НЕ меняют скоростей в крайних точках


Название: Re: Поиск готового решения
Отправлено: ssoft от Июнь 29, 2018, 16:54
Да, это место действительно мозголомное :) "Чего хочет юзер" - см аттач. Это "значение одной из компонент от ВРЕМЕНИ"  (не кривая на плоскости). Синие вектора - это скорости (точнее тангенсы углов касательных). А вот длины этих векторов - веса.

В этом самом c3 * t^3 + c2 * t^2 + c1 * t = user_T вся суть. Иначе следует параметризовать по времени и принять веса равными 1, так как других условий не вводится.

Отмечаю также, то что представлено на рисунке выглядит не как

bezier(t) = P0 * b0(t) + (P0 + (P1 -  P0) * W1) * b1(t) + (P3 - (P3 - P2) * W2) * b2(t) + P3 * b3(t)

а как (см.аттач)

bezier(t) = P0 * b0(t) + (P0 + (P1 -  P0) * 3 * W1) * b1(t) + (P3 - (P3 - P2) * 3 * W2) * b2(t) + P3 * b3(t)



Название: Re: Поиск готового решения
Отправлено: Igors от Июнь 30, 2018, 05:03
Отмечаю также, то что представлено на рисунке выглядит не как

bezier(t) = P0 * b0(t) + (P0 + (P1 -  P0) * W1) * b1(t) + (P3 - (P3 - P2) * W2) * b2(t) + P3 * b3(t)

а как (см.аттач)

bezier(t) = P0 * b0(t) + (P0 + (P1 -  P0) * 3 * W1) * b1(t) + (P3 - (P3 - P2) * 3 * W2) * b2(t) + P3 * b3(t)
Это уже дела UI. Показывать юзверю сами управляющие точки неудобно, поэтому рисуется вектор скорости заданной/фиксированной длины (в пикселях) что соответствует W = 1. Заметим что W1 и W2 не могут быть сколь угодно велики т.к. кривая перехлестнется. Строго говоря корректные значения W1 + W2 <= 3