Интерполяция Катмулла-Рома в Ruby
У меня есть список точек, между которыми я хочу провести плавную линию. Я использую библиотеку RVG для рисования, поэтому, если бы я мог получить строку SVG из моих точек, я был бы счастлив. Обыскал и обнаружил, что Catmull-Rom, вероятно, является алгоритмом для использования.
Нашел некоторые реализации в библиотеках Kamelopard и Rubyvis, но не смог понять, как их использовать из моего списка пунктов.
Итак, вопрос в том, как я могу взять свой массив (x,y) точек и получить из них интерполированную кривую SVG Кэтмулла-Рома?
1 ответ
Catmull-Rom - это, пожалуй, хорошее место для начала. Недавно я повторно внедрил версию Kamelopard и нашел это полезным: http://www.cs.cmu.edu/~462/projects/assn2/assn2/catmullRom.pdf
Это довольно просто, если вы понимаете умножение матриц. В итоге вы получите матричное уравнение, которое вам нужно будет оценить несколько раз, по одному разу на точку на пути, который вы рисуете. Если у вас есть контрольные точки A, B, C и D, и вы хотите нарисовать кривую между B и C, создайте матрицу, где A, B, C и D - строки, и вставьте ее в уравнение в верхняя часть бумаги, с которой я связан. Это будет последняя матрица в списке. Другие значения, которые вам нужно знать, это "u", который находится в диапазоне от 0 до 1, и "T", "натяжение" сплайна. Вы будете оценивать уравнение несколько раз, увеличивая u по его области каждый раз. Вы можете установить любое натяжение в диапазоне от 0 до 1, и оно будет влиять на то, насколько резко изгибается сплайн. 0,5 является общим значением.
Если вы пытаетесь оценить кривую между, например, первыми двумя контрольными точками в вашем списке или двумя последними, вы обнаружите, что у вас есть проблемы при создании матрицы, потому что вам нужны две контрольные точки по обе стороны от точка, которую вы оцениваете. В этих случаях просто дублируйте первую или последнюю контрольную точку, если необходимо.