Я пытаюсь придумать метод для генерации 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?
Спасибо!
РЕДАКТИРОВАТЬ: Под словом «лучше» я подразумеваю, как правило, лучше, когда достигается баланс производительности и совершенства. Я знаю, немного расплывчато. Я не совсем уверен, сколько накладных расходов я могу иметь для генерации этих точек, поэтому я в основном ищу что-то более элегантное, чем мой собственный метод.
~ Роберт
LoopCount
в циклеwhile
также опускается, то есть:LoopCount
имеет отношение к возможности добавления точки. - person Tamer Shlash   schedule 20.06.2011