Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Заполнение прямоугольной области квадратными обьектами по диагонали. (http://www.flasher.ru/forum/showthread.php?t=149727)

australian incognito 30.01.2011 20:25

Заполнение прямоугольной области квадратными обьектами по диагонали.
 
Добрый вечер, коллеги. Есть к вам один вопрос.

Представьте, что у меня есть рабочее поле 1280x720. Мне надо заполнить его квадратами 50x50 пикселей по диагонали от сверху-слева до снизу справа так, чтобы между квадратами была граница в 1 пиксель.

Придуманный мной алгоритм далеко не идеален как мне кажется, и выполняет задачу только наполовину. Помогите усовершенствовать его или может у кого есть более простое решение. Буду благодарен любой помощи.

Вот мой код:
Код AS1/AS2:

var i:Number = 0;
var j:Number = 0;
//
var coefX:Number = 51;// смещение по оси X
var coefY:Number = 51;// смещение по оси Y
var rowCoef:Number = 1;// число пикселей-квадратов по диагонали
var x0:Number = 0;// начальная координата Х
var y0:Number = 0;// начальная координата Y
var maxX:Number = 0;// максимальная координата по оси Х
var maxY:Number = 0;// максимальная координата по оси Y
var cordXArr:Array = Array();// массив с координатами Х
var cordYArr:Array = Array();// массив с координатами Y
//
function randColor()
{
        if (random(2) == 0)
        {
                randomCol = 0x19398A;
        }
        else
        {
                randomCol = 0x005DAA;
        }
        return randomCol;
}
//
function newRect(coordX, coordY)
{
        d = createEmptyMovieClip("z" + j, this.getNextHighestDepth());
        d.beginFill(randColor(),100);
        d.moveTo(0,0);
        d.lineTo(50,0);
        d.lineTo(50,50);
        d.lineTo(0,50);
        d.lineTo(0,0);
        d.endFill();
        d._x = coordX;
        d._y = coordY;
        j++;
}
while (cordXArr.length < 390)
{
        if (maxX < 1300)
        {
                maxX = x0 + coefX * (rowCoef - 1);
        }
        else
        {
                maxX = 1300;
        }
        if (maxY < 750)
        {
                maxY = y0 + coefY * (rowCoef - 1);
                maxY0 = 0;
        }
        else
        {
                maxY = 750;
                maxY0 += coefY;
        }
        while (maxX >= 0)
        {
                cordXArr.push(maxX);
                maxX -= coefX;
        }
        while (maxY0 <= maxY)
        {
                cordYArr.push(maxY0);
                maxY0 += coefY;
        }
        rowCoef++;
}
//
this.onEnterFrame = function()
{
        if (i < cordXArr.length)
        {
                newRect(cordXArr[i],cordYArr[i]);
                i++;
        }
        else
        {
                delete this.onEnterFrame;
        }
};

Благодаря этому скрипту я заполняю поле только наполовину, дальше все идет плохо. Я понимаю почему это происходит, но не могу сам грамотно расставить ограничения на то, чтобы правильно все работало.

Буду благодарен любым советам.

RandomUser 30.01.2011 22:18

Как-то так:
Код AS1/AS2:

var i:Number = 0;
//
var stepX:Number = 51;// смещение по оси X
var stepY:Number = 51;// смещение по оси Y
var lastTopX: Number = 0;
var lastTopY: Number = 0;
var cordXArr:Array = Array();// массив с координатами Х
var cordYArr:Array = Array();// массив с координатами Y
//
function randColor()
{
        if (random(2) == 0)
        {
                randomCol = 0x19398A;
        }
        else
        {
                randomCol = 0x005DAA;
        }
        return randomCol;
}
//
function newRect(coordX, coordY)
{
        d = createEmptyMovieClip("z" + j, this.getNextHighestDepth());
        d.beginFill(randColor(),100);
        d.moveTo(0,0);
        d.lineTo(50,0);
        d.lineTo(50,50);
        d.lineTo(0,50);
        d.lineTo(0,0);
        d.endFill();
        d._x = coordX;
        d._y = coordY;
        j++;
}
 
cordXArr.push(0);
cordYArr.push(0);
 
while (cordXArr.length < 390)
{
        calcNextCoords();
}
 
function calcNextCoords()
{
        var cx = cordXArr[cordXArr.length - 1];
        var cy = cordYArr[cordYArr.length - 1];
        var nx = cx - stepX;
        var ny = cy + stepY;
 
        if (nx >= 0 && ny < 720)
        {
                cordXArr.push(nx);
                cordYArr.push(ny);
                return;
        }
 
        nx = lastTopX + stepX;
        ny = lastTopY;
 
        if (nx > 1280)
        {
                nx = lastTopX;
                ny += stepY;
        }
 
        lastTopX = nx;
        lastTopY = ny;
 
        cordXArr.push(nx);
        cordYArr.push(ny);
}
//
this.onEnterFrame = function()
{
        if (i < cordXArr.length)
        {
                newRect(cordXArr[i],cordYArr[i]);
                i++;
        }
        else
        {
                delete this.onEnterFrame;
        }
};


australian incognito 30.01.2011 22:22

Вот блин, нет слов, чтобы высказать благодарность. Спасиб - сам уже бьюсь 3-й час над этой задачей ))))


Часовой пояс GMT +4, время: 23:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.