Равномерное распределение в полярных координатах.
Не открою ничего нового, но зато, может быть, напомню о плотно и хорошо забытом старом.
Итак, имеется окружность диаметром 500.
Ее надо равномерно и дискретно случайным образом заполнить "звездочками" так, чтобы они :
1. Гармонично смотрелись
2. Не касались друг друга
3. Чтобы в данных координатах выводилась только одна звездочка.
п.3. - примерно понятно. Каждой дискретной целочисленной координате сопоставляем элемент двумерного массива и ставим там флажок "занято". При попытке нарисовать звездочку в занятой позиции ищем следующую.
п.2. - тоже ясно. дискретность координат подбираем так, чтобы фигуры друг на друга не налезали.
п.1...... Хм...... И тут началось.
Выбрана была, само собой, полярная система координат. Позиция объекта задается парой угол-радиус.
Для начала я испробовал рандомное распределение:
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 )
Некрасиво, кучность в центре. Я было впал в отчаяние, и полез экспериментировать с логарифмами, экспонентами и прочими нелинейностями, но, к счастью, коллеги быстро наставили меня на путь истинный, ознакомив с:
http://www.flasher.ru/forum/showpost...65&postcount=8
Юзаем:
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. и добавляем дискретизацию.
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 )
Дискретные углы дают нам "лучи". Просветы к внешнему радиусу и кучность в центре. Эмпирический подбор коэффициентов ничего хорошего не выдал. Надо как-то размазывать дискретность угла по мере увеличения радиуса.... Задачка.... И тут мне пришло в голову расположить объекты по спирали.
Формулу я , разумеется уже не помню, поэтому гуглим и находим вот это:
http://ru.wikipedia.org/wiki/%D0%90%...B0%D0%BB%D1%8C
Архимедова спираль!!! После некоторых экспериментов с коэффициентами получаем:
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 ) }
Красота! То что надо! Причем как легко заметить, уникальность знакоместа задается уже одним индексом, и хэш-таблица будет не двухмерная, а одномерная. По дороге удалось нечуствительно оптимизировать п.3. Вуаля. Равномерное распределение на 250 знакомест. Для моих целей достаточно.
Ну и собственно как это выглядит в работе:
Всего комментариев 9
Комментарии
07.12.2012 19:17 | |
А почему бы сразу вставлять картинки в тексте, а не писать "Получилось так: рис.1." и тп?
|
07.12.2012 19:43 | |
Сэр, исправился, сэр!
Редко пишу блоги-с, сэр! |
07.12.2012 20:12 | |
Можно же было разделить простой прямоугольной сеткой и проверять только чтобы не выходило за границы круга.. Имхо более равномерно бы получилось.
|
08.12.2012 07:39 | |
"Если звезды зажигают, значит это кому-нибудь нужно...". Навеяло с утра пораньше.
|
08.12.2012 15:28 | |
Тут и по окружнотям разделить можно было или так.
|
08.12.2012 18:11 | |
Я кристаллизовался и выпал в осадок!
Спасибо! Все-таки блог это не тема не форуме! Спасибо! ЗДОРОВО!!!!!!!!! |
08.12.2012 23:08 | |
Результат — отличный.
|
Последние записи от dark256
- Многоуровневое меню (27.11.2015)
- О многоядерности. (21.03.2013)
- Равномерное распределение в полярных координатах. (07.12.2012)
- CS3 Crash (29.06.2011)
- Отладка по-темному (01.02.2011)