--- ray/src/cv/lampcolor.c 1991/09/05 15:09:08 1.2 +++ ray/src/cv/lampcolor.c 1991/11/12 17:02:10 2.1 @@ -10,6 +10,8 @@ static char SCCSid[] = "$SunId$ LBL"; #include +#include "color.h" + #define PI 3.14159265358979323846 extern char *gets(), *strcpy(); @@ -27,7 +29,7 @@ int typecheck(), unitcheck(), geomcheck(), outpcheck() float *lampcolor; /* the lamp color (RGB) */ double unit2meter; /* conversion from units to meters */ -double projarea; /* projected area for this geometry */ +double area; /* radiating area for this geometry */ double lumens; /* total lamp lumens */ struct { @@ -49,7 +51,7 @@ or \"ring\". These may be abbreviated as a single let { "total lamp lumens", "0", outpcheck, "This is the overall light output of the lamp and its fixture. If you do\n\ not know this value explicitly, you can compute the approximate lumens\n\ -by multiplying the input wattage by 15 for incandescent fixtures or 40\n\ +by multiplying the input wattage by 14 for incandescent fixtures or 70\n\ for fluorescent fixtures." }, }; @@ -173,7 +175,7 @@ compute() /* compute lamp radiance */ { double whiteval; - whiteval = lumens/470./projarea; + whiteval = lumens/area/(WHTEFFICACY*PI); printf("Lamp color (RGB) = %f %f %f\n", lampcolor[0]*whiteval, @@ -182,13 +184,20 @@ compute() /* compute lamp radiance */ } -getd(dp) /* get a positive double from stdin */ +getd(name, dp, help) /* get a positive double from stdin */ +char *name; double *dp; +char *help; { char buf[32]; - +again: + printf("%s [%g]: ", name, *dp); if (gets(buf) == NULL) return(0); + if (buf[0] == '?') { + puts(help); + goto again; + } if ((buf[0] < '0' || buf[0] > '9') && buf[0] != '.') return(0); *dp = atof(buf); @@ -198,53 +207,46 @@ double *dp; getpolygon() /* get projected area for a polygon */ { - printf("Enter area of polygon: "); - if (!getd(&projarea)) - return(0); - projarea *= unit2meter*unit2meter; - projarea *= PI; + static double parea = 1.0; + + getd("Polygon area", &parea, + "Enter the total radiating area of the polygon."); + area = unit2meter*unit2meter * parea; return(1); } getsphere() /* get projected area for a sphere */ { - double radius; + static double radius = 1.0; - printf("Enter sphere radius: "); - if (!getd(&radius)) - return(0); - radius *= unit2meter; - projarea = 4.*PI*PI*radius*radius; + getd("Sphere radius", &radius, + "Enter the distance from the sphere's center to its surface."); + area = 4.*PI*unit2meter*unit2meter * radius*radius; return(1); } getcylinder() /* get projected area for a cylinder */ { - double length, radius; + static double length = 1.0, radius = 0.1; - printf("Enter cylinder length: "); - if (!getd(&length)) - return(0); - length *= unit2meter; - printf("Enter cylinder radius: "); - if (!getd(&radius)) - return(0); - radius *= unit2meter; - projarea = PI*PI*2.*PI*radius*length; + getd("Cylinder length", &length, + "Enter the length of the cylinder."); + getd("Cylinder radius", &radius, + "Enter the distance from the cylinder's axis to its surface."); + area = 2.*PI*unit2meter*unit2meter * radius*length; return(1); } getring() /* get projected area for a ring */ { - double radius; + static double radius = 1.0; - printf("Enter disk radius: "); - if (!getd(&radius)) - return(0); - radius *= unit2meter; - projarea = PI*PI*radius*radius; + getd("Disk radius", &radius, +"Enter the distance from the ring's center to its outer edge.\n\ +The inner radius must be zero."); + area = PI*unit2meter*unit2meter * radius*radius; return(1); }