PDA

Просмотр полной версии : [Вопрос] Как равномерно заполнить прямоугольную зону объектами



execution
11.04.2021, 18:49
Математические способности ну прям вообще подводят.
Не могу понять как реализовать заполнение прямоугольника грядками.

То есть существует min_x, min_y, max_x, max_y, по ним находил центр, но так получалось сделать лишь заполнение поля круговым способом.
Выглядит не очень. Есть ли какие-то советы?

DeimoS
11.04.2021, 22:31
Если по простому, то как-то так попробуй
main()
{
/* Координаты зоны */
new Float:area_min_x = 10.0;
new Float:area_max_x = 20.0;
new Float:area_min_y = 10.0;
new Float:area_max_y = 20.0;

/* Размер грядки по двум плоскостям */
const Float:garden_x = 2.0;
const Float:garden_y = 3.0;

/* Узнаём радиус грядки по обеим координатам */
const Float:rad_garden_x = garden_x/2.0;
const Float:rad_garden_y = garden_y/2.0;

/* Узнаём размер зоны по каждой из плоскостей */
new Float:area_x = area_max_x-area_min_x;
new Float:area_y = area_max_y-area_min_y;

/* Узнаём сколько грядок вместится в каждую плоскость */
new count_x = floatround(area_x/garden_x, floatround_floor);
new count_y = floatround(area_y/garden_y, floatround_floor);

/* Узнаём какой отступ должен быть между грядками */
new Float:indent_x = (area_x-garden_x*float(count_x))/float(count_x);
new Float:indent_y = (area_y-garden_y*float(count_y))/float(count_y);

/* Узнаём координаты по умолчанию для каждой плоскости */
new Float:default_x = area_min_x;
new Float:default_y = area_min_y+rad_garden_y+indent_y;

for(new i, m = count_x*count_y, Float:x = default_x, Float:y = default_y; i < m; i++)
{
x += indent_x; // Делаем первый отступ от края области по оси x (для оси y этот отступ сделан выше)
x += rad_garden_x; // Делаем отступ на радиус грядки

/*CreateDynamicObject(model, x, y, z ...);*/ // Создаём объект на полученных координатах

x += rad_garden_x; // делаем ещё один отступ, дабы получить координаты края созданной грядки

/* Проверяем, заполнилась ли текущая колонка и если заполнилась - делаем смещение */
if(x >= area_max_x)
{
x = default_x
y += rad_garden_y+indent_y;
}
}
}