156 |
|
|
157 |
|
|
158 |
|
int |
159 |
< |
getperpendicular( /* choose random perpedicular direction */ |
159 |
> |
getperpendicular( /* choose perpedicular direction */ |
160 |
|
FVECT vp, /* returns normalized */ |
161 |
< |
const FVECT v /* input vector must be normalized */ |
161 |
> |
const FVECT v, /* input vector must be normalized */ |
162 |
> |
int randomize /* randomize orientation */ |
163 |
|
) |
164 |
|
{ |
165 |
+ |
int ord[3]; |
166 |
|
FVECT v1; |
167 |
|
int i; |
168 |
< |
/* randomize other coordinates */ |
169 |
< |
v1[0] = 0.5 - frandom(); |
170 |
< |
v1[1] = 0.5 - frandom(); |
171 |
< |
v1[2] = 0.5 - frandom(); |
168 |
> |
|
169 |
> |
if (randomize) { /* randomize coordinates? */ |
170 |
> |
v1[0] = 0.5 - frandom(); |
171 |
> |
v1[1] = 0.5 - frandom(); |
172 |
> |
v1[2] = 0.5 - frandom(); |
173 |
> |
switch (ord[0] = (int)(frandom()*2.99999)) { |
174 |
> |
case 0: |
175 |
> |
ord[1] = 1 + (frandom() > .5); |
176 |
> |
ord[2] = 2 - ord[1]; |
177 |
> |
break; |
178 |
> |
case 1: |
179 |
> |
ord[1] = 2*(frandom() > .5); |
180 |
> |
ord[2] = 2 - ord[1]; |
181 |
> |
break; |
182 |
> |
case 2: |
183 |
> |
ord[1] = (frandom() > .5); |
184 |
> |
ord[2] = 1 - ord[1]; |
185 |
> |
break; |
186 |
> |
} |
187 |
> |
} else { |
188 |
> |
v1[0] = v1[1] = v1[2] = .0; |
189 |
> |
ord[0] = 0; ord[1] = 1; ord[2] = 2; |
190 |
> |
} |
191 |
> |
|
192 |
|
for (i = 3; i--; ) |
193 |
< |
if ((-0.6 < v[i]) & (v[i] < 0.6)) |
193 |
> |
if ((-0.6 < v[ord[i]]) & (v[ord[i]] < 0.6)) |
194 |
|
break; |
195 |
|
if (i < 0) |
196 |
|
return(0); |
197 |
< |
v1[i] = 1.0; |
197 |
> |
|
198 |
> |
v1[ord[i]] = 1.0; |
199 |
|
fcross(vp, v1, v); |
200 |
+ |
|
201 |
|
return(normalize(vp) > 0.0); |
202 |
|
} |
203 |
|
|