Цитата:
Сообщение от 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;
}
}
}
Естественно, идея не моя, а
вот этого чела
