Хобрук: Ваш путь к мастерству в программировании

Интерполяция Эрмита

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

Может ли кто-нибудь дать мне представление об этом? Вот мой код.

public ControlPoint Get(float t)
{
    //speed multiplyer
    //t = t * 10;

    return new ControlPoint(
        new Vector3(Hermite(points[0].pos.x,  points[1].pos.x, points[2].pos.x, points[3].pos.x, t)
        , Hermite(points[0].pos.y, points[1].pos.y, points[2].pos.y, points[3].pos.y, t)
        , Hermite(points[0].pos.z, points[1].pos.z, points[2].pos.z, points[3].pos.z, t)
        ),
        new Quaternion(Hermite(points[0].rot.x, points[1].rot.x, points[2].rot.x, points[3].rot.x, t)
        , Hermite(points[0].rot.y, points[1].rot.y, points[2].rot.y, points[3].rot.y, t)
        , Hermite(points[0].rot.z, points[1].rot.z, points[2].rot.z, points[3].rot.z, t)
        , Hermite(points[0].rot.w, points[1].rot.w, points[2].rot.w, points[3].rot.w, t)
        )
        );
}

float Hermite(
    float y0, float y1,
    float y2, float y3,
    float mu,
    float tension = 0,
    float bias = 0)
{
    float m0, m1, mu2, mu3;
    float a0, a1, a2, a3;

    mu2 = mu * mu;
    mu3 = mu2 * mu;
    m0 = (y1 - y0) * (1 + bias) * (1 - tension) / 2;
    m0 += (y2 - y1) * (1 - bias) * (1 - tension) / 2;
    m1 = (y2 - y1) * (1 + bias) * (1 - tension) / 2;
    m1 += (y3 - y2) * (1 - bias) * (1 - tension) / 2;
    a0 = 2 * mu3 - 3 * mu2 + 1;
    a1 = mu3 - 2 * mu2 + mu;
    a2 = mu3 - mu2;
    a3 = -2 * mu3 + 3 * mu2;

    return (a0 * y1 + a1 * m0 + a2 * m1 + a3 * y2);
}
18.07.2017

Ответы:


1

Я не являюсь экспертом по эрмитовым сплайнам при любом натяжении воображения, но из того, что я видел, ожидаемое поведение будет заключаться в интерполяции между второй и третьей точкой. Мне кажется, что вы просто жестко закодировали каждую координату в свою функцию Get, поэтому имеет смысл получить только одну интерполяцию, когда сплайн Эрмита является функцией. Думайте о второй и третьей точках как о двух точках, между которыми вы хотите выполнить интерполяцию, а первая и четвертая точки просто помогают создать лучшую кривую.

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

//Interpolate between 1st and 2nd points' x coord Hermite(points[0].pos.x, points[0].pos.x, points[1].pos.x, points[2].pos.x);

//Interpolate between 3rd and 4th points' x coord Hermite(points[2].pos.x, points[3].pos.x, points[4].pos.x, points[4].pos.x);

Для интерполяции между первой и второй точками points[0] повторяется дважды, поскольку points[-1] отсутствует. Для интерполяции между третьей и четвертой точками повторяется points[4], поскольку points[5] отсутствует.

Повторюсь, не вводите координаты жестко в код, если вам не нужна только одна интерполяция. Вам придется изменить свою функцию Get и вызвать ее несколько раз, чтобы настроить поведение, которое вы хотите. Посмотрите, как Снеа реализовал сплайн Эрмита в своей функции DrawGraph, это помогло мне лучше понять поведение сплайна Эрмита: Кубический сплайн Эрмита ведет себя странно

19.07.2017
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...