Re[17]: ocaml срочно!!!
От: Андрей Хропов Россия  
Дата: 23.05.07 21:50
Оценка: 2 (1) :))
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, anastassia, Вы писали:


A>>А я вот уверена, что вы должны знать про трассировщик лучей))) не объясните доступным русским языком, что это за зверь такой?


VD>У тебя зеркальце есть? Надесь, есть.

VD>Вот чтобы его в 3D сэмулировать. В прочем...
VD>Трассировка лучей

VD>Если на пальцах, то это такие методы просчета изображений с помощью которых можно получить изобразение с приломлениями, отражениями и другими "похжестями на настоящисти".

VD>Эти алгоритмы потребляют очень много процессорного времени и стало быть на любом языке их писать нельзя (а только на тех, что обеспечивают высокую производительность). Кроме того алогоритмы не самые простые. Вот ОКамл как раз почти идиально подходит для этой задачи, так как порождает довольно быстрый код и при этом позволяет написать алгоритм максимально кратко.

ля тех кто еще не читал — Сравнение реализаций трассировки лучей на C++, Java, OCaml, SML, Common Lisp и Scheme здесь.

Ну а на K (наследнике J) занимает всего 7 строк :

// scalar ray-tracer
//  http://www.ffconsultancy.com/free/ray_tracer/comparison.html

/ unit vector
U:{x%_sqrt x _dot x}

/ ray_sphere
S:{[r;s]:[0>d:_sqr[s 1]+_sqr[b:v _dot r 1]-v _dot v:s[0]-*r;0i;0>t:b+e:_sqrt d;0i;0<u:b-e;u;t]}

/ intersect
I:{[r;h;o]:[~4:*o;:[~S[r;*o]<*h;h;h _f[r]/o 1];~h[0]>l:S[r]o;h;(l;U r[0]-o[0]-l*r 1)]}

/ ray_trace
T:{[r;o;d;z;l]:[0i=*h:I[r;z]o;0.;~0>g:h[1]_dot l;0.;0i=*I[(r[0]+(r[1]**h)+d*h 1;-l);z]o;-g;0.]}

/ inner loop: 0-15
N:{[n;o;i]0{x+T[(0 0 -4.;U(i+(y%4)-n%2),n);o;_sqrt 2^-42;0i,,3#0.]U -1 -3 2.}/+4_vs!16}

/ outer loop: nxn -> PGM
R:{[k;n]"P5\n",(5:n,n),"\n255\n",_ci _.5+15.9375*N[n*1.;C[k;0 -1 0.]1.]'+|@[n _vs!n*n;0;|:]}

/ create scene = sphere or (sphere;5-scenes)
C:{[k;c;r]:[k=1;(c;r);((c;r*3);(,(c;r)),C[k-1;;r%2]'+c+-3 3[2_vs 2 3 6 7]*r%_sqrt 12)]}

\t q:R[3]32
"temp.pgm"6:q
\"C:\\Program Files\\IrfanView\\i_view32.exe" temp.pgm


(отсюда)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.