[C++] Symulacja cząsteczek wody - wzory
Ostatnio zmodyfikowano 2013-07-06 21:45
matka5432 Temat założony przez niniejszego użytkownika |
[C++] Symulacja cząsteczek wody - wzory » 2013-07-06 13:52:16 Nie bede was wglebial w problem, bo nawet nie ma sensu sie rozpisywac. Powiedzmy, ze pixel [100,100] jest zrodlem pewnej sily magnetcznej (z kazdej strony ten sam biegun) i potrzebuje obok (czyli tab[90][90][0] do tab[110][110][0] i tab[90][90][1] do tab[110][110][1]) nadac wartosci dwóm tablicom (ktore maja taki sam rozmiar jak obrazek) odpowiednie wartosci sily magnetycznej w odopowiednich miejscach. Pierwsza tablica to sila pozioma, druga to sila pionowa. Wiec wzor powinien wygladac tak: f - sila r - odleglosc
jakas_czesc_pierwszej_tablicy * (f / r^2) np: 1/5 * (f / r^2)
a drugi:
jakas_czesc_drugiej_tablicy * (f / r^2) np: 4/5 * (f / r^2)
tak, zeby suma obu czesci na danej odleglosci, zawsze byla rowna (f / r^2) czyli: 1/5 * (f / r^2) + 4/5 * (f / r^2) = (f / r^2) Chodzi poprostu o to, zeby te 2 maski(tablice) obrazu mialy zapisane miejsce i wartosc sily, ktora emituje dany pixel. Nie wiem tylko jak zapisac wartosc "jakas_czesc_pierwszej_tablicy" i "jakas_czesc_drugiej_tablicy". Na pewno nie moge podzielic koordynacji np: x/y * (f / r^2) a drugie: (y - x)/y * (f / r^2). Tak, suma bedzie wynosila (f / r^2), ale obie zmienne moga rownie dobrze miec np wartosci 1000 i - 990, ja chce, zeby byly tylko w takim przedziale jaka wartosc ma zmienna "f", czyli 0 - f. Z gory dziekuje :) |
|
unimator |
» 2013-07-06 16:48:07 Zapewne nie do końca zrozumiałem o czym piszesz, ale może Ci się to do czegoś przyda. Zapomniałem liter a i b pomalować - a to fioletowa, b to żółta. Funkcja wypełniająca okrąg i przykład użycia. #include <cmath> #include <cstdio>
const double epsilon = 0.001; const double PI = 3.14159265; const int sizeX = 30, sizeY = 30;
struct XY { XY( int a, int b ) { x = a; y = b; } unsigned x; unsigned y; };
template < typename T > void fillCircle( XY source, double r, T ** array, T value ) { XY prev( source.x, source.y ); XY cur( 0, 0 ); double angle = 0; do { cur.x = floor( cos( angle ) * r ) + source.x; cur.y = floor( sin( angle ) * r ) + source.y; angle += epsilon; if( cur.x == prev.x && cur.y == prev.y ) continue; prev = cur; if( cur.x >= 0 && cur.y >= 0 ) if( cur.x < sizeX && cur.y < sizeY ) array[ cur.x ][ cur.y ] = value; } while( angle < 2 * PI ); }
int main() { char ** tab = new char *[ sizeX ]; for( int i = 0; i < sizeX; ++i ) { tab[ i ] = new char[ sizeY ]; for( int j = 0; j < sizeY; ++j ) tab[ i ][ j ] = '0'; } for( int i = 5; i > 0; --i ) fillCircle < char >( XY( 10, 10 ),( double ) i,( char ** ) tab, '1' ); for( int i = 0; i < sizeX; ++i ) { for( int j = 0; j < sizeY; ++j ) { printf( "%c", tab[ i ][ j ] ); } delete[] tab[ i ]; printf( "\n" ); } delete[] tab; return 0; }
|
|
matka5432 Temat założony przez niniejszego użytkownika |
» 2013-07-06 21:38:16 Unimator, rzeczywiscie do czegos mi sie to przydalo :D dzieki wielkie ;p To podzielenie koordynacji przez siebie bylo jednak dobrym sposobem, musialem dodac tylko kilka warunkow, ktore "przekieruja" do odpowiedniego wzoru. Jednym wzorem tego sie chyba nie da okreslic. Btw,chodzilo mi o zrobienie symulacji czasteczek wody, tak, aby nie nachodzila jedna na druga. |
|
DejaVu |
» 2013-07-06 21:45:04 Fajnie, że problem został rozwiązany, ale prosiłbym o nazwanie teraz tematu tak, aby opisywał to co było rozwiązywane, a nie fakt istnienia problemu :) |
|
« 1 » |