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

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

  1. _DEN_

    _DEN_ DEN

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

    Если нормировать, то тогда уж делить на радиус наверно? :)
     
  2. _DEN_

    _DEN_ DEN

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

    Опять куб получатся, только втянутый к центру.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Лажа видимо в том, что углы как-то друг от друга зависят. Например, не может быть такого, чтобы были равны нулю одновременно два угла.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А что если вначале найти точку с помощью 2D сферических координат, а затем крутануть её так, чтобы плоскость второй системы проходила через центр и первую точку. По идее позволит точке всё время распределяться по медиане.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Я понял. На сфере две степени свободы, а углов - три. Значит углы друг от друга зависят. То есть надо вывести углы через их степени свободы - но тут мы опять возвращаемся к сферической системе координат :dntknw:
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Рендомиш точку на плоскости в сферических, затем находишь плоскость которая перпендикулярна первой плоскости и которая проходит через центр и рендомную точку, это будет матрица перевода. Рендомиш вторую точку в сферических, переводишь её в найденную систему координат.
     
  7. _DEN_

    _DEN_ DEN

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

    В общем нужна именно сферическая система, но случайную величину [0; 1] для вычисления первого угла надо вычислять не как rnd(), а как asin(2 * rnd() - 1) / pi + 0.5

    Чисто интуитивно показалось что ее надо выпрямлять по закону арксинуса. Зашел в derive, подобрал формулу - и вуаля :)
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    А что за ореол вокруг?
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    это проекция точек с различной z координатой но близкими x и y координатами
    алсо там случайный радиус
     
  10. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Так. Всю тему не читал, может уже ответили.
    На gamedev.ru/forum была точно такая-же тема.

    Решение просто и таково:

    Первое: выбираем ось, пронзающую гипотетические полюса. По ней одним rand-ом (ну например от -R до R, если R-радиус сферы и 0 в её центре) откладываем случайную точку внутри сферы.
    Второе: В плоскости, перпендикулярной выбранной оси и проходящей через выбранную точку откладываем случайный угол (от 0 до 2*Pi) и на сфере в этом разрезе этой плоскостью по этому углу ставим точку. Она и будет истинно случайна по всей поверхности сферы (т.е. большое множество их заполнят её поверхность так, что на любой равной площадке их будет примерно одинаковое количество).

    Звучит всё это так, как будто бы метод неверен и у полюсов будут сгущения. Но на самом деле это не так. Метод основан на одном интересном свойстве сферы - срез по любому сечению двумя параллельными плоскостями (та часть сферы, которая окажется между ними) при одинаковом расстоянии между этими плоскостями всегда будет иметь одну и ту же площадь. Т.е. как у цилиндра, если срезающие плоскости перпендикулярны его оси.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aa_dav
    Я вроде то же самое написал.
     
  12. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    А можешь код выложить, пожалуйста? Как у тебя такие точки красивые получаются, типа размытые?
     
  13. _DEN_

    _DEN_ DEN

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

    Да ну, не кошерно) Кошернее - выпрямлять случайную величину арксинусом :)
     
  14. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Не, не похоже. Или я не понял твоих объяснений.
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aa_dav
    По-моему похожа. ^)
     
  16. _DEN_

    _DEN_ DEN

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

    Так а чо там выкладывать? Все ж элементарно: OpenGL + текстура градиентного шарика + GL_ARB_POINT_SPRITE.
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Доказательство давай.
     
  18. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Ну то что сам додумался - это большой плюс. Я лично в той аналогичной теме, про которую говорил, не смог задачку сию решить, и более того, долго спорил с теми кто вышеприведенный мной метод предложил, пока не скомпилил OpenGL-ую прожку и не убедился воочию.
    По настоящему некошерный метод итеративного куба, хоть он и рабочий, предлагался там же.
    Тот же куб, про который тут говорили, но в цикле - случайная точка ([-R,R],[-R,R],[-R,R] продляется лучом из центра сферы на её поверхность. Но только если точка лежит в сфере, иначе итерация запускается снова. =)
     
  19. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Вот как я понимаю твоё объяснение:

    > Рендомиш точку на плоскости в сферических,

    Имеется ввиду, берем плоскость, и на некоем произвольном радиусе X откладываем по случайному углу точку T1? Вроде про это речь, но уже напрягает что непонятно каким боком эта плоскость соотносится с нашей сферой. Она через неё проходит? Если да, то как? Наиболее логично предположить, что через центр? Ок. Будем отталкиваться от этого.

    > затем находишь плоскость которая перпендикулярна первой плоскости и которая проходит через центр и рендомную точку,

    Ок.

    > это будет матрица перевода. Рендомиш вторую точку в сферических, переводишь её в найденную систему координат.

    Вторую точку рендомишь уже во второй плоскости, как я понимаю. И тоже в сферических. Ага. Значит что ты делаешь - берешь два случайных угла Эйлера (широта, долгота) и откладываешь по ним точку. Этот метод не работает. Сгущение то ли у полюсов будет.

    Метод про который я говорил выбирает случайный СРЕЗ сферы по её оси на основании не случайного угла, а декартовой координаты откладываемой по отрезку оси лежащем в сфере (плоскость перпендикулярна этому отрезку и пересекает его в случайной точке [-R,R]. А потом в этой плоскости уже стреляет случайным углом в сферу.
     
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Код (Text):
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var i:Integer;
    3. R,x,y,z:Real;
    4. t,the,fi:Real;
    5. begin
    6.  
    7. r:=200;
    8. i:=0;
    9. while i<50000 do
    10.  begin
    11.  the:=arccos(Random);
    12.  fi:=2*Pi*Random;
    13.  x:=r*sin(the)*cos(fi);
    14.  y:=r*sin(the)*sin(fi);
    15.  z:=r*cos(the);
    16.  Image1.Canvas.Pixels[Round(x+r),Round(y+r)]:=ClBlack;
    17.  Inc(i);
    18.  end;
    19. end;