ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/lampcolor.c
Revision: 2.11
Committed: Sat Dec 28 18:05:14 2019 UTC (4 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R3, HEAD
Changes since 2.10: +1 -3 lines
Log Message:
Removed redundant include files

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.11 static const char RCSid[] = "$Id: lampcolor.c,v 2.10 2004/03/18 05:22:00 greg Exp $";
3 greg 1.1 #endif
4     /*
5 greg 1.2 * Program to convert lamp color from table and compute radiance.
6 greg 1.1 */
7    
8 greg 2.4 #include <math.h>
9    
10 schorsch 2.9 #include "rtmath.h"
11     #include "rtio.h"
12 greg 1.8 #include "color.h"
13 greg 1.2
14     /* lamp parameters */
15     #define LTYPE 0
16     #define LUNIT 1
17     #define LGEOM 2
18     #define LOUTP 3
19     #define NPARAMS 4
20 greg 1.1
21 schorsch 2.7 static int typecheck(char *s);
22     static int unitcheck(char *s);
23     static int geomcheck(char *s);
24     static int outpcheck(char *s);
25     static void compute(void);
26     static int getpolygon(void), getsphere(void), getcylinder(void), getring(void);
27 schorsch 2.9 static int getd(char *name, double *dp, char *help);
28 schorsch 2.7
29 greg 1.2
30     float *lampcolor; /* the lamp color (RGB) */
31     double unit2meter; /* conversion from units to meters */
32 greg 1.7 double area; /* radiating area for this geometry */
33 greg 1.2 double lumens; /* total lamp lumens */
34    
35     struct {
36     char *name;
37     char value[64];
38     int (*check)();
39     char *help;
40     } param[NPARAMS] = {
41 saba 2.5 { "lamp type", "WHITE", typecheck,
42 greg 1.2 "The lamp type is a string which corresponds to one of the types registered\n\
43 saba 2.5 in the lamp table file. A value of \"WHITE\" means an uncolored source,\n\
44 greg 1.2 which may be preferable because it results in a color balanced image." },
45     { "length unit", "meter", unitcheck,
46     "Unit must be one of: \"meter\", \"centimeter\", \"foot\", or \"inch\".\n\
47     These may be abbreviated as a single letter." },
48     { "lamp geometry", "polygon", geomcheck,
49     "The lamp geometry must be one of: \"polygon\", \"sphere\", \"cylinder\"\n\
50     or \"ring\". These may be abbreviated as a single letter." },
51     { "total lamp lumens", "0", outpcheck,
52     "This is the overall light output of the lamp and its fixture. If you do\n\
53     not know this value explicitly, you can compute the approximate lumens\n\
54 greg 1.3 by multiplying the input wattage by 14 for incandescent fixtures or 70\n\
55 greg 1.2 for fluorescent fixtures." },
56     };
57    
58    
59 schorsch 2.9 int
60     main(
61     int argc,
62     char *argv[]
63     )
64 greg 1.1 {
65     char *lamptab = "lamp.tab";
66 greg 1.2 char buf[64];
67     int i;
68 greg 1.1
69     if (argc > 1) lamptab = argv[1];
70     if (loadlamps(lamptab) == 0) {
71 greg 1.2 fprintf(stderr, "%s: no such lamp table\n", lamptab);
72 greg 1.1 exit(1);
73     }
74 greg 1.2 printf("Program to compute lamp radiance. Enter '?' for help.\n");
75 greg 1.1 for ( ; ; ) {
76 greg 1.2 i = 0;
77     while (i < NPARAMS) {
78     printf("Enter %s [%s]: ", param[i].name,
79     param[i].value);
80 greg 2.10 if (fgetline(buf, sizeof(buf), stdin) == NULL)
81 greg 1.2 exit(0);
82     if (buf[0] == '?') {
83     puts(param[i].help);
84     continue;
85     }
86     if (buf[0])
87     strcpy(param[i].value, buf);
88     if (!(*param[i].check)(param[i].value)) {
89     fprintf(stderr, "%s: bad value for %s\n",
90     param[i].value, param[i].name);
91     continue;
92     }
93     i++;
94     }
95     compute();
96 greg 1.1 }
97 greg 1.2 }
98    
99    
100 schorsch 2.7 static int
101     typecheck( /* check lamp type */
102 schorsch 2.9 char *s
103 schorsch 2.7 )
104 greg 1.2 {
105     lampcolor = matchlamp(s);
106     return(lampcolor != NULL);
107     }
108    
109    
110 schorsch 2.7 static int
111     unitcheck( /* compute conversion to meters */
112 schorsch 2.9 char *s
113 schorsch 2.7 )
114 greg 1.2 {
115     int len = strlen(s);
116    
117     switch (*s) {
118     case 'm':
119     if (strncmp(s, "meters", len))
120     return(0);
121     unit2meter = 1.0;
122     return(1);
123     case 'c':
124     if (strncmp(s, "centimeters", len) && strncmp(s, "cms", len))
125     return(0);
126     unit2meter = 0.01;
127     return(1);
128     case 'f':
129     if (strncmp(s, "foot", len) && strncmp(s, "feet", len))
130     return(0);
131     unit2meter = 0.3048;
132     return(1);
133     case 'i':
134     if (strncmp(s, "inches", len))
135     return(0);
136     unit2meter = 0.0254;
137     return(1);
138     }
139     return(0);
140     }
141    
142    
143 schorsch 2.7 static int
144     geomcheck( /* check/set lamp geometry */
145 schorsch 2.9 char *s
146 schorsch 2.7 )
147 greg 1.2 {
148     int len = strlen(s);
149    
150     switch (*s) {
151     case 'p':
152     if (strncmp(s, "polygonal", len))
153     return(0);
154     return(getpolygon());
155     case 's':
156     if (strncmp(s, "sphere", len) && strncmp(s, "spherical", len))
157     return(0);
158     return(getsphere());
159     case 'c':
160     if (strncmp(s,"cylinder",len) && strncmp(s,"cylindrical",len))
161     return(0);
162     return(getcylinder());
163     case 'r':
164     if (strncmp(s, "ring", len) && strncmp(s, "disk", len))
165     return(0);
166     return(getring());
167     }
168     return(0);
169     }
170    
171    
172 schorsch 2.7 static int
173     outpcheck( /* check lumen output value */
174 schorsch 2.9 register char *s
175 schorsch 2.7 )
176 greg 1.2 {
177     if ((*s < '0' || *s > '9') && *s != '.')
178     return(0);
179     lumens = atof(s);
180     return(1);
181     }
182    
183    
184 schorsch 2.7 static void
185     compute(void) /* compute lamp radiance */
186 greg 1.2 {
187     double whiteval;
188    
189 greg 1.8 whiteval = lumens/area/(WHTEFFICACY*PI);
190 greg 1.2
191     printf("Lamp color (RGB) = %f %f %f\n",
192     lampcolor[0]*whiteval,
193     lampcolor[1]*whiteval,
194     lampcolor[2]*whiteval);
195     }
196    
197    
198 schorsch 2.9 static int
199     getd( /* get a positive double from stdin */
200     char *name,
201     double *dp,
202     char *help
203     )
204 greg 1.2 {
205     char buf[32];
206 greg 1.6 again:
207     printf("%s [%g]: ", name, *dp);
208 schorsch 2.9 if (fgets(buf, sizeof(buf), stdin) == NULL)
209 greg 1.2 return(0);
210 greg 1.6 if (buf[0] == '?') {
211     puts(help);
212     goto again;
213     }
214 greg 1.2 if ((buf[0] < '0' || buf[0] > '9') && buf[0] != '.')
215     return(0);
216     *dp = atof(buf);
217     return(1);
218     }
219    
220    
221 schorsch 2.7 static int
222     getpolygon(void) /* get projected area for a polygon */
223 greg 1.2 {
224 greg 1.9 static double parea = 1.0;
225 greg 1.5
226 greg 1.9 getd("Polygon area", &parea,
227 greg 1.6 "Enter the total radiating area of the polygon.");
228 greg 1.9 area = unit2meter*unit2meter * parea;
229 greg 1.2 return(1);
230     }
231    
232    
233 schorsch 2.7 static int
234     getsphere(void) /* get projected area for a sphere */
235 greg 1.2 {
236 greg 1.5 static double radius = 1.0;
237 greg 1.2
238 greg 1.6 getd("Sphere radius", &radius,
239     "Enter the distance from the sphere's center to its surface.");
240 greg 1.7 area = 4.*PI*unit2meter*unit2meter * radius*radius;
241 greg 1.2 return(1);
242     }
243    
244    
245 schorsch 2.7 static int
246     getcylinder(void) /* get projected area for a cylinder */
247 greg 1.2 {
248 greg 1.5 static double length = 1.0, radius = 0.1;
249 greg 1.2
250 greg 1.6 getd("Cylinder length", &length,
251     "Enter the length of the cylinder.");
252     getd("Cylinder radius", &radius,
253     "Enter the distance from the cylinder's axis to its surface.");
254 greg 1.7 area = 2.*PI*unit2meter*unit2meter * radius*length;
255 greg 1.2 return(1);
256     }
257    
258    
259 schorsch 2.7 static int
260     getring(void) /* get projected area for a ring */
261 greg 1.2 {
262 greg 1.5 static double radius = 1.0;
263 greg 1.2
264 greg 1.6 getd("Disk radius", &radius,
265     "Enter the distance from the ring's center to its outer edge.\n\
266     The inner radius must be zero.");
267 greg 1.7 area = PI*unit2meter*unit2meter * radius*radius;
268 greg 1.2 return(1);
269 greg 1.1 }