Autor Wątek: B Spline i algorytm De Boor'a  (Przeczytany 1869 razy)

Offline ismu

  • Użytkownik

# Maj 29, 2013, 10:19:58
Witam. Od wczoraj siedzę nad implementacją algorytmu De Boor'a dla B Spline(http://mst.mimuw.edu.pl/lecture.php?lecture=gk1&part=Ch6#S2.SS2). Problem polega na tym, że coś źle robię, ponieważ dostaje out of range, bo w pewnym momencie iterator przyjmuje wartość ujemną. Nie jestem wstanie wychwycić co robię nie tak, więc piszę tu z prośbą o pomoc, może ktoś to implementował już i szybko znajdzie błąd. Z góry dzięki za pomoc.
Kod:
float BSpline(float _t);
float U[] = {0, 0.2, 0.3, 0.3, 0.6, 0.8, 1};
float Px[] = {22, 15, 20, 18};
float Py[] = {-1, -9, 1.5, 15};

int const degree = 3;
int const controlPointIndex = 3;

float BSpline(float _t)
{
int k, r;
float a;
vector<vector<float>> d;

k = 6 - degree - 1;
r = 0;
while(_t < U[k])
k--;
while(r < degree && _t == U[k - r])
r++;
d.push_back(vector<float>());
for(int i = k - degree; i <= k; i++)
d[0].push_back(Px[i]);
for(int j = 1; j <= degree - r; j++)
{
d.push_back(vector<float>());
for(int i = k - degree + j; i <= k - r; i++)
{
a = (_t - U[i]) / (U[i + degree - j + 1] - U[i]);
d[j].push_back((1 - a) * d[j - 1][i - 1] + a * d[j - 1][i]);
}
}
return d[degree - r][k - r];
}

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Maj 29, 2013, 12:22:07
panie, ale na której linijce sie wypiernicza?

Offline ismu

  • Użytkownik

# Maj 29, 2013, 14:03:09
Najczęściej na tej d[j].push_back((1 - a) * d[j - 1][i - 1] + a * d[j - 1][i]);, bo po przeliczeniu indeksów w pewnym momencie wychodzi odwołanie do ujemnego indeksu. Chociaż nie zawsze tu. Kod jest kompletny można skompilować i zobaczyć gdzie się wywala dla danego _t.
« Ostatnia zmiana: Maj 29, 2013, 14:20:16 wysłana przez ismu »

Offline koirat

  • Użytkownik

# Maj 29, 2013, 15:49:17
Swoją drogą naprawdę fajnie przygotowane materiały dydaktyczne na tej stronce.

Offline czoper

  • Użytkownik
    • czoper.devlog

# Maj 29, 2013, 16:16:21
tak na szybko (bez kompilacji) sugerowałbym przesunięcie linii:

for(int i = k - degree; i <= k; i++)
                d[0].push_back(Px[i]);

gdzieś wyżej, bo wcześniej modyfikujesz wartość k i już w tej pętli indeks i może Ci wyjść ujemny.

Offline ismu

  • Użytkownik

# Maj 29, 2013, 16:31:05
Masz rację jednak akurat nie chodzi mi o to miejsce. Przeprawiając nawet tą pętle na iteracje od 0 do max indeks punktu wywala się w tej linijce co napisałem wyżej. Po prostu według mnie problem leży w złym zinterpretowaniu pseudo kodu(złe wartości początkowe iteratorów lub warunki kończące). Jednak ja po kilku godzinach patrzenia się i analizy nic nie wyłapałem sensownego(próbowałem gdzieś te indeksy zwiększyć o 1 to dla danego _t chodziło później zmieniłem _t i już znowu się wywalało). Tak więc bawimy się dalej :)

EDIT:
Nikt nie jest w stanie coś pomóc? Czemu tak się dzieje zazwyczaj z moimi pytaniami, że nie uzyskuje odpowiedzi? ;p Tak więc pozostaje mi chyba liczenie punktów wprost z równań.
« Ostatnia zmiana: Maj 30, 2013, 21:55:59 wysłana przez ismu »