Я пытаюсь придумать метод для генерации X количества случайных точек в заданной области (в моем случае квадрат). Одна вещь, которая делает это такой проблемой, заключается в том, что каждая точка должна находиться на расстоянии не менее Y единиц от всех остальных точек.
В первую очередь приходит в голову (в C #) проверить расстояние между новой точкой и всем остальным. существующие точки:
while(points.Count < pointsToGenerate)
{
Point newPoint = NewPoint();
bool addPoint = true;
foreach(Point p in points)
{
if((p - newPoint).Length() < minDistance)
{
addPoint = false;
break;
}
}
if(addPoint)
{
points.Add(newPoint);
}
}
Теперь это определенно сработает, однако, если никакие действительные точки никогда не будут найдены, цикл станет бесконечным. Так что добавь магическое число Z в качестве лимита попыток?
if(loopCount > 100)
{
break;
}
Теперь здесь есть очевидные проблемы. Если точки генерируются случайным образом, loopCount может быть выше Z, даже если остались места для размещения точки. Это не только возможно, но и произойдет!
Что я мог сделать, так это создать список доступных точек для каждого прохода, а затем выбрать случайную из них. Это работало бы безупречно, за исключением одного: производительности. Мне не нужна супер производительность в моем приложении, но площадь 1000 ^ 2. Много очков, которые нужно проверять за проход, даже если я ограничиваюсь целыми числами!
Итак, того, что я могу придумать, может быть недостаточно, поэтому мне нужна помощь в этом. Есть ли лучший способ генерировать X точек в области A с минимальным расстоянием между точками Y?
Спасибо!
EDIT: Под лучше, я имею в виду в целом лучше, когда достигается баланс производительности и совершенства . Я знаю, немного расплывчато. Я не совсем уверен, сколько накладных расходов я могу иметь для генерации этих точек, поэтому я в основном ищу что-то более элегантное, чем мой собственный метод.
~ Роберт