ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/g3vector.c
Revision: 2.2
Committed: Tue Aug 18 15:02:53 2015 UTC (8 years, 8 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad5R3, rad5R0, rad5R1, HEAD
Changes since 2.1: +3 -0 lines
Log Message:
Added RCCS id's to new source files (forgotten during initial check-in)

File Contents

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