2013-08-15 3 views
1

Я работаю над симуляцией, которая требует произвольного большого количества объектов (100 000+), которые помещаются произвольно вдоль дорожки, которая имеет произвольную форму.Случайное размещение объектов на дорожке

В своей простейшей реализации я начал использовать C++ и написал очень наивную функцию для размещения одного узла вдоль Track. В этом случае Track горизонтальная линия с размерами 25 х 500. node состоит только из X/Y координат и имеет размеры 5 х 5, так что я написал что-то вроде ...

Node.x = rand() 
Node.y = rand() 
while (Node.x is not on the Track) 
    Node.x = rand() 
while (Node.y is not on the Track) 
    Node.y = rand() 

Этот очень наивный подход иллюстрирует то, что мне нужно: большое количество nodes, которое должно быть создано в случайных местах вдоль track. Я также пробовал иметь x и y быть случайными числами в диапазоне track, но track будет случайным, сложным, взаимосвязанным рядом строк, таких как фигура-8, линия прокрутки, небольшой квадрат, серия «острова», или все поле. Узел не может выполнить экземпляр вне дорожки.

Какие существующие алгоритмы/методы можно использовать для создания этих узлов на дорожке?

+0

Как определяется трек? Что такое элементы трека? Как определяются элементы? – Dialecticus

+0

Трек - это область на координатной плоскости, на которой должны быть созданы узлы. В другом месте недействительно. Представьте себе большой черный квадрат с толстой белой линией по середине. Узлы могут создавать только поверх этой белой строки. Но эта белая строка может быть словом «LINE», написанным в курсивном, и все узлы должны появляться на этом. – MattDavBen

+0

Как определяется «площадь на координатной плоскости»? Вы упомянули что-то «сверху». Я этого не понимаю. Наблюдается ли трек сверху или сбоку? Нам нужно иметь четкое представление о том, что такое «дорожка» в коде. – Dialecticus

ответ

1

Я думаю, было бы лучше предварительно обработать ваш трек таким образом, чтобы он отображал абсолютное положение в какой-то точке на дорожке. Это, вероятно, означало бы брать каждую часть трека и основываться на том, как оно определено, выделить целый ряд целых чисел для этой части трека.

Например, можно определить следующие сегменты трека:

  • линия от точки А до точки В (позиции от 0 до 100)
  • Дуга из точки В в точку С (позиции 101 до 200)
  • линии от точки с до точки а (Позиции 201 до 300)

при создании случайного числа, то выяснить, какой сегмент отслеживать он падает в, а затем в зависимости от того, что сегмент Defi вы выяснили, где на этом участке он приземляется. Если у всех ваших сегментов есть уникальные, неперекрывающиеся диапазоны, вы также можете сохранить список уже размещенных узлов на основе случайного числа, чтобы определить, было ли что-то уже помещено в заданную позицию. Это также будет поддерживать ответвление, поскольку оно полностью зависит от диапазона целых чисел по сегменту.

Таким образом, используя вышеприведенную пробную дорожку, вы создадите случайное число от 0 до 300. Если, например, оно составило 105, то вы бы посмотрели, что он находится в сегменте дуги и на основе определения дуги вы бы определили, что он просто находится от точки b вдоль дуги.

Если какой-нибудь базовый образец кода поможет мне в какой-то момент попытаться хоть немного поработать днем, но не могу сейчас.

+1

Я бы уточнил, основываясь на ваших комментариях выше, что для каждой «фигуры», которая является частью трека, вы определяете, что диапазон целых чисел означает размещение в этой форме, и вы определяете разрешение того, насколько тесно эти точки могут совпадать насколько большой диапазон. – brader24

+1

И формы не обязательно должны быть связаны. Это может быть случайно размещенный круг, квадрат и треугольник. – brader24

1

Все зависит от того, как представлен ваш трек. Предположим, что он представлен как список «линий» и что строки действительно прямоугольники. Кроме того, предположим, что вы хотите, чтобы объекты размещались равномерно по области. Вот что вы можете сделать:.

Compute the area of all lines, just sum up width * height for all lines. 
x = a random number between 0 and the total area. 
For each line: 
    if x < area of current line: 
     place it in current line 
     exit loop 
    x = x - area of current line 

Это покажет вам, какая линия должна идти Затем вы можете использовать свой существующий алгоритм.

Если он представлен как растровое изображение, вы можете просто подсчитать количество проходящих через пиксель пикселей, а затем выбрать число от 0 до этого и поместить объект в этот пиксель. Посредством «traversable» вам нужно разместить объект 5x5, т. Е. 5x5 пикселей с центром в нем должны быть «дороги».

1

Во-первых, лучше всего настроить свой трек с помощью одной переменной, допустим, Node.position_along_the_track, выберите «случайным образом» позиции ваших узлов в соответствии с этим параметром, а затем выведите координаты Node.x и Node.y из узла. position_along_the_track.

Во-вторых, вы должны определить, что означает «случайный» в вашем случае. Различные симуляции требуют разных распределений. Например, если вы хотите достичь случайных расстояний между последовательными объектами на трассе, вы должны заменить

Node.x = rand() 

с

Node.position_along_the_track = (rand() + PreviousNode.position_along_the_track) 
            % length_of_the_track 
Смежные вопросы