ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/g3vector.c
Revision: 2.1
Committed: Wed Aug 12 23:07:59 2015 UTC (8 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Added Jan Wienold's evalglare to distribution

File Contents

# User Rev Content
1 greg 2.1 #include <stdlib.h>
2     #include <stdio.h>
3     #include <string.h>
4    
5     #include "g3vector.h"
6    
7    
8    
9     g3Vec g3v_create()
10     {
11     return ((g3Vec) calloc(3,sizeof(g3Float)));
12     }
13    
14     void g3v_free(g3Vec v)
15     {
16     if (v) {
17     free(v);
18     v = NULL;
19     }
20     }
21    
22     g3Vec g3v_copy(g3Vec dest,g3Vec src)
23     {
24     if (dest == src)
25     return dest;
26     memcpy(dest,src,(3*sizeof(g3Float)));
27     return dest;
28     }
29    
30     g3Vec g3v_zero(g3Vec v)
31     {
32     memset(v,0,3*sizeof(g3Float));
33     return v;
34     }
35    
36     g3Vec g3v_set(g3Vec v,g3Float x,g3Float y,g3Float z)
37     {
38     v[0] = x;
39     v[1] = y;
40     v[2] = z;
41     return v;
42     }
43    
44     g3Vec g3v_sane(g3Vec v)
45     {
46     int i;
47     for(i=0;i<3;i++)
48     if (gb_epseq(v[i],0.0))
49     v[i] = 0.0;
50     return v;
51     }
52    
53     g3Vec g3v_fromrad(g3Vec v,FVECT rv)
54     {
55     int i;
56    
57     for(i=0;i<3;i++)
58     v[i] = rv[i];
59     return v;
60     }
61    
62     void g3v_torad(FVECT rv,g3Vec v)
63     {
64     int i;
65    
66     for(i=0;i<3;i++)
67     rv[i] = v[i];
68     }
69    
70     int g3v_epszero(g3Vec v)
71     {
72     int i;
73    
74     for(i=0;i<3;i++)
75     if (!gb_epseq(v[i],0))
76     return 0;
77     return 1;
78     }
79    
80     int g3v_epsorder(g3Vec v1,g3Vec v2)
81     {
82     int i;
83     int res;
84    
85     for(i=0;i<3;i++)
86     if ((res = gb_epsorder(v1[i],v2[i])))
87     return res;
88     return 0;
89     }
90    
91     int g3v_epseq(g3Vec v1,g3Vec v2)
92     {
93     return (g3v_epsorder(v1,v2) == 0);
94     }
95    
96     g3Float g3v_dot(g3Vec v1,g3Vec v2)
97     {
98     int i;
99     g3Float res = 0.0;
100    
101     for(i=0;i<3;i++)
102     res += v1[i]*v2[i];
103     return res;
104     }
105    
106    
107     g3Float g3v_length(g3Vec v)
108     {
109     return sqrt(g3v_dot(v,v));
110     }
111    
112     g3Vec g3v_normalize(g3Vec v)
113     {
114     int i;
115     g3Float len = g3v_length(v);
116    
117     if (gb_epseq(len,0))
118     return NULL;
119     for(i=0;i<3;i++)
120     v[i] /= len;
121     return v;
122     }
123    
124     g3Vec g3v_cross(g3Vec res,g3Vec v1,g3Vec v2)
125     {
126     g3Vec h = NULL;
127     if ((res == v1) || (res == v2))
128     h = g3v_create();
129     else
130     h = res;
131     h[0] = v1[1]*v2[2] - v1[2]*v2[1];
132     h[1] = v1[2]*v2[0] - v1[0]*v2[2];
133     h[2] = v1[0]*v2[1] - v1[1]*v2[0];
134     if (h != res) {
135     g3v_copy(res,h);
136     g3v_free(h);
137     }
138     return res;
139     }
140    
141     g3Vec g3v_sub(g3Vec res,g3Vec v1,g3Vec v2)
142     {
143     int i;
144    
145     for(i=0;i<3;i++)
146     res[i] = v1[i] - v2[i];
147     return res;
148     }
149    
150     g3Vec g3v_add(g3Vec res,g3Vec v1,g3Vec v2)
151     {
152     int i;
153    
154     for(i=0;i<3;i++)
155     res[i] = v1[i] + v2[i];
156     return res;
157     }
158    
159     g3Vec g3v_scale(g3Vec res,g3Vec v,g3Float sc)
160     {
161     int i;
162    
163     for(i=0;i<3;i++)
164     res[i] = v[i] * sc;
165     return res;
166     }
167    
168     g3Vec g3v_rotate(g3Vec res,g3Vec v,g3Vec rnorm,g3Float ang)
169     {
170     g3Vec c1;
171     int copy = 0;
172    
173     if (res == v) {
174     res = g3v_create();
175     copy = 1;
176     }
177     ang = -ang;
178     c1 = g3v_create();
179     g3v_scale(res,v,cos(ang));
180     g3v_add(res,res,g3v_scale(c1,rnorm,g3v_dot(rnorm,v)*(1 - cos(ang))));
181     g3v_add(res,res,g3v_scale(c1,g3v_cross(c1,v,rnorm),sin(ang)));
182     g3v_free(c1);
183     if (copy) {
184     g3v_copy(v,res);
185     g3v_free(res);
186     res = v;
187     }
188     return res;
189     }
190    
191     g3Vec g3v_print(g3Vec v,FILE* fp)
192     {
193     int i;
194    
195     for(i=0;i<3;i++)
196     fprintf(fp,"%f ",v[i]);
197     return v;
198     }
199    
200     int g3v_read(g3Vec v,FILE* fp)
201     {
202     char st[100];
203    
204     if (!fgets(st,99,fp))
205     return 0;
206     #if USE_DOUBLE
207     if (sscanf(st,"%lf %lf %lf",&(v[0]),&(v[1]),&(v[2])) != 3)
208     return 0;
209     #else
210     if (sscanf(st,"%f %f %f",&(v[0]),&(v[1]),&(v[2])) != 3)
211     return 0;
212     #endif
213     return 1;
214     }
215    
216     #ifdef VEC_TEST
217    
218     int main(int argc,char** argv)
219     {
220     g3Vec a,b;
221     char st[100];
222    
223     a = g3v_create();
224     b = g3v_create();
225     g3v_set(b,atof(argv[1]),atof(argv[2]),atof(argv[3]));
226     while (fgets(st,99,stdin)) {
227     sscanf(st,"%lf %lf %lf",a,(a+1),(a+2));
228     g3v_rotate(a,a,b,DEG2RAD(atof(argv[4])));
229     g3v_print(a,stdout);
230     }
231     return EXIT_SUCCESS;
232     }
233    
234     #endif