Равномерное распределение точек на сфере

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 6 мар 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не получается раскидать равномерно точки на сфере.

    Делаю так: беру сферические координаты (http://ru.wikipedia.org/wiki/Сферические_координаты), генерю углы линейным распределением (обычная std::rand), и перехожу по формуле в декартовы координаты. Проблема: на полюсах получаются сгустки:

    [​IMG]
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Поменять rand.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    используй по "параллелям" линейное распределение, пропорциональное длине "параллели"
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    GoldFinch

    Я кажется понимаю. Сферические координаты это два поворота. Первый - это движение по меридиане, второй - это движение по параллели. При линейном распределении получается что точка попадает на случайную параллель, потом случайно по ней движется. N точек, попавшие на околополюсную параллель, создадут большую видимую густоту, чем те же точки на экваторе.

    Хм... Ща подумаю...
     
  5. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    M57 (m - англ) в гугле наберите. и що вы видите? кольцо? объясните откуда берется кольцо если это газовая сфера. вот оттуда же кольцо и у вас. ну практически оттуда. или карту земли возьмите. и посмотрите на сетку, которая образует такие же пятна на полюсах. а все потому что мы видим проекцию сферы на плоскость и, следовательно, на полюсах плотность равномерно распределенных точек повышается. если нужно равномерное распределение точек на плоскости - ну так и рисуйте круг, заполняйте его точками ;)
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    kaspersky

    Не гони волну, в сферических координатах действительно есть проблема. Прочитай мой предыдущий пост.

    [edit]

    К тому же, полюс - понятие надуманное. Где захотели, там и плюс. Если же полюса явно видны - значит распределение не равномерное (то есть почему у меня полюса сверху и снизу, а не справа и слева?).
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    еще можно юзать координаты, где положение вектора(точки) задается углом между вектором и соответствующей осью координат, тут уже все координаты будут формировать "меридианы"
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Наверно можно рандомить в кубе (rand по трём осям.) И затем проецировать точки на сферу.
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    потому что ты от них углы отсчитываешь
     
  10. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    это очевидно не то, (мощность) точек в углах куба больше чем в серединах граней


    алсо сначала надо разобраться в математической постановке задачи, изучив математическую литературу, а потом уже всякие std::rand() писать
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    GoldFinch

    Это был вопрос Крису :derisive:


    Booster

    В направлении углов куба будут сгустки.
     
  12. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    _DEN_
    ну ты же сам себе ответил, что "N точек, попавшие на околополюсную параллель, создадут большую видимую густоту, чем те же точки на экваторе". а еще образуется кольцо. так что у тебя две проблемы, а не одна. где будут полюса - так это от тебя зависит. как их избежать - ну так я тебе сказал. если тебе нужно равномерное распределение точек на плоскости - ну так и строй их на плоскости. а если все-таки нужна сфера, то... ты сам подумай. ну не бывает так, чтобы и на проекции плоскости и на сфере распределение было равномерным, ибо все методы проекции вносят свои искажения. построй равномерное распределение точек на глобусе, а потом его сфоткай. и посмтри ;) дело не в плохом rand'е. плохой rand дает пятна разбросанные по всей проекции, и не такие сильные как у тебя.
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    kaspersky
    видимо задача - всетаки получить точки равномерно распределенные по сфере, а не по ее двумерной проекции на сетчатку глаза
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    kaspersky

    Ну это была интуитивная догадка исходя из формулы перехода от сферической системы координат к декартовой. Задача, как ловко уточнил GoldFinch, именно в равномерном распределении на сфере :derisive:


    GoldFinch

    Что-то не могу сходу сообразить как перейти от трех углов к пространственным координатам... По сути это конечные углы, а не углы трех последовательных поворотов... Не подскажешь формулу? :)
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Кстати, на рендере не сфера. Там точка имеет случайный радиус от 3 до 4.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Согласен. А если случайным образом брать не только сферические координаты, но и сами сферические координатные системы относительно глобальной системы?
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Ну тогда вопрос в том, как распределять сами системы )))
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    GoldFinch

    Код (Text):
    1.     for(int i = 0; i < 50000; ++i)
    2.     {
    3.         float r = rnd() + 3;
    4.         float phi_x = pi * rnd();
    5.         float phi_y = pi * rnd();
    6.         float phi_z = pi * rnd();
    7.  
    8.         point p;
    9.         p.x = r * cos(phi_x);
    10.         p.y = r * cos(phi_y);
    11.         p.z = r * cos(phi_z);
    12.  
    13.         mesh.push_back(p);
    14.     }
    Ты в этом уверен? :-D

    [​IMG]
     
  20. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    я уже удалил тот пост) очевидно что радиус не будет равен 1

    попробуй его нормировать
    Код (Text):
    1. for(int i = 0; i < 50000; ++i)
    2.     {
    3.         float r = rnd() + 3;
    4.         float phi_x = pi * rnd();
    5.         float phi_y = pi * rnd();
    6.         float phi_z = pi * rnd();
    7.  
    8.         point p;
    9.         p.x = cos(phi_x);
    10.         p.y = cos(phi_y);
    11.         p.z = cos(phi_z);
    12.  
    13.         r = r* sqrt(p.x*p.x+p.y*p.y+p.z*p.z); //sqr() ??
    14.         p.x = r * p.x;
    15.         p.y = r * p.y;
    16.         p.z = r * p.z;
    17.  
    18.         mesh.push_back(p);
    19.     }