--- ray/src/cv/lampcolor.c 1991/09/12 13:26:16 1.5 +++ ray/src/cv/lampcolor.c 1991/10/24 12:17:38 1.8 @@ -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 { @@ -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); @@ -200,9 +209,9 @@ getpolygon() /* get projected area for a polygon */ { static double area = 1.0; - printf("Polygon area [%g]: ", area); - getd(&area); - projarea = PI*unit2meter*unit2meter * area; + getd("Polygon area", &area, + "Enter the total radiating area of the polygon."); + area = unit2meter*unit2meter * area; return(1); } @@ -211,9 +220,9 @@ getsphere() /* get projected area for a sphere */ { static double radius = 1.0; - printf("Sphere radius [%g]: ", radius); - getd(&radius); - projarea = 4.*PI*PI*unit2meter*unit2meter * 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); } @@ -222,11 +231,11 @@ getcylinder() /* get projected area for a cylinder * { static double length = 1.0, radius = 0.1; - printf("Cylinder length [%g]: ", length); - getd(&length); - printf("Cylinder radius [%g]: ", radius); - getd(&radius); - projarea = PI*PI*2.*PI*unit2meter*unit2meter * 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); } @@ -235,8 +244,9 @@ getring() /* get projected area for a ring */ { static double radius = 1.0; - printf("Disk radius [%g]: ", radius); - getd(&radius); - projarea = PI*PI*unit2meter*unit2meter * 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); }