forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Физика (http://forum.boolean.name/forumdisplay.php?f=101)
-   -   Волны (http://forum.boolean.name/showthread.php?t=13800)

Reizel 30.11.2010 15:41

Волны
 
Заинтересовался тут над темкой - создать небольшой симулятор..... Волны!
Той самой волны, которая образуется в реке при попадании в нее камня, или другого предмета :)

Моя теория (неудачная):
имеем кучу точек в 2Д пространстве, с четким промежутком, этак пикселей 20.
Каждая точка находит среднюю арифметическую У-координату двух соседних точек, и прибавляет к своему вектору ускорения по Y это самое число, умноженное на некий коэффициент (допустим, .01)
получается вполне рабочяя хрень, но! сделав ровную водную поверхность, я "бросил" в нее камушек. Получилось так, что в месте падения продолжительное время колебались волны, и далее круг волны не распространялся. Может кто знает какой-нибудь другой алгоритм???

.Squid 30.11.2010 16:21

Ответ: Волны
 
Затухающая синусоида, не?

tormoz 30.11.2010 21:18

Ответ: Волны
 
Формула Лапласа

Reizel 03.12.2010 02:08

Ответ: Волны
 
Почитал про формулу Лапласа...
Может быть это и подходит для решения задачи, но эти дьявольские интегралы (ко всему еще и определенные) у меня отбивают всякое желание делать сие.
К тому же я не дружу особо с вышкой, поэтому не могу понять как она применяется. Чтож, буду бить в бубен :)

tormoz 03.12.2010 04:55

Ответ: Волны
 
ProcedureDLL UpdateWater_tm()
ForEach Water()
Lis.l=ListIndex(water())
If PeekL(water()\surf+36)<>0
;=================
If water()\ss
hdd.f=0.06
dimple(ListIndex(water()),Random(water()\width),Ra ndom(water()\depth),hdd.f)
EndIf
;--------------------------
For xm= 1 To water()\width+1
For zm=1 To water()\depth +5

If zm<water()\depth-1 And xm<water()\width-1

yv.f=nU(Lis,xm,zm)*water()\h

PokeF (memM(Lis,xm,zm)+4,yv.f)
heiM (Lis,xm,zm)=yv.f

laplas.f=(nU(Lis,xm-1,zm)+nU(Lis,xm+1,zm)+nU(Lis,xm,zm+1)+nU(Lis,xm,zm-1))*0.25-nU(Lis,xm,zm)
pU(Lis,xm,zm)=((2.0-water()\sd)*nU(Lis,xm,zm)-pU(Lis,xm,zm)*(1.0-water()\sd)+laplas)

EndIf
;================================================= =
If zm>4
zmn=zm-5
xmn=xm-1
;-----------------normal-------


e1.f And e0.f=heiM (Lis,xmn,zmn)
If xmn<water()\width
e0.f=heiM (Lis,xmn+1,zmn)
EndIf

If xmn>0
e1.f=heiM (Lis,xmn-1,zmn)
EndIf

xn.f=-(e0.f-e1.f)

e1.f And e0.f=heiM (Lis,xmn,zmn)
If zmn<water()\depth
e0.f=heiM (Lis,xmn,zmn+1)
EndIf

If zmn>0
e1.f=heiM (Lis,xmn,zmn-1)
EndIf

zn.f=e0.f-e1.f
yn.f=4

;--------------------normalisate--------
;-------------------------
PokeF (memM(Lis,xmn,zmn)+12,xn.f)
PokeF (memM(Lis,xmn,zmn)+16,yn.f)
PokeF (memM(Lis,xmn,zmn)+20,zn.f)
EndIf

Next
Next

;================================

;EndIf

*Sw=AllocateMemory(65535)
RtlMoveMemory_(*Sw,@pU(Lis,0,0),65535)
RtlMoveMemory_(@pU(Lis,0,0),@nU(Lis,0,0),65535)
RtlMoveMemory_(@nU(Lis,0,0),*Sw,65535)
FreeMemory(*Sw)



PokeL(water()\surf+36,0)
EndIf

Next


EndProcedure
;================================

nil0q 18.12.2011 20:12

deleted


Часовой пояс GMT +4, время: 07:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot