点光源が(1,0)にあるカージオイドの火線を描画しました

参考までに POV-Rayで
点光源によるカージオイドの火線を 描画する方法を載せておきます
//********************************************************************************
#macro Line_function(Tp,Fn)
#switch(Fn)
#case (31) //Cardioid
#local Px=(A+B)*cos(Tp)+B*cos( (A+B)*Tp/B );
#local Py=(A+B)*sin(Tp)+B*sin( (A+B)*Tp/B );
#local F=<Px,Py>; #break
#end F
#end
//********************************************************************************
#macro Space_line2(Lr,V1,Fn)
#local P1=Line_function(V1.x,Fn);
#local Tp=V1.x; #while(Tp<V1.y)
#local P2=Line_function(Tp+V1.z,Fn);
cylinder { P1, P2, Lr }
#if(Tp<V1.y-V1.z) sphere { P2, Lr } #end #local P1=P2;
#local Tp=Tp+V1.z; #end
#end
//********************************************************************************
#macro Catacaustics(Lr,V1,Ls,Rlen,Fn) #local H=1e-8;
#local Tp=V1.x; #while(Tp<V1.y)
#local Pv=Line_function(Tp,Fn);
#local Tv=(Line_function(Tp+H/2,Fn)-Line_function(Tp-H/2,Fn))/H;
#local mNv=<-Tv.y,Tv.x>;
#if(vlength(mNv)=0) #local mNv=1e-9*x; #end
#local mNT=mod(atan2(mNv.y,mNv.x)+2*pi,2*pi);
#local Lv=Ls-Pv;
#if(vlength(Lv)=0) #local Lv=-1e-9*x; #end
#local LT=mod(atan2(Lv.y,Lv.x)+2*pi,2*pi);
#local Th=mNT-LT;
cylinder { 0, Rlen*Lv Lr rotate degrees(2*Th)*z translate Pv }
#local Tp=Tp+V1.z; #end
#end
//********************************************************************************
#local Fn=31;
#local Dv=72;
#local Sc=21; #local Tr=-Sc*2/3*x; #local Lw=0.2/Sc;
//
#local A=1; #local B=1; //Cardioid
#local Caustic=
union {
Space_line2(0.25/Sc,<0,2*pi,0.3/Sc>,Fn)
Catacaustics(Lw,<0,2*pi,2*pi/Dv>,<1,0>,2,Fn)
}
//
#local Ntop=Dv+1;
#local Cardioid =
prism { linear_sweep linear_spline -Lw,Lw,Ntop,
#local i=0; #while(i<Ntop) #local Th=i*2*pi/Dv;
<(A+B)*cos(Th)+B*cos( (A+B)*Th/B ),(A+B)*sin(Th)+B*sin( (A+B)*Th/B )>
#local i=i+1; #end
rotate -90*x scale 1+Lw/2 }
//
intersection {
object { Caustic }
object { Cardioid }
pigment { color rgb <0.773,0.091,0.137> } scale Sc translate Tr }





