Создание точек в области с длиной промежутка не менее X между ними

Я пытаюсь придумать метод для генерации 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: Под лучше, я имею в виду в целом лучше, когда достигается баланс производительности и совершенства . Я знаю, немного расплывчато. Я не совсем уверен, сколько накладных расходов я могу иметь для генерации этих точек, поэтому я в основном ищу что-то более элегантное, чем мой собственный метод.

~ Роберт

8
задан Vectovox 20 June 2011 в 18:08
поделиться