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 ((int)(frandom()*5.99999)) { |
174 |
> |
case 0: ord[0] = 0; ord[1] = 1; ord[2] = 2; break; |
175 |
> |
case 1: ord[0] = 0; ord[1] = 2; ord[2] = 1; break; |
176 |
> |
case 2: ord[0] = 1; ord[1] = 0; ord[2] = 2; break; |
177 |
> |
case 3: ord[0] = 1; ord[1] = 2; ord[2] = 0; break; |
178 |
> |
case 4: ord[0] = 2; ord[1] = 0; ord[2] = 1; break; |
179 |
> |
case 5: ord[0] = 2; ord[1] = 1; ord[2] = 0; break; |
180 |
> |
} |
181 |
> |
} else { |
182 |
> |
v1[0] = v1[1] = v1[2] = 0.0; |
183 |
> |
ord[0] = 0; ord[1] = 1; ord[2] = 2; |
184 |
> |
} |
185 |
> |
|
186 |
|
for (i = 3; i--; ) |
187 |
< |
if ((-0.6 < v[i]) & (v[i] < 0.6)) |
187 |
> |
if ((-0.6 < v[ord[i]]) & (v[ord[i]] < 0.6)) |
188 |
|
break; |
189 |
|
if (i < 0) |
190 |
|
return(0); |
191 |
< |
v1[i] = 1.0; |
191 |
> |
|
192 |
> |
v1[ord[i]] = 1.0; |
193 |
|
fcross(vp, v1, v); |
194 |
+ |
|
195 |
|
return(normalize(vp) > 0.0); |
196 |
|
} |
197 |
|
|