• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Symulacja odbijania się cząsteczek od powierzchni pod różnymi kątami ( naprawa bugów )

Object Storage Arubacloud
0 głosów
304 wizyt
pytanie zadane 19 sierpnia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 21 sierpnia 2019 przez Jakub 0

Hej wszystkim, to moje wcześniejsze pytanie w tym temacie:

https://forum.pasja-informatyki.pl/444587/symulacja-odbicia-scian-roznych-nachyleniach-prosba-matematyczna-chodzi-arkanoid#c444902

oto mój obecny kod źródłowy: https://github.com/Jakub1010/Particles

Projekt wykorzystuje bibliotekę SFML, by zrozumieć w czym jest problem polecam po prostu odpalić kod ( dodałem też plik *.exe skompilowany pod systemem windows ).

Pracuje nad prostym symulatorem grawitacji, aktualnie napisałem symulację odbijania się cząsteczek od ścian, nie było by w tym nic trudnego gdyby to była jakaś forma prostokąta, mi jednak zależało na stworzeniu systemu odbijania się "piłek" od nawierzchni pod różnymi kątami. Tak jak to widać na screenie poniżej:

Same obliczenia się sprawdzają i cząstki odbijane są pod odpowiednim nachyleniem. Jednak nie brakuje tu problemów, często piłki wypadają z wnętrza struktury albo "zatrzymują się w połowie ściany". Próbowałem te problemy rozwiązać np. blokując możliwość podwójnego odbicia się cząstki od tej samej powierzchni:

void Particle::update(float deltaTime, const Area& walls) {

	static bool reflectionEnable = true; // czy odbicie się cząski jest możliwe
	static std::size_t lastEdge = 0; // ostatnia ściana od jakiej nastąpiło osbicie 

	sf::Vector2f particlePosition = m_particle.getPosition();
	m_particle.move(sf::Vector2f(m_velocity.x, m_velocity.y) * Speed * deltaTime);

	const std::size_t size = walls.getEdgesSize(); 
	const sf::Vector2f s = m_particle.getPosition(); 
	const float radius = m_particle.getRadius(); 

	float reflectionDetect = false; // czy nastąpiło jakiekolwiek odbicie 
	for (std::size_t i = 0; i < size; ++i) {
		float distance = walls.getDistanceToEdge(i, s);
		if (distance <= m_particle.getRadius()) { // kolizja ze ścianą 
			reflectionDetect = true; 
			if (i == lastEdge) {
				if (reflectionEnable) {
					m_velocity = walls.getReflectionVectorFromEdge(i, m_velocity);
					reflectionEnable = false; // nie ma możliwości powtórnego odbicia się od tej ściany
				}
			}
			else {
				m_velocity = walls.getReflectionVectorFromEdge(i, m_velocity);
				lastEdge = i;
				reflectionEnable = false;
			}
			break; 
		}
	}

	if (!reflectionDetect)
		reflectionEnable = true; 
}

Powyższa metoda ma chyba najważniejszą rolę w tym pytaniu, to ona wykrywa kolizje cząstki ze ścianą i wykonuje odpowiednie akcje.

Tak samo problemem jest nadawanie prędkości cząstkom, jeżeli będą one zmieniały swoją pozycje o dużą wartość to kolizja ze ścianą może w ogóle nie nastąpić:

być może trzeba totalnie inaczej zaprogramować prędkość, np. cząsteczki zawsze będą poruszały się tylko o jeden piksel a częstotliwość ich uaktualniania na ekranie będzie stanowić prędkość...

Nie wiem już sam jak do tego wszystkiego podejść :(

Liczę więc na waszą pomoc ( pomoc a nie gotowy kod ). Być może znacie jakiś algorytmy lub sami takie coś kiedyś robiliście?

Z góry bardzo wam dziękuje i serdecznie pozdrawiam :)

 

komentarz zamknięcia: otrzymałem pomoc

2 odpowiedzi

+2 głosów
odpowiedź 19 sierpnia 2019 przez mokrowski Mędrzec (155,460 p.)
wybrane 21 sierpnia 2019 przez Jakub 0
–1 głos
odpowiedź 19 sierpnia 2019 przez Dawid Markiewicz Obywatel (1,590 p.)
Nie wiem czy ci to pomoże ale kiedy robiłem projekty w sfml i miałem podobny problem spróbuj sprawdzac warunek co 1 piksel (lub wiecej jeżeli chcesz oszczędzić na wydajności) ale pozycje piłki na ekranie odświezac co 3 piksele lub wiecej

Podobne pytania

+1 głos
1 odpowiedź 103 wizyt
pytanie zadane 24 lipca 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
+1 głos
2 odpowiedzi 841 wizyt
pytanie zadane 27 października 2015 w HTML i CSS przez HaKIM Szeryf (87,590 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...