#algorithm #random
#алгоритм #Случайный
Вопрос:
Я хочу генерировать позицию для объектов случайным образом, и я не хочу, чтобы они перекрывали друг друга. моя ширина экрана 4.8
равна метру, а высота равна 9.6
метру, а ширина объекта 0.5
равна метру, а высота равна 0.5
метру.
может ли кто-нибудь указать мне правильное направление или какое-либо предложение.
с уважением
Ответ №1:
Возможный алгоритм:
1. Choose random coordinates for all objects.
2. Test for overlap. If it occurs, repeat step 1.
Возможные улучшения:
1. Reposition overlapping objects with new random coordinates until there is no
overlap.
2. Shift any overlapping objects to make them not overlap. Do this intelligently
to avoid bunching, if necessary.
Комментарии:
1. В зависимости от вашего определения «случайного», улучшение # 2 может привести к «сгруппированным» объектам. Также улучшение # 1 может выполняться ОЧЕНЬ долго, если пространство почти заполнено.
Ответ №2:
Если вы можете смириться с тем, что ваши «случайные» позиции объектов находятся в сетке, то вы можете разделить пространство на квадраты размером 0,5 на 0,5 метра и выбрать квадрат. Ваш мир размером 9,6 на 4,8 метра. Итак, у вас есть сетка размером 19 x 8.
Поместите все позиции сетки в список. Для каждого объекта, который вы хотите разместить, случайным образом выберите позицию сетки из списка и удалите ее из списка.
Если вы хотите избежать строгого вида сетки, вы можете слегка изменить положения x и y ваших центров сетки (добавить немного здесь и там). Логически у вас все еще есть сетка, но внешний вид будет менее регулярным.
Комментарии:
1. я получил эту идею раньше, это лучший способ??? или есть более разумный способ?? извините за мой вопрос, но я впервые разрабатываю игру
2. @Nammari: Я не знаю, лучший ли это способ, но он эффективен, прост в реализации и быстр в исполнении. Я бы предложил начать с этого. Как только у вас заработают другие, более важные части вашей игры, вы можете вернуться к этому, если это проблема.
3. Вы можете разделить сетку на более мелкие блоки. Проверьте все блоки, которые будет занимать объект. Если доступно, отметьте все блоки под объектом. Это не сработает, если вы хотите заполнить весь экран объектами. Тогда вы скорее захотите пробежаться по экрану и заполнить его случайными объектами.
Ответ №3:
Вы случайно не упомянули свою среду программирования или язык, но предполагая, что функция random()
возвращает случайное значение от 0.0 до 1.0, и предполагая, что вы позиционируете объект по верхнему левому углу, вы можете использовать следующую формулу:
x = random() * (screenWidth - objectWidth);
y = random() * (screenHeight - objectHeight);
Я прошу прощения, ваш пост, должно быть, изменился, чтобы читать перекрывать друг друга. Когда я его читаю, он перекрывает ширину / высоту экрана.
Ответ №4:
Как предлагает Майкл Голдштейн, тестирование на перекрытие и генерирование новых координат в случае возникновения перекрытия является хорошим решением.
Если у вас всего несколько объектов, вы можете сохранить их в списке и для каждого нового объекта проверять на перекрытие.
Одним из способов проверки на перекрытия может быть использование логического массива, представляющего каждый пиксель на экране. Тогда поиск будет быстрым.
Кстати, разве 9,6-метровый экран не очень большой экран?
Комментарии:
1. это ширина и высота усечения, а не экран
Ответ №5:
Вариант 1:
bool found = false;
real x;
real y;
do
{
x = random * (4.8 - 0.5); // Rather make it variables
y = random * (9.6 - 0.5);
found = false;
foreach (obj in objs)
{
if (x > obj.x amp;amp; x < x 0.5 amp;amp; y > obj.y amp;amp; obj.y < y 0.5)
{
found = true;
break;
}
}
}
while (found == true)
Вариант 2:
Создайте 2D-массив, представляющий sceen. Сделайте тип ссылки на объекты.
Когда вы опускаете, ссылаетесь на объекты.
Затем вы можете просто проверить массив на наличие коллизии.
Со вторым вариантом обнаружение столкновений происходит намного быстрее, но при этом используется больше памяти.
Комментарии:
1. используя x в качестве int, он будет присваивать значение с плавающей точкой, что произойдет, чувак?