Vladimir_S, буду очень рада, если подскажите! Получается, нельзя сделать плавного перехода в цвете?
Ася!
1. Насчет плавного перехода - по-моему, таких сервисов в Паскале не предусмотрено. Только густотой точек. Впрочем, если у Вас есть графпакет, который может работать с экраном высокого разрешения, то это оно и будет. У меня только VGA-мода (640х480).
2. По самой задаче.
Начнем с рассеянного света.
Как я вижу, задача решается так.
а) Рисуем темный (фоновый) круг.
б) Вводим две системы сферических координат. Первая (основная) решает задачу, когда солнце светит в направлении "северного полюса", т.е. вдоль оси Z, т.е. θ=0, φ - произвольное. Вторая (повернутая) - для случая, когда солнце светит в направлении θs, φs. Ищем в книжках, на сайтах либо, мобилизуя все знания матричной алгебры, решаем самостоятельно задачу перехода от основной к повернутой системе координат, т.е. задачу преобразования координат
θ, φ → θ', φ' для любой точки сферы.
в) Методом случайного выбора задаем угол θ в основной системе координат. Фишка в том, что распределение здесь не равномерное, а косинусное. Подскажу, что оно задается функцией θ = arcsin(x), где х - равномерно распределенная случайная величина в интервале 0-1, т.е. значение функции Random без параметров. Также методом случайного выбора задаем φ=Random*2
π. На всякий случай, приведу вид функции вычисления арксинуса:
Код:
function ArcSin(X:Real):Real;
begin
if X= 1 then ArcSin:= Pi/2 else
if X=-1 then ArcSin:=-Pi/2 else
ArcSin:=ArcTan(X/Sqrt(1-X*X));
end;
г) Делаем переход от θ, φ к θ', φ'.
д) В повернутой системе определяем декартовы координаты Y' и Z' (плоскость рисунка) нашей точки.
е) В случае выполнения условия (Y')²+(Z')²≤R² ставим красную точку с координатами Y' (по горизонтали) и Z' (по вертикали).
ж) Повторяем процедуру, пока не станет красиво. Или до потери пульса.
Итак, будем считать, что с рассеянным светом разобрались. Но это всё как раз еще цветочки. Ягодки начнутся, когда мы захотим решить задачу зеркального отражения. Вот тут - совсем ой! Здесь я вижу решение, например, такое:
а) Фоном является решение предыдущей задачи.
б) Переходим в основную систему координат (солнце светит в направлении Z=0). Задаем в этой системе направление на наблюдателя θн, φн. Забегая вперед, отмечу, что, когда мы повернем систему, это направление изменится - ну да нам-то не всё ли равно?
в) Разбиваем верхнюю полусферу на элементы площадью S=R²sin(θ)ΔθΔφ. В двойном цикле проходим их все.
г) Для каждого элемента определяем угловые координаты луча, соответствующего отражению, исходя из постулата "угол падения равен углу отражения". Эти координаты составят θr=2θ, φr=φ.
д) Определяем угол β между направлением отраженного луча и направлением на наблюдателя (в трехмерном пространстве, не забываем!).
е) Заполняем случайным образом элемент поверхности S так:
i. Фиксируем полное количество "квантов" N, упавших на каждый элемент поверхности площадью S (для всех элементов это число будет одинаковым). Например, N=1000. Или 10000. Или еще сколько-нибудь. Тогда число точек М для каждого из элементов определится из соотношения M=Round(N(cos²β)²) (в смысле косинуса в четвертой степени).
ii. Выбираем для каждой точки углы θр, φр так:
θp = θ + Δθ(0.5-Random)
φp = φ + Δφ(0.5-Random)
iii. Как и в предыдущей задаче, для каждой точки переходим к повернутой системе координат и, как и в том случае, при выполнении условия в пункте е) ставим
желтую точку.
iiii. Процедуру повторяем М раз.
Вот как-то так. Такой вот конгломерат из векторной алгебры, аналитической геометрии, оптики, дизайна и программирования. Где-то на месячишку плотной работы.
Дерзайте!