Skocz do zawartości

[Delphi] Błąd w szumie Perlina


Force

Polecane posty

Napisałem sobie kod, który w założeniu ma generować mapę wysokości używając szumu Perlina. przepisałem go z książki z C++ i tam działa u mnie nie. Parametr jaki przesyłam do mojej funkcji szumu jest za duży po pewnej iteracji pętli i dostaje wyjątek z tego powodu, i to wszystko jedno czy użyje integer czy int 64. Mapa ma wymiary - (0..623,0.493). Mój kod:

 
for y := 0 to Height do
   for x := 0 to Width do
   begin
     xf := x/Width*NoiseSize;
     yf := y/Height*NoiseSize;
     total := 0;
     for k := 0 to Octaves - 1 do
     begin
       // Obliczam frekwencje i amplitudę
       freq := Power(2,k);
       amp := Power(Persistence,k);
       // Obliczam kordynaty szumu
       tx := xf*freq;
       ty := yf*freq;
       tx_int := Round(tx);
       ty_int := Round(ty);
       //Oblicam ułamki x i y
       fracX := tx-tx_int;
       fracY := ty-ty_int;
       // Dla oktawy obliczam szumy 4 punktów
       v1 := Noise(tx_int+ty_int*57+Generateseed);
       v2 := Noise(tx_int+1+ty_int*57+Generateseed);
       v3 := Noise(tx_int+(ty_int+1)*57+Generateseed);
       v4 := Noise(tx_int+1+(ty_int+1)*57+Generateseed);
       //Wygałdzam po x
       i1 := CosInterpolate(v1,v2,fracX);
       i2 := CosInterpolate(v3,v4,fracX);
       //Wygładzam po y i dodaje do sumy
       total := total+CosInterpolate(i1,i2,fracY)*amp;
     end;
     b := Round(128+total*128);
     if b<0 then
       b := 0
     else
     if b>255 then
       b := 255;
     fHeights[x,y] := Round(b/255*MaxHeight);
   end;

Czy ktoś kiedyś pisał szum w Delphi i czy miał podobne obliczanie wartości dla każdej oktawy? Bo chyba to nie wina wymiaru map? Błąd sie pokazuje prawie natychmiast (y=0, a x

 

Edit: Problem rozwiązany. Po debugowaniu kodu w c++, okazało się, że.. integer ma być przepełniany i powinienem wyłączyć w tym miejscu czepianie się o to. Głupie C :D

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...