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

# Content
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