Показать сообщение отдельно
Старый 02.07.2011, 17:54   #118
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.


Пересадил на блитз "Алгоритм «diamond-square» для построения фрактальных ландшафтов" Потратил шесть часов на отладку неправильного метода, написал правильный за 20 минут. Я дебил или теперь так будет всегда?

Уважаемые знатоки, какого демона, этот шайтан код на основе рандомных значений рисует одну и туже картинку
Graphics3D 536,536,0,2
SetBuffer BackBuffer
()
Print 
"some kind of log"

Global xelements,yelements,maxd,img,h#

SeedRnd=MilliSecs()
z=Rand(20,4500)
xelements=512
yelements
=512
While  Not z=Or KeyHit(1)
maxd=maxd+1
z
=xelements Shr maxd
Wend
maxd
=maxd-1
Print "number of repetitions: "+maxd

Dim heightmap
#(xelements,yelements,2)
heightmap#(0,0,0)=Rnd(-5,5)                                                 heightmap#(0,0,1)=1
heightmap#(xelements-1,0,0)=Rnd(-5,5)                            heightmap#(xelements-1,0,1)=1
heightmap#(0,yelements-1,0)=Rnd(-5,5)                            heightmap#(0,yelements-1,0)=1
heightmap#(xelements-1,yelements-1,0)=Rnd(-5,5)        heightmap#(xelements-1,yelements-1,0)=1

h00#=heightmap#(0,0,0)
h10#=heightmap#(xelements-1,0,0)
h01#=heightmap#(0,yelements-1,0)
h11#=heightmap#(xelements-1,yelements-1,0)


For d=maxd To 0 Step -
For x0=0 To xelements-1
For y0=0 To yelements-1

    bz
=2^(d-1) ;òåêóùèé ðàäèóñ âîêðóã òî÷êè
    
            
; òåïåðü ãðàíèöû ìàññèâà íåíàðóøàåìû â ïðèíöèïå.
            
x000=Abs((x0-bzMod xelements)
            
y000=Abs((y0-bzMod yelements)
            
x001=Abs((x0+bz)Mod yelements)
            
y001=Abs((y0+bz)Mod yelements)            
            
x002=Abs((x0+bz-1)Mod yelements)
            
y002=Abs((y0+bz-1)Mod yelements)
            ; &
#226;åðøèíû â óãëàõ êâàäðàòà ñîäåðæàùåãî òî÷êó â öåíòðå
            
If heightmap#(x000,y000,1)=1 x00#=heightmap#(x000,y000,0)
            
If heightmap#(x001,y000,1)=1 x01#=heightmap#(x001,y000,0)
            
If heightmap#(x000,y001,1)=1 x10#=heightmap#(x000,y001,0)
            
If heightmap#(x001,y001,1)=1 x11#=heightmap#(x001,y001,0)
            
;ïðîâåðÿþ âåðøèíû íà âàëèäíîñòü çíà÷åíèé
            
If heightmap#(x001,y001,1)=1 And heightmap#(x000,y001,1)=1 And heightmap#(x001,y000,1)=1 And heightmap#(x000,y000,1)=1 Then
                
;åñëè ïðîâåðêà âûïîëíèëàñü ðèñóþ òî÷êè åñëè â âàëèäíîì ñëîå 0
                
If Not heightmap#(x0,y0,1)=1 heightmap#(x0,y0,0)=(x00+x01+x10+x11)/4+1.44*bz*Rnd(-0.2,0.2)
                
If Not heightmap#(x000,y0,1)=1 heightmap#(x000,y0,0)=(x00+x10)/2+bz*Rnd(-0.1,0.1)
                
If Not heightmap#(x001,y0,1)=1 heightmap#(x001,y0,0)=(x01+x11)/2+bz*Rnd(-0.1,0.1)
                
If Not heightmap#(x0,y000,1)=1 heightmap#(x0,y000,0)=(x00+x01)/2+bz*Rnd(-0.1,0.1)
                
If Not heightmap#(x0,y001,1)=1 heightmap#(x0,y001,0)=(x11+x10)/2+bz*Rnd(-0.1,0.1)
                
;ðèñóþ ïî 1 ñëîþ âàëèäàòîðû
                
heightmap#(x0,y0,1)=1
                
heightmap#(x000,y0,1)=1
                
heightmap#(x001,y0,1)=1
                
heightmap#(x0,y000,1)=1
                
heightmap#(x0,y001,1)=1
                        
            
EndIf
        

Next 
Next 
Print Abs((d-maxd)*100/maxd)+"%      "+(xelements-1)Mod (1 Shl d) + "      " bz
Next
Print "Array is ready"

MakeImage()



While 
Not  ((KeyDown(56) And KeyHit(62)) Or  (KeyHit(56) And KeyDown(62))  Or KeyHit(1))

UpdateWorld
RenderWorld
ClsColor 0
,75,151
Cls
DrawImage img
,12,12

;Text 200,400,17 Mod (1 Shl 8)
;
Text 200,420,hmin+"     "+hmax

Text 0
,0,1 Shl 8
Flip
Wend
End

Function MakeImage()
Print 
"Making image"
;ãðàôè÷åñêîå îòîáðàæåíèå ìîåãî ìàññèâà
hmax#=0
hmin#=0
For x=1 To xelements 
For y=1 To yelements 
x0
=x-1
y0
=y-1
If heightmap#(x0,y0,0)>hmax Then hmax=heightmap#(x0,y0,0)

If heightmap#(x0,y0,0)<hmin Then hmin=heightmap#(x0,y0,0)
Next 
Next 

h
#=hmax-hmin
Print h+"   Begin of building image"
img=CreateImage(xelements,yelements)
SetBuffer ImageBuffer(img)
ClsColor 255,0,0
Cls
For x=1 To xelements 
For y=1 To yelements 
x0
=x-1
y0
=y-1
d
=255*(heightmap#(x0,y0,0)-hmin)/h#

;If x0>xelements/2 Then d=Rand(0,255) ; for viewing regular noisejust to find is there any difference or not
Color d
,d,d
;If heightmap#(x0,y0)=0 Then Color 127,127,255 ;for showing sea level

Plot x0,y0

Next 
Next 
SetBuffer BackBuffer
()
;
ScaleImage img,4,4
;&#234;îíåö ñîçäàíèÿ ãðàôè÷åñêîãî ïðåäñòàâëåíèÿ ìàññèâà
End Function 

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Arton (27.05.2013), Mr_F_ (02.07.2011), Nex (02.07.2011), Program23 (02.07.2011)