Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Градиентная заливка треугольника (http://www.flasher.ru/forum/showthread.php?t=151018)

Волгоградец 21.02.2011 12:51

Градиентная заливка треугольника
 
Вложений: 1
Привет. Мне нужно получить такой треугольник:

Вложение 26052

Вот его координаты:
Код AS3:

g.lineStyle(1);
g.moveTo(200, 100);
g.lineTo(250, 150) g.lineTo(50, 250);
g.lineTo(200, 100);

Как мне его залить градиентом так, чтобы получилось как на картинке? Т.е. начинается от катета P1P3 и идет параллельно катету P1P2. Ширина градиентной заливки получается равна длине P1P2 и наклон в данном примере 45 градусов.
Я знаю что нужную матрицу надо получить из matrix.createGradientBox(), но что передавать туда? Вообще этот метод ведет себя странно очень - по идее наклон градиента должен быть таким, каким я его задаю третьим параметром в этом методе, но, чёрт побери, он меняется в зависимости от ширины и высоты что я передаю в метод!!!

in4core 21.02.2011 13:43

Вы вкурсе что наклон задается Math.PI ? Если да, то проблем не должно быть поидее

cleptoman 21.02.2011 13:46

точно, константой )

shootkin 21.02.2011 14:30

Как-то так:
Код AS3:

var p1 : Point = new Point( 200, 100 );
var p2 : Point = new Point( 250, 150 );
var p3 : Point = new Point( 50, 250 );
var triangle : Shape = new Shape();
var g : Graphics = triangle.graphics;
var gradient_colors : Array = new Array( 0x000000, 0xFFFFFF );
var gradient_alphas : Array = new Array( 1.0, 1.0 );
var gradient_ratios : Array = new Array( 0, 255 );
var gradient_matrix : Matrix = new Matrix();
var angle : Number = Math.atan2( p2.y - p1.y, p2.x - p1.x );
gradient_matrix.createGradientBox( p2.x - p1.x, p2.y - p1.y, angle, p1.x, p1.y );
g.beginGradientFill( GradientType.LINEAR, gradient_colors, gradient_alphas, gradient_ratios, gradient_matrix );
g.lineStyle( 1 );
g.moveTo( 200, 100 );
g.lineTo( 250, 150 ); triangle.graphics.lineTo( 50, 250 );
g.lineTo( 200, 100 );
g.endFill();
addChild( triangle );

Объяснять лень.
Ах да, раз уж есть p1, p2 и p3, то в moveTo() и lineTo() лучше, конечно, их использовать.

Волгоградец 21.02.2011 17:38

Нет, такой вариант не прокатывает - если менять точки p1, p2, p3 - то все ломается. Нужен универсальный способ.

samana 21.02.2011 17:57

Я не уверен, но кажется с помощью drawTriangles можно положить текстуру задав нужные UV.

Волгоградец 21.02.2011 18:21

Да, но текстура нужна в виде Bitmap. А мне нужна векторная заливка.
Еще интересный момент с createGradientBox:
Код AS3:

m.createGradientBox(w, h, r, x, y);

не то же самое, что
Код AS3:

m.createGradientBox(w, h);
m.rotate(r);
m.tx = x;
m.ty = y;

Что там творится внутри этого метода?

samana 21.02.2011 18:44

Просто мысль. А если делать градиентный прямоугольник и ограничивать его треугольной маской?

Волгоградец 21.02.2011 18:56

Не хотелось бы многоходовки применять...
Вобщем удалось мне сделать то что хотел - главное не передавать аргументы в метод, а потом дергать методы матрицы (см. пост 7).
Всем спасибо.

shootkin 21.02.2011 19:12

Хоть я и понимаю, что опоздал, но свои ошибки надо исправлять.
Да, ротацию и перемещение лучше не доверять методу createGradientBox.
Код AS3:

gradient_matrix.createGradientBox( Point.distance( p1, p2 ), 16, 0, 0, 0 );
gradient_matrix.rotate( Math.atan2( p2.y - p1.y, p2.x - p1.x ) );
gradient_matrix.translate( p1.x, p1.y );

То есть в createGradientBox осталась только ширина градиента.


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

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