Znalazłem taki materiał na Wikipedii: http://en.wikipedia.org/wiki/Elastic_collision w ostatnim akapicie "Two-Dimensional Collision With Two Moving Objects".
Więc posłużyłem się tym wzorem, ale mam do tego pewne wątpliwości:
- czy właściwie podstawiłem kąty do danych (sprawdzając metodą System.out.print() działało wszystko w porządku):
angleColRad = Math.atan2(y - sp.getY(), x - sp.getX()); //sprawdzam kąt wzgledem obiektu kolizyjnego
angleColDeg = Math.toDegrees(angleColRad); //uzyje je i porownam do wzoru w kolizji miedzyobiektowej;
if (angleColDeg < 0) {
angleColDeg += 360;
}
angleMovRad = Math.atan2((y - lasty), (x - lastx));
angleMovDeg = Math.toDegrees(angleMovRad);
if (angleMovDeg < 0) {
angleMovDeg += 360;
}
sp -> jest to tak samo obiekt koło (argument funkcji collisionCircles()), z którym co fps porównuje, czy zachodzi z nim kolizja - z nim ingeruje główny obiekt koło;
angleMovDeg -> kąt ruchu kółka, pobieram poprzednią pozycję i kiedy ruszam w górny prawy róg wartość wynosi 45, jak w prawo to 0, w lewo 180, w dol 270;
angleColDeg -> kąt kolizyjny dwóch kółek, podobnie jak wyżej zwraca kąty wzgledem obiektu sp, górny prawy róg 45 itd;
Wcześniej kąty zwracały wartości od -179 do 180, więc dodałem warunek, który wszystkie wartości ujemne zamienia na ich odpowiedniki plusowe, tzn. kąt -1 to kąt 359, jednak i to nie pomogło :(
Wartości ujemne znajdowały się na ćwiartkach IV i III, w tym, że wartości na IV były od -1 do -90, natomiast na III od -90 do -179
- czy dobrze go napisałem jako formuła w strukturze:
float newSpeedx1 = (float) (((speedx * Math.cos(angleMovDeg - angleColDeg) * (mass - sp.getMass())
+ (2 * sp.getMass() * sp.getSpeedx() * Math.cos(sp.getAngleMovDeg() - angleColDeg))) / (mass + sp.getMass()))
* Math.sin(angleColDeg) + (speedx * Math.sin(angleMovDeg - angleColDeg) * Math.sin(angleColDeg + (180 / 2))));
float newSpeedy1 = (float) (((speedy * Math.cos(angleMovDeg - angleColDeg) * (mass - sp.getMass())
+ (2 * sp.getMass() * sp.getSpeedy() * Math.cos(sp.getAngleMovDeg() - angleColDeg))) / (mass + sp.getMass()))
* Math.sin(angleColDeg) + (speedy * Math.sin(angleMovDeg - angleColDeg) * Math.sin(angleColDeg + (180 / 2))));
float newSpeedx2 = (float) (((sp.getSpeedx() * Math.cos(sp.getAngleMovDeg() - angleColDeg) * (sp.getMass() - mass)
+ (2 * mass * speedx * Math.cos(angleMovDeg - angleColDeg))) / (sp.getMass() + mass))
* Math.sin(angleColDeg) + (sp.getSpeedx() * Math.sin(sp.getAngleMovDeg() - angleColDeg) * Math.sin(angleColDeg + (180 / 2))));
float newSpeedy2 = (float) (((sp.getSpeedy() * Math.cos(sp.getAngleMovDeg() - angleColDeg) * (sp.getMass() - mass)
+ (2 * mass * speedy * Math.cos(angleMovDeg - angleColDeg))) / (sp.getMass() + mass))
* Math.sin(angleColDeg) + (sp.getSpeedy() * Math.sin(sp.getAngleMovDeg() - angleColDeg) * Math.sin(angleColDeg + (180 / 2))));
sp -> jak wyżej obiekt, z którym może dojść do kolizji.
newSpeedx1 -> nowa predkosc, ktora zostanie przypisana do zmiennej speedx;
newSpeedy1 -> nowa predkosc, ktora zostanie przypisana do zmiennej speedy;
newSpeedx2 -> analogicznie do sp.speedx
newSpeedy2 -> analogicznie do sp.speedy
W efekcie obiekty zatrzymują się w sobie, czasem odbiją się na oko w porządku lub tak jakby źle określało kąt odbicia (w przypadku kolizji ponownie wpadają na siebie) - stąd podejrzewam, że problem dotyczy kątów lub całej formuły.