Лажа видимо в том, что углы как-то друг от друга зависят. Например, не может быть такого, чтобы были равны нулю одновременно два угла.
А что если вначале найти точку с помощью 2D сферических координат, а затем крутануть её так, чтобы плоскость второй системы проходила через центр и первую точку. По идее позволит точке всё время распределяться по медиане.
Я понял. На сфере две степени свободы, а углов - три. Значит углы друг от друга зависят. То есть надо вывести углы через их степени свободы - но тут мы опять возвращаемся к сферической системе координат
Рендомиш точку на плоскости в сферических, затем находишь плоскость которая перпендикулярна первой плоскости и которая проходит через центр и рендомную точку, это будет матрица перевода. Рендомиш вторую точку в сферических, переводишь её в найденную систему координат.
В общем нужна именно сферическая система, но случайную величину [0; 1] для вычисления первого угла надо вычислять не как rnd(), а как asin(2 * rnd() - 1) / pi + 0.5 Чисто интуитивно показалось что ее надо выпрямлять по закону арксинуса. Зашел в derive, подобрал формулу - и вуаля
Booster это проекция точек с различной z координатой но близкими x и y координатами алсо там случайный радиус
Так. Всю тему не читал, может уже ответили. На gamedev.ru/forum была точно такая-же тема. Решение просто и таково: Первое: выбираем ось, пронзающую гипотетические полюса. По ней одним rand-ом (ну например от -R до R, если R-радиус сферы и 0 в её центре) откладываем случайную точку внутри сферы. Второе: В плоскости, перпендикулярной выбранной оси и проходящей через выбранную точку откладываем случайный угол (от 0 до 2*Pi) и на сфере в этом разрезе этой плоскостью по этому углу ставим точку. Она и будет истинно случайна по всей поверхности сферы (т.е. большое множество их заполнят её поверхность так, что на любой равной площадке их будет примерно одинаковое количество). Звучит всё это так, как будто бы метод неверен и у полюсов будут сгущения. Но на самом деле это не так. Метод основан на одном интересном свойстве сферы - срез по любому сечению двумя параллельными плоскостями (та часть сферы, которая окажется между ними) при одинаковом расстоянии между этими плоскостями всегда будет иметь одну и ту же площадь. Т.е. как у цилиндра, если срезающие плоскости перпендикулярны его оси.
jaja Так а чо там выкладывать? Все ж элементарно: OpenGL + текстура градиентного шарика + GL_ARB_POINT_SPRITE.
Ну то что сам додумался - это большой плюс. Я лично в той аналогичной теме, про которую говорил, не смог задачку сию решить, и более того, долго спорил с теми кто вышеприведенный мной метод предложил, пока не скомпилил OpenGL-ую прожку и не убедился воочию. По настоящему некошерный метод итеративного куба, хоть он и рабочий, предлагался там же. Тот же куб, про который тут говорили, но в цикле - случайная точка ([-R,R],[-R,R],[-R,R] продляется лучом из центра сферы на её поверхность. Но только если точка лежит в сфере, иначе итерация запускается снова. =)
Вот как я понимаю твоё объяснение: > Рендомиш точку на плоскости в сферических, Имеется ввиду, берем плоскость, и на некоем произвольном радиусе X откладываем по случайному углу точку T1? Вроде про это речь, но уже напрягает что непонятно каким боком эта плоскость соотносится с нашей сферой. Она через неё проходит? Если да, то как? Наиболее логично предположить, что через центр? Ок. Будем отталкиваться от этого. > затем находишь плоскость которая перпендикулярна первой плоскости и которая проходит через центр и рендомную точку, Ок. > это будет матрица перевода. Рендомиш вторую точку в сферических, переводишь её в найденную систему координат. Вторую точку рендомишь уже во второй плоскости, как я понимаю. И тоже в сферических. Ага. Значит что ты делаешь - берешь два случайных угла Эйлера (широта, долгота) и откладываешь по ним точку. Этот метод не работает. Сгущение то ли у полюсов будет. Метод про который я говорил выбирает случайный СРЕЗ сферы по её оси на основании не случайного угла, а декартовой координаты откладываемой по отрезку оси лежащем в сфере (плоскость перпендикулярна этому отрезку и пересекает его в случайной точке [-R,R]. А потом в этой плоскости уже стреляет случайным углом в сферу.
Код (Text): procedure TForm1.Button1Click(Sender: TObject); var i:Integer; R,x,y,z:Real; t,the,fi:Real; begin r:=200; i:=0; while i<50000 do begin the:=arccos(Random); fi:=2*Pi*Random; x:=r*sin(the)*cos(fi); y:=r*sin(the)*sin(fi); z:=r*cos(the); Image1.Canvas.Pixels[Round(x+r),Round(y+r)]:=ClBlack; Inc(i); end; end;