Не получается раскидать равномерно точки на сфере. Делаю так: беру сферические координаты (http://ru.wikipedia.org/wiki/Сферические_координаты), генерю углы линейным распределением (обычная std::rand), и перехожу по формуле в декартовы координаты. Проблема: на полюсах получаются сгустки:
GoldFinch Я кажется понимаю. Сферические координаты это два поворота. Первый - это движение по меридиане, второй - это движение по параллели. При линейном распределении получается что точка попадает на случайную параллель, потом случайно по ней движется. N точек, попавшие на околополюсную параллель, создадут большую видимую густоту, чем те же точки на экваторе. Хм... Ща подумаю...
M57 (m - англ) в гугле наберите. и що вы видите? кольцо? объясните откуда берется кольцо если это газовая сфера. вот оттуда же кольцо и у вас. ну практически оттуда. или карту земли возьмите. и посмотрите на сетку, которая образует такие же пятна на полюсах. а все потому что мы видим проекцию сферы на плоскость и, следовательно, на полюсах плотность равномерно распределенных точек повышается. если нужно равномерное распределение точек на плоскости - ну так и рисуйте круг, заполняйте его точками
kaspersky Не гони волну, в сферических координатах действительно есть проблема. Прочитай мой предыдущий пост. [edit] К тому же, полюс - понятие надуманное. Где захотели, там и плюс. Если же полюса явно видны - значит распределение не равномерное (то есть почему у меня полюса сверху и снизу, а не справа и слева?).
еще можно юзать координаты, где положение вектора(точки) задается углом между вектором и соответствующей осью координат, тут уже все координаты будут формировать "меридианы"
Booster это очевидно не то, (мощность) точек в углах куба больше чем в серединах граней алсо сначала надо разобраться в математической постановке задачи, изучив математическую литературу, а потом уже всякие std::rand() писать
_DEN_ ну ты же сам себе ответил, что "N точек, попавшие на околополюсную параллель, создадут большую видимую густоту, чем те же точки на экваторе". а еще образуется кольцо. так что у тебя две проблемы, а не одна. где будут полюса - так это от тебя зависит. как их избежать - ну так я тебе сказал. если тебе нужно равномерное распределение точек на плоскости - ну так и строй их на плоскости. а если все-таки нужна сфера, то... ты сам подумай. ну не бывает так, чтобы и на проекции плоскости и на сфере распределение было равномерным, ибо все методы проекции вносят свои искажения. построй равномерное распределение точек на глобусе, а потом его сфоткай. и посмтри дело не в плохом rand'е. плохой rand дает пятна разбросанные по всей проекции, и не такие сильные как у тебя.
kaspersky видимо задача - всетаки получить точки равномерно распределенные по сфере, а не по ее двумерной проекции на сетчатку глаза
kaspersky Ну это была интуитивная догадка исходя из формулы перехода от сферической системы координат к декартовой. Задача, как ловко уточнил GoldFinch, именно в равномерном распределении на сфере GoldFinch Что-то не могу сходу сообразить как перейти от трех углов к пространственным координатам... По сути это конечные углы, а не углы трех последовательных поворотов... Не подскажешь формулу?
Согласен. А если случайным образом брать не только сферические координаты, но и сами сферические координатные системы относительно глобальной системы?
GoldFinch Код (Text): for(int i = 0; i < 50000; ++i) { float r = rnd() + 3; float phi_x = pi * rnd(); float phi_y = pi * rnd(); float phi_z = pi * rnd(); point p; p.x = r * cos(phi_x); p.y = r * cos(phi_y); p.z = r * cos(phi_z); mesh.push_back(p); } Ты в этом уверен? :-D
я уже удалил тот пост) очевидно что радиус не будет равен 1 попробуй его нормировать Код (Text): for(int i = 0; i < 50000; ++i) { float r = rnd() + 3; float phi_x = pi * rnd(); float phi_y = pi * rnd(); float phi_z = pi * rnd(); point p; p.x = cos(phi_x); p.y = cos(phi_y); p.z = cos(phi_z); r = r* sqrt(p.x*p.x+p.y*p.y+p.z*p.z); //sqr() ?? p.x = r * p.x; p.y = r * p.y; p.z = r * p.z; mesh.push_back(p); }