// Persistence of Vision Ray Tracer Scene Description File // File: adjustment.pov // Vers: 3.5 // Desc: Adjusts points along a multispline to maintain a constant distance // Date: 11/02/01 // Auth: Josh English // // ---------------------------------------- #macro MakeLockPoints(l) #declare cnt = 0; #declare tmp = array[dimension_size(l,1)] #while( cnt < dimension_size(l,1)) #declare tmp[cnt] = false; #declare cnt = cnt + 1; #end tmp #end #macro MakeVelocityPoints(l) #declare cnt = 0; #declare tmp = array[dimension_size(l,1)] #while( cnt < dimension_size(l,1)) #declare tmp[cnt] = <0,0,0>; #declare cnt = cnt + 1; #end tmp #end #macro ListDistances(l) #declare cnt = 1; #debug concat("--------------------\nThere are ",str(dimension_size(l,1),0,0)," points.\n") #while( cnt < dimension_size(l,1)) #declare len = vlength(l[cnt]-l[cnt-1]); #debug concat( str(cnt,3,0),": ",str(len,5,5)) #declare cnt = cnt + 1; #end #debug "End." #end #declare AdjustmentLoopMax = 150; #declare AdjustmentEpsilon = 0.0005; #declare AdjustmentDamping = 0.95; #macro AdjustSpline(pos,vel,lock,dist) #declare ok = 1; #if (dimension_size(pos,1) != dimension_size(vel,1)) #declare ok = 0; #debug "Fatal Error, Position array and Velocity array have different number of elements.\nNo arrays are changed." #end #if (dimension_size(pos,1) != dimension_size(lock,1)) #declare ok = 0; #debug "Fatal Error, Position array and Lock array have different number of elements.\nNo arrays are changed." #end #if (dimension_size(vel,1) != dimension_size(lock,1)) #declare ok = 0; #debug "Fatal Error, Velocity array and Lock array have different number of elements.\nNo arrays are changed." #end #if (ok) #declare dist = abs(dist); #declare AdjustmentContinue = true; #declare Loop = 0; #while (AdjustmentContinue) //#debug concat("Loop ",str(Loop,3,0),".\n") #declare next = MakeVelocityPoints(pos) #declare EpsilonReached = true; #declare cnt = 0; #while ( cnt < dimension_size(pos,1)) #declare adj=<0,0,0>; #if (!lock[cnt]) #if ( cnt > 0) #declare adj = adj + vnormalize(pos[cnt]-pos[cnt-1])*(dist-vlength(pos[cnt-1]-pos[cnt]))*0.1; #declare EpsilonReached = (EpsilonReached & ((dist-vlength(pos[cnt-1]-pos[cnt]) )< AdjustmentEpsilon)); #end #if ( cnt+1 < dimension_size(pos,1)) #declare adj = adj + vnormalize(pos[cnt]-pos[cnt+1])*(dist-vlength(pos[cnt+1]-pos[cnt]))*0.1; #declare EpsilonReached = (EpsilonReached & ((dist-vlength(pos[cnt+1]-pos[cnt]) )< AdjustmentEpsilon)); #end #ifdef(vel[cnt]) #declare vel[cnt] = vel[cnt]*AdjustmentDamping+adj; #else #declare vel[cnt] = adj; #end #end #declare next[cnt] = pos[cnt] + vel[cnt]; #declare cnt = cnt + 1; #end #declare pos = next //PlotList(pos) #declare Loop = Loop + 1; #declare AdjustmentContinue = (AdjustmentContinue & (Loop < AdjustmentLoopMax)); #declare AdjustmentContinue = (AdjustmentContinue & !EpsilonReached); #end // while adjustmentcontinue #end // ok #debug concat("Used ",str(Loop,4,4)," loops.\n") #end // AdjustSpline // ------------------------------------------ // Code for testing /* #version 3.5; #include "colors.inc" #include "multispline.inc" global_settings { assumed_gamma 1.0 } // ---------------------------------------- camera { location <0.0, 0.5, -4.0> direction 1.5*z right x*image_width/image_height look_at <0.0, 0.0, 0.0> } background { rgb 1 } light_source { <-30, 30, -30> color rgb <1, 1, 1>} #declare list = array[5] { <-1,0,0>, <-0.5,0,0>, <0,0,0>, <0.5,0,0> <1,0,0> } #declare List = MakeLongSpline(list,1,1) #declare BezRad = 0.05; PlotList(list) //DrawLongSpline(List) #declare Locks = MakeLockPoints(list) //#debug concat(Locks[0] ? "true" : "false")) #declare Vels = MakeVelocityPoints(list) ListDistances(list) #declare Locks[0] = true; //#declare Locks[1] = true; #declare Count = 0; #while ( Count < 10) #declare list[0]= list[0] + <0.1,0.1,0>; AdjustSpline(list,Vels,Locks,0.5) PlotList(list) #declare Count = Count + 1; #end ListDistances(list) */