#arrays #actionscript
#массивы #actionscript
Вопрос:
Я работаю в Actionscript 3, но это довольно общий.
Я хотел бы создать простую функцию, которую я мог бы вызывать, например, GiveCords (Width, Height, Num), которая будет принимать ширину и высоту, отображать это и, используя переменную Num, равномерно распределять заданное количество по пространству.
Допустим, я присваиваю ему значение 500, 500, 1. Я бы ожидал, что он вернет позицию X, Y, равную 250, 250.
Но я бы хотел, чтобы он возвращал массив заданных точек с X, Y.
Итак, если бы я дал ему 10 баллов, он нашел бы наилучшее положение для всех них, чтобы они находились на равном расстоянии друг от друга.
Я предполагаю, что есть простая формула для решения этой проблемы, но я много искал и ничего не нашел.
Приветствия
Ответ №1:
Если я правильно понял, это должно выполнить задание:
var object:Object = {width: 500, height:500, num:10};
var points:Array = getCoordinates(object);
function getCoordinates(object:Object):Array {
var array:Array = new Array();
var widthMultiplier:Number = object.width / (object.num 1);
var heightMultiplier:Number = object.height / (object.num 1);
for (a = 1; a <= object.num; a ) {
var coordinates:Point = new Point();
coordinates.x = widthMultiplier * a;
coordinates.y = heightMultipler * a;
array.push(coordinates);
}
return array;
}
Для этого берется количество элементов и общее пространство, общее пространство делится на количество элементов 1 (для учета пространства в конце последнего элемента), увеличивайте объекты каждый раз.
Редактировать: В ответ на комментарии вот версия, в которой вы можете указать количество строк, по которым вы хотите распределить свои объекты. Если количество строк не делит количество объектов и возвращает целое число, то функция вернет null. Если вы не задаете ему параметр rows, предполагается, что вы хотите использовать его в одной строке. Наслаждайтесь.
var object:Object = {width:500,height:500,num:10};
var points:Array = getCoordinates(object,2);
function getCoordinates(object:Object, rows:int = 1):Array
{
if ((object.num / rows) % 1)
{
return null;
}
else
{
var columns:int = object.num / rows;
var array:Array = new Array();
var widthMultiplier:Number = object.width / (columns 1);
var heightMultiplier:Number = object.height / (rows 1);
for (var a = 1; a <= rows; a )
{
for (var b = 1; b <= columns; b )
{
var coordinates:Point = new Point();
coordinates.x = widthMultiplier * b;
coordinates.y = heightMultiplier * a;
array.push(coordinates);
}
}
return array;
}
}
Комментарии:
1. Это на полпути к цели! Единственная проблема с этим заключается в том, что он выдает только диагональные значения, я бы хотел, чтобы они были равномерно распределены по всей заданной ширине / высоте, например, влево / вправо / вверх / вниз, а не только сверху слева направо.
2. @JohnRake Это невозможно без указания того, сколько вы хотите в строке или столбце, учитывая, что существует несколько комбинаций… для 10 это должно быть 5 x 2 или 2 x 5, это только квадратные числа, которые имеют очевидные ответы, например, 16 будет 4 x 4. Вам нужно отдать предпочтение тому, хотите ли вы больше объектов в строке или столбце, тогда я смогу это сделать.
3. Я, конечно, могу указать, сколько в строке / столбце в качестве дополнительного значения — это было бы здорово!
4. Ответ @ JohnRake обновлен версией, которая позволяет указать, сколько строк вы хотите.