Я пытаюсь улучшить свой способ выкладки позиции тысяч фигур с равной площадью над поверхностью сетки из центральной точки (у нее более органичный вид). Поверхность сетки означает, что между соседями существует равное расстояние, но я не хочу создавать патч-работу, подобную шаблону, путем выбора случайной координаты x и y (или x и z в этом случае, когда я работаю в трех измерениях). То, что у меня сейчас работает, но невероятно медленное, когда я начинаю двигаться с 2000 объектов. Есть ли более быстрый метод? Я избегаю эффекта патч-работы, как я уже сказал, равно как и кругового распространения. Распределение прямо сейчас очень похоже на город и идеально, но слишком медленно.Распределение фигур из центральной точки
Я прокомментировал функцию на протяжении так что надеюсь, это объясняет все тщательно:
ArrayList buildingCoords; // stores the co-ordinates of occupied spaces
int w = 50 // Footprint dimensions. Width and depth.
PVector generateNewBuildingPosition(PVector coord) {
float sW = 30; // gap between shapes
// Starting at a coordinate of 0,0 if this is our 1st go
// (PVector coord initially feeds 0,0)
// or the last coordinate that was already taken
// (this loops with the last coordinate if it fails)
// we check one of the four spaces next to us with
// the roll of a dice (in a way...)
float randomX = random(0,15);
float randomZ = random(0,15);
if (randomX >= 10) {
randomX = w + sW;
} else if (randomX >= 5) {
randomX = (w + sW) * -1;
} else {
randomX = 0;
}
if (randomZ >= 10) {
randomZ = w + sW;
} else if (randomX >= 5) {
randomZ = (w + sW) * -1;
} else {
randomZ = 0;
}
// We've picked our direction.
// We have a PVector that acts as a marker for where we're
// placing. Adding or subtracting the movement of each
// attempt, one at a time, means the shapes spreads out
// more organically from the centre rather than trying
// to distribute each shape as a random patch.
PVector newDirection = new PVector(randomX, 0, randomZ);
coord.add(newDirection);
// Our marker moves to the new spot, we check if it exists.
// If it doesn't, we confirm it as this shape's anchor spot.
// If it does, we loop this function again, feeding it where our
// marker is.
if(buildingCoords.contains(coord)) {
generateNewBuildingPosition(coord);
} else {
// add this PVector to the arrayList
buildingCoords.add(coord);
}
// Return the coordinates that just succeeded.
return coord;
}
Что такое var w? –
Извинения, я пропустил, что была одна внешняя переменная. Теперь я включил его в оригинал, но это ширина и глубина отпечатка каждой фигуры. – biscuitstack
Я полагаю, что это замедляется, потому что вы делаете рекурсивный вызов, если 'buildingCoords' содержит вычисленную' coord'. Что вы можете сделать, так это изменить свой алгоритм, поэтому он учитывает только пробелы в его вычислении, поэтому вам никогда не придется проверять, используется ли подсчитанная координата. Ergo: создайте пространство поиска «доступных» мест (это может динамически увеличиваться, чтобы ограничить количество вещей) и выберите один из них, используя некоторую логику, чтобы сделать его «полуслучайным», обновить доступные места и перейти к следующему объекту. – Warkst