#macro bezier3triangles_rec(uv1, uv2, uv3, fx, fy, fz, depth) #if (depth =0) triangle{ , , } #else #local uv12 = (uv1+uv2)/2; #local uv13 = (uv1+uv3)/2; #local uv23 = (uv2+uv3)/2; bezier3triangles_rec(uv1,uv12,uv13,fx,fy,fz,depth-1) bezier3triangles_rec(uv2,uv12,uv23,fx,fy,fz,depth-1) bezier3triangles_rec(uv3,uv23,uv13,fx,fy,fz,depth-1) bezier3triangles_rec(uv12,uv13,uv23,fx,fy,fz,depth-1) #end #end #macro w() min(1, (1-u-v)/max( 1-2*u*v,0.001 ) ) #end #macro bezier3triangles(A,B,C,D,E,F,G,depth) #local Ax=A.x; #local Ay=A.y; #local Az=A.z; #local Bx=B.x; #local By=B.y; #local Bz=B.z; #local Cx=C.x; #local Cy=C.y; #local Cz=C.z; #local Dx=D.x; #local Dy=D.y; #local Dz=D.z; #local Ex=E.x; #local Ey=E.y; #local Ez=E.z; #local Fx=F.x; #local Fy=F.y; #local Fz=F.z; #local Gx=G.x; #local Gy=G.y; #local Gz=G.z; #local rad=0.05; /*union{ sphere{A,rad pigment{Red}} sphere{C,rad pigment{Red}} sphere{E,rad pigment{Red}} sphere{B,rad pigment{Green}} sphere{D,rad pigment{Green}} sphere{F,rad pigment{Green}} sphere{G,rad pigment{Yellow}}*/ #local fx = function(u,v) { u*u*(1-2*u*w() )*Ax + 2*u*v*(1-w() )*Bx + v*v*(1-2*w()*u)*Cx + 2*v*w()*(1-u)*Dx + pow(w(),2)*(1-2*u*v)*Ex + 2*u*w()*(1-v)*Fx + 4*u*v*w()*Gx } #local fy = function(u,v) { u*u*(1-2*u*w() )*Ay + 2*u*v*(1-w() )*By + v*v*(1-2*w()*u)*Cy + 2*v*w()*(1-u)*Dy + pow(w(),2)*(1-2*u*v)*Ey + 2*u*w()*(1-v)*Fy + 4*u*v*w()*Gy } #local fz = function(u,v) { u*u*(1-2*u*w() )*Az + 2*u*v*(1-w() )*Bz + v*v*(1-2*w()*u)*Cz + 2*v*w()*(1-u)*Dz + pow(w(),2)*(1-2*u*v)*Ez + 2*u*w()*(1-v)*Fz + 4*u*v*w()*Gz } mesh{ bezier3triangles_rec(<0,0>,<0,1>,<1,0>,fx,fy,fz,depth) } #end /* example scene */ object{ bezier3triangles( <0,0,0>,<0.5,1.5,0>,<1,0,0>, <1,1.6,0.4>,<1,0,1>, <0.5,1.5,0.5>,<0.7,3,0.3>,5) pigment{rgb 1 } } light_source{<0,5,0>,1} camera{location <0,4,-1> look_at 0.5 angle 40 } plane{y,0 pigment{rgb <0,0,1>}}