Получить равномерно расположенные X, Y-образные цепочки заданного размера и требуемого количества

#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 обновлен версией, которая позволяет указать, сколько строк вы хотите.