Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#pragma once #define DEFAULT_SIZE (100) #define DEFAULT_VISC (0.02f) #define DEFAULT_EQUI (0.1f) #define SQRT2 (0.70710678118654752440084436210485) class OscFluid { public: OscFluid(const int NewSize = DEFAULT_SIZE, const float NewVisc = DEFAULT_VISC, const float NewEqui = DEFAULT_EQUI); ~OscFluid(); int PosIdx(int x, int y); //convert position to index void Update(); const int Size; const int Area; const float Visc; //viscosity const float Equi; //equilibrium float* Press; //pressure float* Vel; //velocity float* Perm; //permeability private: inline void Solve(const int ThisIdx, const int OtherIdx, const float Amount); inline void Apply(const int ThisIdx); }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#include "OscFluid.h" OscFluid::OscFluid(const int NewSize, const float NewVisc, const float NewEqui) : Press(nullptr), Vel(nullptr), Perm(nullptr), Size(NewSize), Area(NewSize * NewSize), Visc(NewVisc), Equi(NewEqui) { Press = new float[Area]; Vel = new float[Area]; Perm = new float[Area]; for (int i = 0; i < Area; ++i)//default values { Press[i] = 0.5f; Vel[i] = 0.0; Perm[i] = 1.f; } for (int i = 0; i < Size; ++i)//walls, not permeable { Perm[PosIdx(i, 0)] = 0.f; Perm[PosIdx(i, Size - 1)] = 0.f; Perm[PosIdx(0, i)] = 0.f; Perm[PosIdx(Size - 1, i)] = 0.f; } } OscFluid::~OscFluid() { delete[] Press; delete[] Vel; delete[] Perm; } int OscFluid::PosIdx(const int X, const int Y) { return X + Y * Size; } void OscFluid::Update() { for (int ThisIdx = 0; ThisIdx < Area; ++ThisIdx) { if (Perm[ThisIdx] > 0.f) { Solve(ThisIdx, ThisIdx + 1, Equi); Solve(ThisIdx, ThisIdx - 1, Equi); Solve(ThisIdx, ThisIdx + Size, Equi); Solve(ThisIdx, ThisIdx - Size, Equi); Solve(ThisIdx, ThisIdx + 1 + Size, Equi * SQRT2 ); Solve(ThisIdx, ThisIdx + 1 - Size, Equi * SQRT2 ); Solve(ThisIdx, ThisIdx - 1 + Size, Equi * SQRT2 ); Solve(ThisIdx, ThisIdx - 1 - Size, Equi * SQRT2 ); } } for (int ThisIdx = 0; ThisIdx < Area; ++ThisIdx) { if (Perm[ThisIdx] > 0.f) { Apply(ThisIdx); } } } void OscFluid::Solve(const int ThisIdx, const int OtherIdx, const float Amount) { const float Acc = (Press[ThisIdx] - Press[OtherIdx]) * Perm[OtherIdx] * Amount; Vel[OtherIdx] += Acc; } void OscFluid::Apply(const int ThisIdx) { Press[ThisIdx] += Vel[ThisIdx]; Vel[ThisIdx] *= (1.f - Visc); } |
Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von »Horus« (05.07.2014, 23:37)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Administrator
Werbeanzeige