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: 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.. |
|
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). |
|
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.. |
|
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... |
|
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.
|
|
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 |
|
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ł . |
|
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. 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ć.. |
|
« 1 » 2 |