B-сплайн 3 класса (неоднородный и не фрактальный) в qt c ++ - PullRequest
0 голосов
/ 28 февраля 2020

У меня проблема с изменением кода на основе кривой Безье (которая работает) на B-сплайн. Вот как это др aws:

text

Basi c формула: text

void MainWindow::rysujKrzywa(int koniec){
    double x, y;
    tm = m - 3;
    for( double t = 0; t <= m-2; t += 0.01){
        x = ((((-1 * pow(t-tm,3)) + (3 * pow(t-tm,2)) - (3 * (t-tm)) + 1) / 6) * punkty[koniec - 2]) +
                ((((3 * pow(t-tm,3)) - (6* pow(t-tm,2)) + 4) / 6) * punkty[koniec - 4]) +
                ((((-3 * pow(t-tm,3)) +(3 * pow(t-tm,2)) + 3*(t-tm) +1) / 6) * punkty[koniec - 6]) +
                (((pow(t-tm,3))/6) * punkty[koniec - 8]);
        y = ((((-1 * pow(t-tm,3)) + (3 * pow(t-tm,2)) - (3 * (t-tm)) + 1) / 6) * punkty[koniec - 1]) +
                ((((3 * pow(t-tm,3)) - (6* pow(t-tm,2)) + 4) / 6) * punkty[koniec - 3]) +
                ((((-3 * pow(t-tm,3)) +(3 * pow(t-tm,2)) + 3*(t-tm) +1) / 6) * punkty[koniec - 5]) +
                (((pow(t-tm,3))/6) * punkty[koniec - 7]);
        drawPixel( int(x), int(y), 255, 0, 0);
    }
    update();
}
a small dictionary:
punkty - saved points
koniec - end

Полный код в хранилище : https://gitlab.com/Sempron/b-spline

1 Ответ

1 голос
/ 28 февраля 2020

Если код выглядит сложным, то, скорее всего, он действительно слишком сложный.

Давайте сконцентрируемся на этой части:

x = ((((-1 * pow(t-tm,3)) + (3 * pow(t-tm,2)) - (3 * (t-tm)) + 1) / 6) * punkty[koniec - 2]) +
            ((((3 * pow(t-tm,3)) - (6* pow(t-tm,2)) + 4) / 6) * punkty[koniec - 4]) +
            ((((-3 * pow(t-tm,3)) +(3 * pow(t-tm,2)) + 3*(t-tm) +1) / 6) * punkty[koniec - 6]) +
            (((pow(t-tm,3))/6) * punkty[koniec - 8]);

Затем вы можете ввести

auto temp = t-tm;

Далее, в формуле у вас есть четыре различных термина. Я не вижу их в вашем коде. Сделайте их явными

auto x_term1 = - pow(temp,3) + (3 * pow(temp,2)) - (3 * temp + 1);    
x_term1 *= punkty[koniec - 2] / 6;
auto x_term2 = ...
...
x = x_term1 + x_term2 + x_term3 + x_term4;

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

PS: Лучше не использовать pow для возведения в квадрат чисел. pow - для показателей с плавающей запятой, которые стоят дороже, чем вам нужно здесь. Я просто не хотел менять ваши реальные расчеты.

...