Волны
Заинтересовался тут над темкой - создать небольшой симулятор..... Волны!
Той самой волны, которая образуется в реке при попадании в нее камня, или другого предмета :) Моя теория (неудачная): имеем кучу точек в 2Д пространстве, с четким промежутком, этак пикселей 20. Каждая точка находит среднюю арифметическую У-координату двух соседних точек, и прибавляет к своему вектору ускорения по Y это самое число, умноженное на некий коэффициент (допустим, .01) получается вполне рабочяя хрень, но! сделав ровную водную поверхность, я "бросил" в нее камушек. Получилось так, что в месте падения продолжительное время колебались волны, и далее круг волны не распространялся. Может кто знает какой-нибудь другой алгоритм??? |
Ответ: Волны
Затухающая синусоида, не?
|
Ответ: Волны
Формула Лапласа
|
Ответ: Волны
Почитал про формулу Лапласа...
Может быть это и подходит для решения задачи, но эти дьявольские интегралы (ко всему еще и определенные) у меня отбивают всякое желание делать сие. К тому же я не дружу особо с вышкой, поэтому не могу понять как она применяется. Чтож, буду бить в бубен :) |
Ответ: Волны
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 ;================================ |
deleted
|
Часовой пояс GMT +4, время: 20:46. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot