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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Ура, свершилось! Идея с добавлением вершин осталась старая. Просто я нашел таки способ их добавить. Он, конечно же, оказался прост и очевиден. Нужно было создавать PlaneGeometry с большим количеством сегментов. На эту мысль меня натолкнул пример здесь, там где идет описание примитива Plane. На демке с этой страницы можно видеть как строится примитив из треугольников.

Следующей задачей было выяснить как эти точки группируются в векторе vertexData. Группируются так (пример квадрата 50x50 с segV = 2 и segH = 2):
Название: explain.jpg
Просмотров: 376

Размер: 10.3 Кб Название: explain_02.jpg
Просмотров: 392

Размер: 11.4 Кб
Для большего количества сегментов группировка точек будет аналогична.
Получается чтобы превратить квадратную плоскость в правильный многоугольник нужно сдвинуть крайние точки квадрата на красную окружность. Чем и занимается следующая функция:
Код AS3:
/**
 * Функция меняет значения x, y, z в векторе v для крайних точек
 * плоскости. Предусловием является то, что созданная PlaneGeometry
 * должна быть вписана в круг радиуса r. Также количество сегментов
 * по вертикали должно совпадать с количеством сегментов по горизонтали.
 * @param	v
 * @param	r
 */
private function convertPlaneToCircle( v:Vector.<Number>, r:Number ):void
{
	// Выясняем количество сегментов.
	var segCount:int = Math.sqrt(v.length / 13) - 1;
	// Изобразим картинку для segCount = 3
 
	//  12   13    14   15
	//   o----o----o----o
	//   |    |    |    |
	// 8 o----o----o----o 11
	//   |    |    |    |
	// 4 o----o----o----o 7
	//   |    |    |    |
	//   o----o----o----o
	//  0     1    2     3
 
	// То есть нужно изменить положение точек с обозначенными
	// индексами. Помним, что по предусловию точки 0, 3, 12 и 15
	// (для данного случая) лежат на окружности радиуса r.
	// Остальным точкам нужно задать координаты таким образом, чтобы
	// они стали вершинами правильного многоугольника.
 
	// Сразу можно выяснить шаг угла.
	var angleStep:Number = (90.0 / segCount) / DEG_IN_RAD;
	var angle:Number = 0;
 
	var pointsCount:int = v.length / 13;
	for (var n:int = 0; n < pointsCount; ++n)
	{
		// Нас интересуют точки нижнего ряда
		if (n > 0 && n < segCount)
		{
			// Здесь начинается с угловой координаты -3 * pi / 4
			// и идет в сторону увеличения
			angle = ( -3 * Math.PI / 4) + n * angleStep;
			// Ставим x
			v[ n * 13 ] = Math.cos(angle) * r;
			// Ставим y
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
 
		// Еще нас интересуют точки верхнего ряда
		else if (n > (segCount * (segCount + 1)) && n < pointsCount - 1)
		{
			// Здесь начинается с угловой координаты 3 * pi / 4
			// и идет в сторону уменьшения
			angle = ( 3 * Math.PI / 4) - n * angleStep;
			v[ n * 13 ] = Math.cos(angle) * r;
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
 
		// Еще нас интересует левая сторона
		else if ((n % (segCount + 1)) == 0 && n > 0 && n < (segCount * (segCount + 1)))
		{
			// Здесь начинается с угловой координаты -3 * pi / 4
			// и идет в сторону уменьшения
			angle = ( -3 * Math.PI / 4) - int(n / (segCount + 1)) * angleStep;
			v[ n * 13 ] = Math.cos(angle) * r;
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
 
		// Еще нас интересует правая сторона
		else if ((n % (segCount + 1)) == segCount && n > segCount && n < pointsCount - 1)
		{
			// Здесь начинается с угловой координаты -pi / 4
			// и идет в сторону увеличения
			angle = ( -Math.PI / 4) + int(n / (segCount + 1)) * angleStep;
			v[ n * 13 ] = Math.cos(angle) * r;
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
	}
}
Стоит отметить, что я мог что-то напутать с расположением точек и знаю, что данная функция работает для количества сегментов равных 3 и 7. Меня цифра 7 удовлетворила вполне, поэтому дальше я не стал разбираться. Полагаю, можно допилить до работы с любым количеством сегментов.

Так вот, в общем мы просто меняем координаты точек и радуемся результату:
Название: planar_reflection_circle_geometry.JPG
Просмотров: 352

Размер: 42.2 Кб Название: planar_reflection_circle_geometry_02.JPG
Просмотров: 326

Размер: 43.8 Кб

Еще раз спасибо товарищам Asfel и vorodis2

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

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

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


 


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


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