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

[allegro]problem z fizyką cieczy

Ostatnio zmodyfikowano 2010-09-26 21:47
Autor Wiadomość
pekfos
Temat założony przez niniejszego użytkownika
[allegro]problem z fizyką cieczy
» 2010-09-26 14:04:58
Piszę sobie od tak dla zabawy program symulujący spływanie cieczy, jednak występuje problem z którym próbuje się uporać cały dzień.
Wygląda to tak:
http://screenup.pl/?l=MZ9C9JE
(ah ta kompresja stratna..)
i prostokąt wody zamiast spaść w formie prostokątu spada w tej formie.
to kod odpowiedzialny za wszystko:
C/C++
void phy::fall() {
    for( int a = 0; a < molecues.size(); a++ ) {
        if( molecues[ a ].y < 449 && !coll( molecues[ a ].x, molecues[ a ].y + 1 ) ) {
            molecues[ a ].on = 0;
            molecues[ a ].y++;
        }
        else if( coll( molecues[ a ].x, molecues[ a ].y + 1 ) || molecues[ a ].y == 449 ) {
            if( molecues[ a ].on >= 2 ) {
                if( !coll( molecues[ a ].x + 1, molecues[ a ].y ) && molecues[ a ].x < 399 ) molecues[ a ].x++;
                else if( !coll( molecues[ a ].x - 1, molecues[ a ].y ) && molecues[ a ].x > 0 ) molecues[ a ].x--;
               
            } else molecues[ a ].on++;
           
        }
    }
}
Jak widać pisząc to chciałem by woda się rozpływała po zderzeniu z podłożem.
co ważne funkcja coll sprawdza kolizje z podłożem i innymi cząstkami wody.
nie wiem czemu się tak rozjeżdża..
P-22383
inny1997
» 2010-09-26 18:31:30
już chyba wiem dlaczego ,bo numerujesz molekuły w zły sposób. wydaje mi się
że wszystkie molekuły są ponumerowane gdzieś tak :
1,2 ,3 ,4,
5,6 ,7 ,8,
9,10,11,12,
i tak dalej...
to powoduje że  właściwie poruszają się tylko te dolne molekuły .
wtedy spadają tylko te molekuły które są na dole , a górne molekuły uważają że mają kolizjie i poruszają się na boki ,co powoduje kolejne błędy.
uważam że powinieneś numerować odwrotnie (od dołu do góry).
P-22391
pekfos
Temat założony przez niniejszego użytkownika
» 2010-09-26 18:37:09
to już próbowałem.. i odwrotnie wrzucając do kontenera, i odwrotnie iterując w pętli ale nic to nie dawało.. znaczy dawało.. rozpływało się w inny sposób:P. Jak pewnie widać w kodzie każda molekuła ma swój timer-czas od kąd nie spadała(składowa on). więc przerwy w spadaniu powinny być odfiltrowywane ale i tak nic z tego..
P-22393
DejaVu
» 2010-09-26 20:02:55
Wiesz... moim zdaniem powinieneś sprawdzać od dołu czy jest wolna linia, a nie sąsiad. Stąd się tworzą Tobie schodki. Ogólnie temat ciekawy, ale dzisiaj nie mam dnia, a najbliższe 2 tygodnie to będzie masakra, więc niestety będę tylko biernym obserwatorem tego tematu...
P-22398
inny1997
» 2010-09-26 20:32:39
może powinno być
for(int a=0 ; a <= molecues.size();a++)
może w tym jest błąd .
wystarczy ,że jedna molekuła inaczej się porusza (błędnie) i całość zachowuje się innaczej.
P-22403
ison
» 2010-09-26 20:34:58
@up raczej nie
przykładowo dla wektora: 5,6,4,3
metoda size() zwróci 4
a indeksy liczb w wektorze będą wynosiły: 0,1,2,3

zatem Twoim sposobem autor będzie odwoływał się do elementu o indeksie 4 - który nie istnieje
P-22404
inny1997
» 2010-09-26 20:44:01
no tak zapomniałem że jak liczy się od zera .
. ta forma jest symetryczna , więc błąd nie jest w numerowaniu molekuł .
błąd jest w zachowaniu całości spróbuj podglądać każde powtórzenie operacji (wyświetlaj za każdy krokiem położenie wszystkich molekuł) . może zauważysz w czym jest błąd . nie potrafie wyobrazić sobie zachowanie wszystkich molekuł .
P-22405
pekfos
Temat założony przez niniejszego użytkownika
» 2010-09-26 21:21:25
forma nie jest symetryczna. są małe ukośne linie u góry jednak kompresja utraciła te dane.. próbowałem zatrzymywać program w każdym obiegu funkcją allegro_message() i wyglądało to tak, jakby.. nagle jeden rząd wykrywał kolizję kiedy jej nie było..
Na screenie po środku widać te prążki.
C/C++
bool phy::coll( int x, int y ) {
    for( int a = 0; a < molecues.size(); a++ ) {
        if( molecues[ a ].x == x && molecues[ a ].y == y ) return true;
       
    }
    return false;
}
jednak tu wręcz nie ma co nie działać..
P-22408
« 1 » 2
  Strona 1 z 2 Następna strona