Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Работа с цветом (http://www.flasher.ru/forum/showthread.php?t=54401)

menik 04.02.2004 18:54

Работа с цветом
 
Вопрос - Каким образом можно решить такую проблему.
Есть цвет, заданный в 16-ричной форме (вынимается их XML, неважно откуда он взялся).
Нужно средствами AS нарисовать парралелипипед, чтобы одна видимая сторона была заполнена заданным цветом, а две другие - тем же цветом, но с другой яркостью - немного темнее. (Другими словами - нужен эффект тени, как можно задать 2 новых цвета, - чуть темнее основного).

opex 04.02.2004 22:17

Код:

/* НА ОСНОВЕ исходника 3D CUBE ((C) 2002 Grigory A. Ryabov | http://www.flash.plux.ru) */
/* ULTRAFLASHER */
// -------------------------------------------------------------------------
//
//
// ## ## ## ########## ###### ###### TM
// ## ## ## ## ## ## ## ##
// ## ## ## ## ## ## ## ##
// ## ## ## ## ####### ########
// ###### ###### ## ## ## ## ##
//
// В этом примере куб рисуется на самом деле всего из трёх граней.
// Задние грани просто не рисуются, потому что они не видны.
// А можно рисовать все 6 граней и сортировать их по средней Z координате
// каждой грани. Но это уже другая история. Сначала пойми этот код.
//
_root.onLoad = function() {
        // координаты центра клипа
        cnx = 250;
        cny = 250;
        // дистанция от точки просмотра до центра мировых координат (0, 0, 0)
        dist = 200;
        // размеры куба
        var sx = 30;
        var sy = 30;
        var sz = 30;
        // коэффициент перевода радиан в градусы и обратно
        rad = Math.PI/180;
        // объявляем массив вершин
        v = new Array();
        // инициализируем вершины
        v[0] = {x:sx, y:-sy, z:sz};
        v[1] = {x:sx, y:sy, z:sz};
        v[2] = {x:sx, y:sy, z:-sz};
        v[3] = {x:sx, y:-sy, z:-sz};
        v[4] = {x:-sx, y:-sy, z:-sz};
        v[5] = {x:-sx, y:sy, z:-sz};
        v[6] = {x:-sx, y:sy, z:sz};
        v[7] = {x:-sx, y:-sy, z:sz};
        // задаём количество вершин
        amount = v.length-1;
};
_root.onEnterFrame = function() {
        // вычисляем углы поворота
        var xa = (cnx-_ymouse)*0.0005;
        var ya = (cny-_xmouse)*0.0005;
        // вычисляем косинусы и синусы углов, что бы не делать одно и тоже в цикле
        var sinY = Math.sin(xa);
        var cosY = Math.cos(xa);
        var sinX = Math.sin(ya);
        var cosX = Math.cos(ya);
        // цикл перебора всех вершин и вращения их вокруг осей x и y
        for (var i = 0; i<=amount; i++) {
                // вращение
                yp = v[i].y*cosY-v[i].z*sinY;
                zp = v[i].y*sinY+v[i].z*cosY;
                xp = v[i].x*cosX+zp*sinX;
                zp = -v[i].x*sinX+zp*cosX;
                // запоминаем получившиеся координаты
                v[i].x = xp;
                v[i].y = yp;
                v[i].z = zp;
                // преобразование перспективы
                perRatio = 1/(v[i].z/dist+1);
                v[i].rx = cnx+v[i].x*perRatio;
                v[i].ry = cny-v[i].y*perRatio;
        }
        // удаляем ранее нарисованные объекты
        _root.clear();
        // -------------------------------------------------------------------------
        // -- заливка грани #00
        // -------------------------------------------------------------------------
        // массив очередной грани
        a = [3, 2, 1, 0];
        // размерность массива
        d = a.length-1;
        // если грань видна, то..
        if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
                // обнуляем теневую переменную
                shadow = 0;
                // цикл вычисления цвета тени
                for (var i = 0; i<=d; i++) {
                        shadow += (v[a[i]].rx-v[a[i]].ry);
                }
                // делим на колличество точек в грани
                shadow = 140+shadow/(d+2);
                // стиль линии
                _root.lineStyle(0, 0x000000, 100);
                // стиль заливки
                _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
                // начальная точка
                _root.moveTo(v[a[0]].rx, v[a[0]].ry);
                // перебор всех точек грани
                for (var i = 1; i<=d; i++) {
                        _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
                }
                // конец заливки
                _root.endFill();
        }
        // -------------------------------------------------------------------------
        // -- заливка грани #01
        // -------------------------------------------------------------------------
        // массив очередной грани
        a = [2, 3, 4, 5];
        // размерность массива
        d = a.length-1;
        // если грань видна, то..
        if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
                // обнуляем теневую переменную
                shadow = 0;
                // цикл вычисления цвета тени
                for (var i = 0; i<=d; i++) {
                        shadow += (v[a[i]].rx-v[a[i]].ry);
                }
                // делим на колличество точек в грани
                shadow = 140+shadow/(d+2);
                // стиль линии
                _root.lineStyle(0, 0x000000, 100);
                // стиль заливки
                _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
                // начальная точка
                _root.moveTo(v[a[0]].rx, v[a[0]].ry);
                // перебор всех точек грани
                for (var i = 1; i<=d; i++) {
                        _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
                }
                // конец заливки
                _root.endFill();
        }
        // -------------------------------------------------------------------------
        // -- заливка грани #02
        // -------------------------------------------------------------------------
        // массив очередной грани
        a = [7, 6, 5, 4];
        // размерность массива
        d = a.length-1;
        // если грань видна, то..
        if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
                // обнуляем теневую переменную
                shadow = 0;
                // цикл вычисления цвета тени
                for (var i = 0; i<=d; i++) {
                        shadow += (v[a[i]].rx-v[a[i]].ry);
                }
                // делим на колличество точек в грани
                shadow = 140+shadow/(d+2);
                // стиль линии
                _root.lineStyle(0, 0x000000, 100);
                // стиль заливки
                _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
                // начальная точка
                _root.moveTo(v[a[0]].rx, v[a[0]].ry);
                // перебор всех точек грани
                for (var i = 1; i<=d; i++) {
                        _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
                }
                // конец заливки
                _root.endFill();
        }
        // -------------------------------------------------------------------------
        // -- заливка грани #03
        // -------------------------------------------------------------------------
        // массив очередной грани
        a = [0, 1, 6, 7];
        // размерность массива
        d = a.length-1;
        // если грань видна, то..
        if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
                // обнуляем теневую переменную
                shadow = 0;
                // цикл вычисления цвета тени
                for (var i = 0; i<=d; i++) {
                        shadow += (v[a[i]].rx-v[a[i]].ry);
                }
                // делим на колличество точек в грани
                shadow = 140+shadow/(d+2);
                // стиль линии
                _root.lineStyle(0, 0x000000, 100);
                // стиль заливки
                _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
                // начальная точка
                _root.moveTo(v[a[0]].rx, v[a[0]].ry);
                // перебор всех точек грани
                for (var i = 1; i<=d; i++) {
                        _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
                }
                // конец заливки
                _root.endFill();
        }
        // -------------------------------------------------------------------------
        // -- заливка грани #04
        // -------------------------------------------------------------------------
        // массив очередной грани
        a = [7, 4, 3, 0];
        // размерность массива
        d = a.length-1;
        // если грань видна, то..
        if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
                // обнуляем теневую переменную
                shadow = 0;
                // цикл вычисления цвета тени
                for (var i = 0; i<=d; i++) {
                        shadow += (v[a[i]].rx-v[a[i]].ry);
                }
                // делим на колличество точек в грани
                shadow = 140+shadow/(d+2);
                // стиль линии
                _root.lineStyle(0, 0x000000, 100);
                // стиль заливки
                _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
                // начальная точка
                _root.moveTo(v[a[0]].rx, v[a[0]].ry);
                // перебор всех точек грани
                for (var i = 1; i<=d; i++) {
                        _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
                }
                // конец заливки
                _root.endFill();
        }
        // -------------------------------------------------------------------------
        // -- заливка грани #05
        // -------------------------------------------------------------------------
        // массив очередной грани
        a = [1, 2, 5, 6];
        // размерность массива
        d = a.length-1;
        // если грань видна, то..
        if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
                // обнуляем теневую переменную
                shadow = 0;
                // цикл вычисления цвета тени
                for (var i = 0; i<=d; i++) {
                        shadow += (v[a[i]].rx-v[a[i]].ry);
                }
                // делим на колличество точек в грани
                shadow = 140+shadow/(d+2);
                // стиль линии
                _root.lineStyle(0, 0x000000, 100);
                // стиль заливки
                _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
                // начальная точка
                _root.moveTo(v[a[0]].rx, v[a[0]].ry);
                // перебор всех точек грани
                for (var i = 1; i<=d; i++) {
                        _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
                }
                // конец заливки
                _root.endFill();
        }
};
stop();


opex 04.02.2004 22:52

а если по легче то так но работает только для таких цветов как 0x000000,0xcccccc,0x333333 ну и для простых тоже будет рабоать только shadow не должна быть больше меньшего из
r g b
да и цвет придется передовать в трех переменных но это тое можно решить
Код:

r = 0xFF;
g = 0xFF;
b = 0xFF;
_root.createEmptyMovieClip("muv1", 1);
with (_root.muv1) {
        lineStyle(0, 0x000000, 100);
        beginFill(r << 16 | g << 8 | b << 0, 100);
        moveTo(0, 0);
        lineTo(100, 0);
        lineTo(100, 100);
        lineTo(0, 100);
        lineTo(0, 0);
        endFill();
}
// shadow  насколько зделать темнее
shadow = 0x12;
r1 = r-shadow;
g1 = g-shadow;
b1 = b-shadow;
_root.createEmptyMovieClip("muv2", 2);
with (_root.muv2) {
        lineStyle(0, 0x000000, 100);
        beginFill(r1 << 16 | g1 << 8 | b1 << 0, 100);
        moveTo(100, 0);
        lineTo(200, 0);
        lineTo(200, 100);
        lineTo(100, 100);
        lineTo(100, 0);
        endFill();
}


menik 05.02.2004 13:25

2 орех: Отлично, получил. что хотел. Большое спасибо.


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

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