// Persistence of Vision Ray Tracer Scene Description File // File: scale_convert.inc // Vers: 3.6 // Desc: Scale_Convert() macro to convert any combination of "mm", "cm", "m", "km", "in", "ft", "mi". Expandable. // Refer to http://en.wikipedia.org/wiki/Conversion_of_units for more.... // Date: Dec 2006 // Auth: Charles Coyle #local Temp_Vers = version; #version 3.6; #ifdef(View_POV_Include_Stack) #debug "including scale_convert.inc\n" #end //Here for convienience: #ifndef(Range_Convert) //Returns "Value" where "Value" is between B_low and B_high //what A_posi is between A_low and A_high. //E.g. freezing and boiling temps: Range_Converter(25,0,100,32,212) returns: 77 (degrees F) //((25-0) *(212-32)/(100-0 )) + 32 = 77 //e.g. C to F // #macro Range_Convert(A_posi, A_low, A_high, B_low, B_high) ( ( (A_posi-A_low)*(B_high-B_low)/(A_high-A_low) ) + B_low ) #end // end macro Range_Converter #end //end #ifndef (Range_Convert) //Takes in a string describing a unit of length, e.g. yd. Returns a float value in terms of meters. // #macro Unit_Length_Conversion_Table(The_Unit) #switch(1) #case (strcmp(The_Unit, "mm") = 0 ) #local Scale_Factor = 0.001; #break //millimeter millimetre #case (strcmp(The_Unit, "cm") = 0 ) #local Scale_Factor = 0.01; #break //centimeter centimetre #case (strcmp(The_Unit, "m") = 0 ) #local Scale_Factor = 1; #break //meter metre #case (strcmp(The_Unit, "km") = 0 ) #local Scale_Factor = 1000; #break //kilometer kilometre #case (strcmp(The_Unit, "in") = 0 ) #local Scale_Factor = 0.0254; #break //inch #case (strcmp(The_Unit, "ft") = 0 ) #local Scale_Factor = 0.0254*12; #break //foot feet #case (strcmp(The_Unit, "yd") = 0 ) #local Scale_Factor = 0.0254*12*3; #break //yard #case (strcmp(The_Unit, "mi") = 0 ) #local Scale_Factor = 0.0254*12*5280; #break //mile //alternatives: #case (strcmp(The_Unit, "millimeter") = 0 ) #local Scale_Factor = 0.001; #break //millimeter millimetre #case (strcmp(The_Unit, "centimeter") = 0 ) #local Scale_Factor = 0.01; #break //centimeter centimetre #case (strcmp(The_Unit, "meter") = 0 ) #local Scale_Factor = 1; #break //meter metre #case (strcmp(The_Unit, "kilometer") = 0 ) #local Scale_Factor = 1000; #break //kilometer kilometre #case (strcmp(The_Unit, "inch") = 0 ) #local Scale_Factor = 0.0254; #break //inch #case (strcmp(The_Unit, "foot") = 0 ) #local Scale_Factor = 0.0254*12; #break //foot feet #case (strcmp(The_Unit, "yard") = 0 ) #local Scale_Factor = 0.0254*12*3; #break //yard #case (strcmp(The_Unit, "mile") = 0 ) #local Scale_Factor = 0.0254*12*5280; #break //mile //more alternatives: #case (strcmp(The_Unit, "millimetre") = 0 ) #local Scale_Factor = 0.001; #break //millimeter millimetre #case (strcmp(The_Unit, "centimetre") = 0 ) #local Scale_Factor = 0.01; #break //centimeter centimetre #case (strcmp(The_Unit, "metre") = 0 ) #local Scale_Factor = 1; #break //meter metre #case (strcmp(The_Unit, "kilometre") = 0 ) #local Scale_Factor = 1000; #break //kilometer kilometre #case (strcmp(The_Unit, "inch") = 0 ) #local Scale_Factor = 0.0254; #break //inch #case (strcmp(The_Unit, "feet") = 0 ) #local Scale_Factor = 0.0254*12; #break //foot feet //#case (strcmp(The_Unit, "yards") = 0 ) #local Scale_Factor = 0.0254*12*3; #break //yard //#case (strcmp(The_Unit, "miles") = 0 ) #local Scale_Factor = 0.0254*12*5280; #break //mile // #case (strcmp(The_Unit, "fathom") = 0 ) #local Scale_Factor = 0.0254*12*6; #break #case (strcmp(The_Unit, "league") = 0 ) #local Scale_Factor = 0.0254*12*5280*3; #break #case (strcmp(The_Unit, "furlong") = 0 ) #local Scale_Factor = 0.0254*12*660; #break #case (strcmp(The_Unit, "rope") = 0 ) #local Scale_Factor = 0.0254*12*20; #break #case (strcmp(The_Unit, "palm") = 0 ) #local Scale_Factor = 0.0254*3; #break #case (strcmp(The_Unit, "hand") = 0 ) #local Scale_Factor = 0.0254*4; #break #case (strcmp(The_Unit, "span") = 0 ) #local Scale_Factor = 0.0254*6; #break #case (strcmp(The_Unit, "span(cloth)") = 0 ) #local Scale_Factor = 0.0254*12*9; #break #case (strcmp(The_Unit, "nail(cloth)") = 0 ) #local Scale_Factor = 0.0254*12*2.25; #break #case (strcmp(The_Unit, "pace") = 0 ) #local Scale_Factor = 0.0254*12*2.5; #break #case (strcmp(The_Unit, "rod") = 0 ) #local Scale_Factor = 0.0254*12*16.5; #break //rod = pole = perch #case (strcmp(The_Unit, "pole") = 0 ) #local Scale_Factor = 0.0254*12*16.5; #break //rod = pole = perch #case (strcmp(The_Unit, "perch") = 0 ) #local Scale_Factor = 0.0254*12*16.5; #break //rod = pole = perch #case (strcmp(The_Unit, "stick") = 0 ) #local Scale_Factor = 0.0254*2; #break #case (strcmp(The_Unit, "telegraph mile") = 0 ) #local Scale_Factor = 0.0254*12*6087; #break #case (strcmp(The_Unit, "mil") = 0 ) #local Scale_Factor = 0.0254 * 1/1000; #break // // // #else #error "Scale_Convert() has recieved one or more invalid string parameters.\n" #end //end #switch(1) // Scale_Factor #end //end #macro Unit_Conversion_Table(The_Unit) //Automatically converts scale from one unit type to another. //Takes two string parameters which must be any two of the following: //"mm", "cm", "m", "km", "in", "ft", "mi" Others can be added. //Returns a "scale " statement for use in an #object{} //Usage, E.g. Scale_Convert("cm","m") is equivalent to scale 1/100. // #macro Scale_Convert(From_Unit,To_Unit) #local SC_Factor_A = Unit_Length_Conversion_Table(From_Unit); #local SC_Factor_B = Unit_Length_Conversion_Table(To_Unit); #local SC_Scaler = Range_Convert(1, 0,SC_Factor_B, 0, SC_Factor_A); //Convert 1 Unit = From_Unit to To_Unit. SC_Scaler //returns this for use in an object{} // //#debug concat("\n********************** Scaling by ", str(SC_Scaler,5,8), ". *************************\n" ) #end //end #macro Scale_Convert(From_Unit,To_Unit) //To test, comment out the "scale SC_Scaler" line in the macro, and un-comment the #debug line and: //Scale_Convert("in","cm") #version Temp_Vers; // Restore previous version