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