Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Symulacja cząsteczek wody - wzory

Ostatnio zmodyfikowano 2013-07-06 21:45
Autor Wiadomość
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 :)
P-87140
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.
C/C++
#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;
}
P-87156
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.
P-87169
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 :)
P-87172
« 1 »
  Strona 1 z 1