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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.06.2012, 22:58
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 21  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Den_root Посмотреть сообщение
Я вот тут почитал про ТРО и никак не пойму как найти проекцию прямоугольника на ось. Подскажити, пожалуйста, как ее вычислить?
Прийдется почитать еще инфы. Тема слишком сложная для понимания с первого раза.
Вот такой класс коллайдер я писал для себя:
Код AS3:
package
{
 
	public class Collider
	{
 
		public static function detectCollision(body1:IBody, body2:IBody):Boolean
		{
			var vertices1:Vector.<Vector2D> = body1.verteces.slice() as Vector.<Vector2D>;	// чтобы работать с копиями массивов, а не с самими массивами, хотя это не обязательно
			var vertices2:Vector.<Vector2D> = body2.verteces.slice() as Vector.<Vector2D>;
			var loopOneCollision:Boolean = true;
 
			loopOneCollision = actualCollisionTest(vertices1, vertices2); // первая проверка
			if (loopOneCollision)
			{
				loopOneCollision = actualCollisionTest(vertices2, vertices1); // и вторая проверка в обратном порядке, без этого не точно определится столкновение
			}
 
			return loopOneCollision;
		}
 
		private static function actualCollisionTest(vertices1:Vector.<Vector2D>, vertices2:Vector.<Vector2D>):Boolean // передаем массивы вершин первой и второй фигуры
		{
			var min1:Number = 0;
			var max1:Number = 0;
			var min2:Number = 0;
			var max2:Number = 0;
			var normal:Vector2D;
			var testNum:Number = 0;
			var test1:Number = 0;
			var test2:Number = 0;
 
			for (var i:int = 0; i < vertices1.length; i++)
			{
				normal = findNormal(vertices1, i);	// находим поочередно нормали для каждой из сторон фигуры, на нее и будем проецировать второй многоугольник
 
				max1 = min1 = normal.dotProd(vertices1[0]); 
				for (var j:int = 1; j < vertices1.length; j++)
				{
					testNum = normal.dotProd(vertices1[j]);
					if (testNum < min1)
						min1 = testNum;
					if (testNum > max1)
						max1 = testNum;
				}
 
				max2 = min2 = normal.dotProd(vertices2[0]);
				for (j = 1; j < vertices2.length; j++)
				{
					testNum = normal.dotProd(vertices2[j]);
					if (testNum < min2)
						min2 = testNum;
					if (testNum > max2)
						max2 = testNum;
				}
				test1 = min1 - max2;
				test2 = min2 - max1;
 
				if (test1 > 0 || test2 > 0)
				{
					return false;
				}
			}
			return true;
		}
 
		private static function findNormal(verteces:Vector.<Vector2D>, index:int):Vector2D
		{
			var vertex1:Vector2D = verteces[index];
			var vertex2:Vector2D = (index < verteces.length - 1) ? verteces[index + 1] : verteces[0];
			var normalAxis:Vector2D = new Vector2D(-(vertex2.y - vertex1.y), vertex2.x - vertex1.x);
			normalAxis.normalize();
			return normalAxis;
		}
	}
}
Естественно, идея не моя, а вот этого чела

Старый 30.06.2012, 23:43
Den_root вне форума Посмотреть профиль Отправить личное сообщение для Den_root Найти все сообщения от Den_root
  № 22  
Ответить с цитированием
Den_root

Регистрация: Feb 2012
Сообщений: 36
caseyryan
Не, сама ТРО мне понятна, мне не понятен оптимизированный способ нахождения проекции прямоугольника на ось во втором примере этой статьи. В предложенном вами способе просто перебираются все точки и по их координатам создается проекция, а там она как то хитро вычисляется.

...поскольку длину зелёной линии рассчитать гораздо проще, мы можем использовать её, чтобы быстро получать длину всей проекции.

Старый 07.07.2012, 21:48
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 23  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

Регистрация: Feb 2012
Сообщений: 212
Hauts
Спасибо за статью! Разобрался как проверить столкновение у быстро движущихся сфер, но вот не знаю как прикрутить эту проверку к Теореме Разделяющих Осей.
Код AS3:
if(min_1 < max_2 && min_2 < max_1)
На сколько я понимаю, мин. и макс. проекций должны быть представлены уравнениями завязанными на время. Я вот только не понимаю как приведенную выше проверку обличить в уравнение, что бы решить его.

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

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

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


 


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


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