Пересечение окружностей легко вычислить: если квадрат разности вдоль x плюс квадрат разности вдоль y меньше квадрата суммы радиусов, круги пересекаются.
Обратите внимание, что это уже немного оптимизировано, поскольку позволяет избежать получения квадратного корня.Возможна дополнительная оптимизация, например, когда разница по x больше суммы радиусов, они никогда не пересекутся.
Просто протестируйте новый круг на всех существующих кругах, и все готово.
Это O (n ^ 2), но это просто и довольно быстро, поскольку каждый тест - это всего лишь несколько быстрых операций.
Конечно, вы можете искать оптимизацию, которой у вас нетпроверить каждый круг на соответствие всем остальным, но это дорого, много кода, и, следовательно, оно того стоит только для большого количества кругов.Сначала попробуйте простое решение.
В коде C ++ (извините, я не говорю на VB):
struct { double x, y, r; } Circle;
bool circleIsAllowed(const std::vector<Circle>& circles, const Circle& newCircle)
{
for(std::vector<Circle>::const_iterator it = circles.begin(); it != circles.end(); ++it) // foreach(Circle it in circles)
{
double sumR = it->r + newCircle.r; // + minimumDistanceBetweenCircles (if you want)
double dx = it->x - newCircle.x;
double dy = it->y - newCircle.y;
double squaredDist = dx*dx + dy*dy;
if (squaredDist < sumR*sumR) return false;
}
return true; // no existing circle overlaps
}
Редактировать: исправлены мелкие ошибки и замечено, что вопрос нео C ++