Есть ли библиотека Java с функциями сплайна 3D? - PullRequest
2 голосов
/ 02 июня 2009

В частности, мне нужен способ представления кривой / сплайна, который проходит через набор известных трехмерных точек, и способ нахождения других точек на кривой / сплайне путем деления / интерполяции.

Например, если у меня есть набор точек от P0 до PN, я хочу найти 100 точек между P0 и P1, которые находятся на сплайне, который проходит через P0 и P1.

Я вижу, что Java3D KBRotPosScaleSplinePathInterpolator выполняет такие вычисления, но он привязан к модели этого графа API, и я не вижу, как вернуть нужные мне значения.

Ответы [ 7 ]

4 голосов
/ 03 июня 2009

Вы ищете что-то похожее на Сплайн Catmull Rom . Реальность такова, что математика просто не , с которой трудно справиться (некоторые умножения векторной матрицы). Я рекомендую вам просто реализовать сплайн, который вам действительно нужен в коде.

Цитата из этой статьи :

Точки, которые определяют сплайн известный как «Контрольные точки». Один из Особенности сплайна Катмулла-Рома что указанная кривая пройдет через все контрольные точки - это не относится ко всем типам шлицы.

An illustration of the Catmull-Rom spline passing through all control points.

Чтобы вычислить точку на кривой, два точки по обе стороны от желаемого точки, как показано на оставил. Точка определяется значение т, которое обозначает часть расстояние между двумя ближайшими контрольные точки.

Вы должны знать, однако, что сплайн Catmull-Rom может привести к маленьким петлям в контрольных точках, если они находятся слишком близко друг к другу, когда им нужно сделать крутой поворот.

Глядя на изображение выше, представьте, что p1 и p3 были рядом друг с другом, ниже p2 (в основном сжимая правую часть изображения). Вполне вероятно, что сплайн Catmull-Rom спустится с p0, пройдет через p1, как это происходит сейчас, поднимется по правой стороне p2 и пройдет через него справа налево, спускаясь с левой стороны и проходя слева направо через p3.

Это является следствием построения сплайна.

Это похоже на работу с довольно жесткой гибкой трубой (как у меня под раковиной). Чтобы получить длинную часть для соединения с точками, которые находятся близко друг к другу, я должен добавить петлю.

3 голосов
/ 31 июля 2009

Для тех, кто борется с математикой за кривыми, вы можете найти это полезным, в частности, изображения ниже. Идея проста:

Пусть t цикл от 0,0 до 1,0.

Для каждой пары точек в наборе grey вычислите точку на доли пути между ними (используя t). Эти точки показаны в зеленый .

Для каждой пары точек в наборе green вычислите точку на доли пути между ними (используя t). Эта точка показана в черном .

Для различных значений t черная точка будет другой линией вдоль кривой.

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

Я обнаружил, что это гораздо легче понять, реализовать и расширить до 3-х измерений, чем любой другой вариант, который я нашел.

аппроксимация кривой с использованием линейной интерполяции http://bimixual.org/AnimationLibrary/Bezier_2_big.gif аппроксимация кривой с использованием линейной интерполяции http://bimixual.org/AnimationLibrary/Bezier_3_big.gif

2 голосов
/ 12 апреля 2010

Я хорошо понимаю линейную интерполяцию, но мне было трудно понять сложность математики сплайнов. Вот почему я искал какую-то библиотеку, которая бы обеспечивала абстракцию для сокрытия трудной математики. Следующая функция оказалась достаточной для моих нужд. Это основано на уравнении, найденном в http://www.mvps.org/directx/articles/catmull/, но, к счастью, вам не нужно понимать, как оно работает. Просто помните, что в отличие от линейной интерполяции, когда для начала вам нужны только две точки, сплайн-интерполяция Catmull-Rom использует дополнительную точку на обоих концах. Так что если вы хотите сплайн, который проходит через 10 точек, вам нужно 12.

Эта функция демонстрирует сплайн-интерполяцию Катмулла-Рома в одном измерении. (Для 2 или 3 измерений просто повторите, используя значения Y или Z.) Эта функция даст нам точку на сплайне между p1 и p2, где t - пропорция расстояния между ними.

public class SplineTest {

    // Catmull-Rom spline interpolation function
    public static double q(double t, double p0, double p1, double p2, double p3) {

        return 0.5 * ((2 * p1) + (-p0 + p2) * t
                + (2 * p0 - 5 * p1 + 4 * p2 - p3) * (t * t) + (-p0 + 3 * p1 - 3
                * p2 + p3)
                * (t * t * t));
    }

    public static void main(String[] args) {
        double t = 0.0;
        while (t <= 1.0) {
            System.out.println(q(t, 5, 10, 20, 10));
            t += 0.1;
        }
    }
}

Эта программа выводит:

10.0
10.887500000000001
12.0
13.2625
14.6
15.9375
17.2
18.3125
19.2
19.7875
20.000000000000004
1 голос
/ 19 мая 2012
1 голос
/ 02 июня 2009

Нет встроенной библиотеки, о которой я знаю. Источник

0 голосов
/ 21 марта 2015

Я только что попробовал libGDX, Apache License http://github.com/libgtx/libgtx

Он содержит класс BSpline и прост в использовании.

https://github.com/Graphics3D/ect/blob/master/src/main/java/courbes_bsplines/TestGDXBSpline.java

0 голосов
/ 09 апреля 2010

Я еще не пробовал, но скорее всего попробую в ближайшее время для создания трехмерной поверхностной сетки из случайных точечных входных данных: toxiclib как инструмент Spline3d

http://code.google.com/p/toxiclibs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...