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

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

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Изменение радиуса компонента без его перемещения

Вопрос по Flex компоненту, но в основном касается as3 геометрии, поэтому считаю здесь более правильный раздел.

Вот это RichText компонент, который позволяет размещать текст вдоль окружности (по ссылке и сорсы есть). Главная проблема в том, что изменяя радиус, сам текст тоже перемещается (попробуйте, менять первый слайдер), а нужно чтобы он выгибался оставаясь на одном и том же месте. За положение текста отвечает этот код:
Код AS3:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			var angle:Number = startAngle*Math.PI/180 + startOffset/radius;
			graphics.clear();
			var line:TextLine, atomBounds:Rectangle;
			var letterW:Number, letterH:Number, arcAngle:Number;
			var dx:Number, dy:Number, ddx:Number, ddy:Number;
			for (var i:int = 0; i < mx_internal::textLines.length; i++) {
				line = mx_internal::textLines[i] as TextLine;
				atomBounds = line.getAtomBounds(0);
				letterW = atomBounds.width;
				letterH = atomBounds.height;
 
				arcAngle = letterW/radius;
				angle+= arcAngle/2;
				dx = Math.cos(angle) * radius;
				dy = Math.sin(angle) * radius;
				ddx = Math.sin(angle)*letterW/2;
				ddy = Math.cos(angle)*letterW/2;
				line.x = dx+ddx;
				line.y = dy-ddy;
				line.rotation = (Math.PI/2+angle)*180/Math.PI;
				angle+= arcAngle/2;
			}
		}
Очевидно, что меняя радиус окружности нужно как-то изменять line.x и line.y так чтобы первая буква текста оставалась на месте. Но как, не ясно.

Вторая проблема, это переход от положительного радиуса к отрицательному. То есть текст должен уметь выгибаться из горизонтального положения как вверх, так и вниз. Делаем слайдер в котором движок посредине (minimum="-20" maximum="20" value="0" stepSize="1"). Теперь нужно как-то смещать центр радиуса окружности вокруг которой строится текст в зависимости от значений слайдера. По коду эта окружность никак не объявляется.

Ну и получается, что для горизонтального текста (value слайдера = 0) радиус должен быть бесконечно большим. Как это реализовать тоже без понятия. Сейчас при нуле все буквы текста собираются в одну точку.

Слайдер двигается дискретно, поэтому нужно как-то изменить условия, чтобы просто убрать размещение вдоль окружности при value="0", а при value="1" или value="-1" уже менять центр радиуса окружности на какое-то большое значение (текст слегка искривлен).

Извиняюсь за сумбурность, сложно все это пояснить, но, надеюсь, понять меня можно.
__________________
In Code We Trust

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
1. Нужно вводить спейсинг, расстояние между буквами.
При уменьшении радиуса увеличивается длина дуги, а значит и длина строки символов, если первый и последний должны оставаться на месте. Расстояние между буквами должно увеличиваться. Им управляет угол каждого символа — arcAngle. Сейчас он заточен на сохранение расстояния между буквами при изменении радиуса, поэтому конец строки плавает. Нужно: посчитать длину дуги (строки) для текущего радиуса, между нужными координатами первого и последнего символа. Разделить ее на длину неизогнутой строки и получить коэфициент приращения спейсинга, на который домножать arcAngle.
2. Бесконечно большой — это глобальная константа Infinity. При смещении регулятора на 1 пиксель можно считать радиус за Number.MAX_VALUE (1.79769313486231e+308). Это уже число, с которым можно работать дальше, делить, отнимать и т.д.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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