Мне кажется, вам нужен только один взгляд.
^(?=(?:\D*\d){3}\D*$)(?:[^A-Z]*[A-Z]){2}[^A-Z]*$
\d
- short для цифры. \D
является отрицанием \d
и соответствует незначению (?=
открывает положительный lookahead . (?:
открывает группу захвата . ^
start (?=(?:\D*\d){3}\D*$)
смотрит ровно на три цифры, пока $
end . (?:[^A-Z]*[A-Z]){2}[^A-Z]*
соответствует строке с ровно двумя верхними альфами, пока $
не закончится. [^
открывает отрицательный класс символов . Если вы хотите разрешить только буквенно-цифровые символы, замените [^A-Z]
на [a-z\d]
, как в этой демонстрации .
Шлиц Catmull-Rom, как гарантируют, пройдет через все контрольные точки. Я нахожу, что это более удобно, чем попытка скорректировать промежуточные контрольные точки для других типов шлицов.
Этот PDF Christopher Twigg имеет хорошее краткое введение в математику шлица. Лучшее сводное предложение:
Шлицы Catmull-Rom имеют непрерывность C1, локальное управление и интерполяцию, но не лежат в выпуклой оболочке их контрольных точек.
Сказанный иначе, если точки указывают на резкий изгиб направо, шлиц будет управлять банком оставленный прежде, чем повернуться направо (существует изображение в качестве примера в том документе). Плотность тех заходит управляемый в этом случае с помощью его tau параметра в матрице в качестве примера.
Вот другой пример с некоторым загружаемым кодом DirectX.
Одним путем является Lagrange полином, который является методом для создания полинома, который пройдет все точки определенных данных.
В течение моего первого года в университете я записал немного инструмента для выполнения в этом 2D, и можно найти его на этой странице, это называют Lagrange решателем. Страница Википедии также имеет демонстрационную реализацию.
То, как это работает, таким образом: у Вас есть полином n-порядка, p(x)
, где n является числом очков, Вы имеете. Это имеет форму a_n x^n + a_(n-1) x^(n-1) + ...+ a_0
, где _
нижний индекс, ^
питание. Вы затем превращаете это в ряд одновременных уравнений:
p(x_1) = y_1
p(x_2) = y_2
...
p(x_n) = y_n
Вы преобразовываете вышеупомянутое в расширенную матрицу и решаете для коэффициентов a_0 ... a_n
. Затем у Вас есть многочлен, который проходит все точки, и можно теперь интерполировать между точками.
Отметьте однако, это не может удовлетворить Вашей цели, поскольку она не предлагает способа скорректировать искривление и т.д. - Вы застреваете с единым решением, которое не может быть изменено.
Необходимо смотреть на B-сплайны. Их преимущество перед Кривыми Безье состоит в том, что каждая часть только зависит от локальных точек. Так перемещение точки не имеет никакого эффекта на части кривой, которые являются далеко, где "далеко" определяется параметром шлица.
Проблема с многочленом Langrange состоит в том, что добавление точки может иметь экстремальные эффекты на на вид произвольные части кривой; нет никакой "локальности", любят описанный выше.
Вы посмотрели на команду шлица Unix? Это может быть принуждено в выполнение, что Вы хотите?
К сожалению, Lagrange или другие формы полиномиальной интерполяции не будут работать над произвольным набором точек. Они только работают над набором где в одном размере, например, x
кси <xi+1
Для arbitary набора точек, например, курса полета самолета, где каждая точка (долгота, широта) пара, Вы будете более обеспечены просто моделирование поездки самолета с текущей долготой и широтой и скоростью. Путем корректировки уровня, на котором самолет может повернуться (его угловая скорость) в зависимости от того, как близко это к следующему waypoint, можно достигнуть плавной кривой.
Получающаяся кривая не была бы математически значительной, ни дала бы Вам bezier контрольные точки. Однако алгоритм был бы в вычислительном отношении прост независимо от количества waypoints и мог произвести интерполированный список точек при произвольной гранулярности. Это также не потребовало бы, чтобы Вы обеспечили полный набор точек впереди, Вы могли просто добавить waypoints в конец набора как требуется.
В 3D графическом мире NURBS популярен. Дальнейшая информация легко погуглена.
Существует несколько алгоритмов для интерполяции (и exrapolating) между aribtrary (но финал) набор точек. Необходимо проверить числовые рецепты, они также включают реализации C++ тех алгоритмов.
Google "ортогональная регрессия".
Принимая во внимание, что методы наименьших квадратов пытаются минимизировать вертикальное расстояние между пригодной строкой и каждым f (x), ортогональная регрессия минимизирует перпендикулярные расстояния.
Приложение
В присутствии шумных данных почтенный алгоритм RANSAC стоит проверить также.