Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.02.2011, 12:51
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 1  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
По умолчанию Градиентная заливка треугольника

Привет. Мне нужно получить такой треугольник:

Название: gradient.png
Просмотров: 499

Размер: 7.4 Кб

Вот его координаты:
Код 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(), но что передавать туда? Вообще этот метод ведет себя странно очень - по идее наклон градиента должен быть таким, каким я его задаю третьим параметром в этом методе, но, чёрт побери, он меняется в зависимости от ширины и высоты что я передаю в метод!!!


Последний раз редактировалось iNils; 21.02.2011 в 13:19.
Старый 21.02.2011, 13:43
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Вы вкурсе что наклон задается Math.PI ? Если да, то проблем не должно быть поидее

Старый 21.02.2011, 13:46
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 3  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
точно, константой )
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 21.02.2011, 14:30
shootkin вне форума Посмотреть профиль Отправить личное сообщение для shootkin Найти все сообщения от shootkin
  № 4  
Ответить с цитированием
shootkin

Регистрация: Apr 2010
Сообщений: 32
Как-то так:
Код 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() лучше, конечно, их использовать.


Последний раз редактировалось shootkin; 21.02.2011 в 14:32.
Старый 21.02.2011, 17:38
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 5  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Нет, такой вариант не прокатывает - если менять точки p1, p2, p3 - то все ломается. Нужен универсальный способ.

Старый 21.02.2011, 17:57
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 6  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Я не уверен, но кажется с помощью drawTriangles можно положить текстуру задав нужные UV.

Старый 21.02.2011, 18:21
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 7  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Да, но текстура нужна в виде Bitmap. А мне нужна векторная заливка.
Еще интересный момент с createGradientBox:
Код AS3:
m.createGradientBox(w, h, r, x, y);
не то же самое, что
Код AS3:
m.createGradientBox(w, h);
m.rotate(r);
m.tx = x;
m.ty = y;
Что там творится внутри этого метода?

Старый 21.02.2011, 18:44
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 8  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Просто мысль. А если делать градиентный прямоугольник и ограничивать его треугольной маской?

Старый 21.02.2011, 18:56
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 9  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Не хотелось бы многоходовки применять...
Вобщем удалось мне сделать то что хотел - главное не передавать аргументы в метод, а потом дергать методы матрицы (см. пост 7).
Всем спасибо.

Старый 21.02.2011, 19:12
shootkin вне форума Посмотреть профиль Отправить личное сообщение для shootkin Найти все сообщения от shootkin
  № 10  
Ответить с цитированием
shootkin

Регистрация: Apr 2010
Сообщений: 32
Хоть я и понимаю, что опоздал, но свои ошибки надо исправлять.
Да, ротацию и перемещение лучше не доверять методу 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, время: 10:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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