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

Вернуться   Форум Flasher.ru > Блоги > dark256

Оценить эту запись

Равномерное распределение в полярных координатах.

Запись от dark256 размещена 07.12.2012 в 14:28
Обновил(-а) dark256 07.12.2012 в 19:50

Не открою ничего нового, но зато, может быть, напомню о плотно и хорошо забытом старом.
Итак, имеется окружность диаметром 500.
Ее надо равномерно и дискретно случайным образом заполнить "звездочками" так, чтобы они :

1. Гармонично смотрелись
2. Не касались друг друга
3. Чтобы в данных координатах выводилась только одна звездочка.

п.3. - примерно понятно. Каждой дискретной целочисленной координате сопоставляем элемент двумерного массива и ставим там флажок "занято". При попытке нарисовать звездочку в занятой позиции ищем следующую.

п.2. - тоже ясно. дискретность координат подбираем так, чтобы фигуры друг на друга не налезали.

п.1...... Хм...... И тут началось.
Выбрана была, само собой, полярная система координат. Позиция объекта задается парой угол-радиус.
Для начала я испробовал рандомное распределение:

Код AS1/AS2:
	var RD = 250*Math.random() 
	var AG =  random( 360 )
 
	obj._x = RD*Math.cos( (AG/180)*Math.PI )
	obj._y = RD*Math.sin( (AG/180)*Math.PI )
Получилось так: рис.1.
Название: rs1.jpg
Просмотров: 1350

Размер: 63.8 Кб
Некрасиво, кучность в центре. Я было впал в отчаяние, и полез экспериментировать с логарифмами, экспонентами и прочими нелинейностями, но, к счастью, коллеги быстро наставили меня на путь истинный, ознакомив с:
http://www.flasher.ru/forum/showpost...65&postcount=8

Юзаем:
Код AS1/AS2:
	var RD = 250*Math.sqrt(  Math.random() ) 
	var AG =  random( 360 )
 
	obj._x = RD*Math.cos( (AG/180)*Math.PI )
	obj._y = RD*Math.sin( (AG/180)*Math.PI )
Отлично: рис.2.
Название: rs2.jpg
Просмотров: 1339

Размер: 69.0 Кб

По идее, то что хотелось. Переходим к п.2. и добавляем дискретизацию.

Код AS1/AS2:
	var RD = Math.round( (   250*Math.sqrt(  Math.random() )   / 5 ) ) * 5
	var AG = Math.round ( random( 36 )*10 )
 
	obj._x = RD*Math.cos( (AG/180)*Math.PI )
	obj._y = RD*Math.sin( (AG/180)*Math.PI )
Получается крайне некрасиво: рис.3.
Название: rs3.jpg
Просмотров: 1320

Размер: 75.5 Кб

Дискретные углы дают нам "лучи". Просветы к внешнему радиусу и кучность в центре. Эмпирический подбор коэффициентов ничего хорошего не выдал. Надо как-то размазывать дискретность угла по мере увеличения радиуса.... Задачка.... И тут мне пришло в голову расположить объекты по спирали.
Формулу я , разумеется уже не помню, поэтому гуглим и находим вот это:
http://ru.wikipedia.org/wiki/%D0%90%...B0%D0%BB%D1%8C

Архимедова спираль!!! После некоторых экспериментов с коэффициентами получаем:

Код AS1/AS2:
function putStar( i ){
	var obj = CON.attachMovie("starClip","SC"+i, CON.getNextHighestDepth() )
	var AG =  Math.sqrt( i*37000 ) 
	var RD = 5 + AG/(Math.PI*2) * 0.48
 
	obj._x = RD*Math.cos( (AG/180)*Math.PI )
	obj._y = RD*Math.sin( (AG/180)*Math.PI )-5
}
 
for ( var i = 0; i<250; i++ ){
	putStar( i )
}
Запускаем, смотрим: рис.4.
Название: rs4.jpg
Просмотров: 1348

Размер: 58.0 Кб
Красота! То что надо! Причем как легко заметить, уникальность знакоместа задается уже одним индексом, и хэш-таблица будет не двухмерная, а одномерная. По дороге удалось нечуствительно оптимизировать п.3. Вуаля. Равномерное распределение на 250 знакомест. Для моих целей достаточно.

Ну и собственно как это выглядит в работе:
radialler.swf   (1.6 Кб)
Вложения
Тип файла: swf radialler.swf (1.6 Кб, 558 просмотров)
Всего комментариев 9

Комментарии

Старый 07.12.2012 19:17 iNils вне форума
iNils
 
Аватар для iNils
А почему бы сразу вставлять картинки в тексте, а не писать "Получилось так: рис.1." и тп?
Старый 07.12.2012 19:43 dark256 вне форума
dark256
 
Аватар для dark256
Сэр, исправился, сэр!
Редко пишу блоги-с, сэр!
Старый 07.12.2012 20:12 Котяра вне форума
Котяра
 
Аватар для Котяра
Можно же было разделить простой прямоугольной сеткой и проверять только чтобы не выходило за границы круга.. Имхо более равномерно бы получилось.
Старый 08.12.2012 07:39 alexcon314 вне форума
alexcon314
"Если звезды зажигают, значит это кому-нибудь нужно...". Навеяло с утра пораньше.
Старый 08.12.2012 15:02 dark256 вне форума
dark256
 
Аватар для dark256
Код:
Можно же было разделить простой прямоугольной сеткой
Я школьный курс математики позабыл, а ты мне предлагаешь вдаваться в глубины квадратуры круга
Можно.... Зэбэстыч предлагал туда гексы вписать и по ним строить.... но хотелось максимально упрощенно.
Старый 08.12.2012 15:28 alatar вне форума
alatar
 
Аватар для alatar
Тут и по окружнотям разделить можно было или так.
Старый 08.12.2012 18:11 dark256 вне форума
dark256
 
Аватар для dark256
Я кристаллизовался и выпал в осадок!
Спасибо! Все-таки блог это не тема не форуме! Спасибо! ЗДОРОВО!!!!!!!!!
Старый 08.12.2012 23:08 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Результат — отличный.
Старый 14.12.2012 14:26 Storfus13 вне форума
Storfus13
 
Аватар для Storfus13
Красота - понятие субъективное. В результате получилась, все-таки, спираль, а не "равномерное распределение" - термин, имеющий совершенно определенный смысл.
Ассоциация с картинкой в результирующем файле: суточное вращение вблизи полюса мира через зеленый светофильтр.
 

 


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


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