Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 15.05.2009, 17:16
baka вне форума Посмотреть профиль Отправить личное сообщение для baka Найти все сообщения от baka
  № 1  
Ответить с цитированием
baka

Регистрация: Nov 2006
Сообщений: 63
По умолчанию Проверка столкновения шариков

Мне нужно рассчитать столкновения шариков, я использую алгоритм из книжки Джоба Макара:

(проверяется столкнутся ли шары в следующем кадре)


Код AS1/AS2:
function ballToBallDetection(b1, b2) {
	//set the speed variables
	var xspeed1 = _root.yiff[b1].xspeed;
	var yspeed1 = _root.yiff[b1].yspeed;
	var xspeed2 = _root.yiff[b2].xspeed;
	var yspeed2 = _root.yiff[b2].yspeed;
	//set the position variables
	var xl1 = _root.yiff[b1].xpos;
	var yl1 = _root.yiff[b1].ypos;
	var xl2 = _root.yiff[b2].xpos;
	var yl2 = _root.yiff[b2].ypos;
	//define the constants
	var R = _root.yiff[b1].radius + _root.yiff[b2].radius;
	var a = -2 * xspeed1 * xspeed2 + xspeed1 * xspeed1 + xspeed2 * xspeed2;
	var b = -2 * xl1 * xspeed2 - 2 * xl2 * xspeed1 + 2 * xl1 * xspeed1 + 2 * xl2 * xspeed2;
	var c = -2 * xl1 * xl2 + xl1 * xl1 + xl2 * xl2;
	var d = -2 * yspeed1 * yspeed2 + yspeed1 * yspeed1 + yspeed2 * yspeed2;
	var e = -2 * yl1 * yspeed2 - 2 * yl2 * yspeed1 + 2 * yl1 * yspeed1 + 2 * yl2 * yspeed2;
	var f = -2 * yl1 * yl2 + yl1 * yl1 + yl2 * yl2;
	var g = a + d;
	var h = b + e;
	var k = c + f - R * R;
	//solve the quadratic equation
	var sqRoot = Math.sqrt(h * h - 4 * g * k);
	var t1 = (-h + sqRoot) / (2 * g);
	var t2 = (-h - sqRoot) / (2 * g);
	if (t1 > 0 && t1 <= 1) {
		var whatTime = t1;
		var ballsCollided = true;
	}
	//trace(t1 + "  " + t2);               
	if (t2 > 0 && t2 <= 1) {
		if (whatTime == null || t2 < t1) {
			var whatTime = t2;
			var ballsCollided = true;
		}
	}
	if (ballsCollided) {
		//Collision has happened, so throw a trace
		ball2BallReaction(b1, b2, xl1, xl2, yl1, yl2, whatTime);
	}
}
Перебор комбинаций:

Код AS1/AS2:
for (var i = 20; --i; ) {
	for (var j = i; --j; ) {
		//проверка столкновения шара i с шаром j
	}
}
Однако если шаров больше 20 то начинает заметно тормозить. Есть ли более быстрое решение?

Создать новую тему   Часовой пояс GMT +4, время: 22:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:52.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.