Polygon b)
{
foreach (var polygon in new[] { a, b })
{
for (int i1 = 0; i1 < polygon.Points.Count; i1++)
{
int i2 = (i1 + 1) % polygon.Points.Count;
var p1 = polygon.Points[i1];
var p2 = polygon.Points[i2];
var normal = new Point(p2.Y - p1.Y, p1.X - p2.X);
double? minA = null, maxA = null;
foreach (var p in a.Points)
{
var projected = normal.X * p.X + normal.Y * p.Y;
if (minA == null || projected < minA)
minA = projected;
if (maxA == null || projected > maxA)
maxA = projected;
}
double? minB = null, maxB = null;
foreach (var p in b.Points)
{
var projected = normal.X * p.X + normal.Y * p.Y;
if (minB == null || projected < minB)
minB = projected;
if (maxB == null || projected > maxB)
maxB = projected;
}
if (maxA < minB || maxB < minA)
return false;
}
}
return true;
}
Товарищи программисты, подскажите, быстрый ли этот алгоритм?
Подразумевается его запуск в игровом цикле 30 раз в секунду по 100 раз(то есть 30 * 100 в секунду)
Ну так померяйте)
2 вложенных цикла - нет, не быстрый, асимптотически тоже
Прям с ходу - создавать массив под два аргумента, чтобы потом по нему пройтись - это зашквар по производительности
Обсуждают сегодня