27 |
|
{ |
28 |
|
return(EQUAL(v1[0],v2[0]) && EQUAL(v1[1],v2[1])&& EQUAL(v1[2],v2[2])); |
29 |
|
} |
30 |
+ |
#if 0 |
31 |
+ |
extern FVECT Norm[500]; |
32 |
+ |
extern int Ncnt; |
33 |
+ |
#endif |
34 |
|
|
31 |
– |
|
35 |
|
int |
36 |
|
convex_angle(v0,v1,v2) |
37 |
|
FVECT v0,v1,v2; |
38 |
|
{ |
39 |
|
FVECT cp,cp01,cp12,v10,v02; |
40 |
|
double dp; |
41 |
< |
/* |
42 |
< |
VSUB(v10,v1,v0); |
40 |
< |
VSUB(v02,v0,v2); |
41 |
< |
VCROSS(cp,v10,v02); |
42 |
< |
*/ |
43 |
< |
/* test sign of (v0Xv1)X(v1Xv2). v1 */ |
41 |
> |
|
42 |
> |
/* test sign of (v0Xv1)X(v1Xv2). v1 */ |
43 |
|
VCROSS(cp01,v0,v1); |
44 |
|
VCROSS(cp12,v1,v2); |
45 |
|
VCROSS(cp,cp01,cp12); |
46 |
|
|
47 |
|
dp = DOT(cp,v1); |
48 |
+ |
#if 0 |
49 |
+ |
VCOPY(Norm[Ncnt++],cp01); |
50 |
+ |
VCOPY(Norm[Ncnt++],cp12); |
51 |
+ |
VCOPY(Norm[Ncnt++],cp); |
52 |
+ |
#endif |
53 |
|
if(ZERO(dp) || dp < 0.0) |
54 |
< |
return(FALSE); |
54 |
> |
return(FALSE); |
55 |
|
return(TRUE); |
56 |
|
} |
57 |
|
|
58 |
|
/* calculates the normal of a face contour using Newell's formula. e |
59 |
|
|
60 |
< |
a = SUMi (yi - yi+1)(zi + zi+1) |
60 |
> |
a = SUMi (yi - yi+1)(zi + zi+1)smMesh->samples->max_samp+4); |
61 |
|
b = SUMi (zi - zi+1)(xi + xi+1) |
62 |
|
c = SUMi (xi - xi+1)(yi + yi+1) |
63 |
|
*/ |
82 |
|
|
83 |
|
if(!norm) |
84 |
|
return(0); |
81 |
– |
|
85 |
|
|
86 |
|
mag = normalize(n); |
87 |
|
|
182 |
|
double *pd; |
183 |
|
FVECT r; |
184 |
|
{ |
185 |
< |
double t; |
185 |
> |
double t,d; |
186 |
|
int hit; |
187 |
|
/* |
188 |
|
Plane is Ax + By + Cz +D = 0: |
193 |
|
line is l = p1 + (p2-p1)t |
194 |
|
*/ |
195 |
|
/* Solve for t: */ |
196 |
< |
t = -(DOT(FP_N(peq),orig) + FP_D(peq))/(DOT(FP_N(peq),dir)); |
197 |
< |
if(t < 0) |
196 |
> |
d = DOT(FP_N(peq),dir); |
197 |
> |
if(ZERO(d)) |
198 |
> |
return(0); |
199 |
> |
t = -(DOT(FP_N(peq),orig) + FP_D(peq))/d; |
200 |
> |
|
201 |
> |
if(t < 0) |
202 |
|
hit = 0; |
203 |
|
else |
204 |
|
hit = 1; |
219 |
|
double *pd; |
220 |
|
FVECT r; |
221 |
|
{ |
222 |
< |
double t; |
222 |
> |
double t,d; |
223 |
|
int hit; |
224 |
|
/* |
225 |
|
Plane is Ax + By + Cz +D = 0: |
230 |
|
line is l = p1 + (p2-p1)t |
231 |
|
*/ |
232 |
|
/* Solve for t: */ |
233 |
< |
t = -(DOT(n,orig))/(DOT(n,dir)); |
233 |
> |
d= DOT(n,dir); |
234 |
> |
if(ZERO(d)) |
235 |
> |
return(0); |
236 |
> |
t = -(DOT(n,orig))/d; |
237 |
|
if(t < 0) |
238 |
|
hit = 0; |
239 |
|
else |
296 |
|
that plane and do an in-circle test in the plane |
297 |
|
*/ |
298 |
|
|
299 |
< |
/* find the equation of the plane defined by p1-p3 */ |
299 |
> |
/* find the equation of the plane defined by p0-p2 */ |
300 |
|
tri_plane_equation(p0,p1,p2,&peq,FALSE); |
301 |
|
|
302 |
|
/* define a coordinate system on the plane: the x axis is in |
308 |
|
if(!intersect_vector_plane(p,peq,NULL,np)) |
309 |
|
return(FALSE); |
310 |
|
|
311 |
< |
/* create coordinate system on plane: p2-p1 defines the x_axis*/ |
311 |
> |
/* create coordinate system on plane: p1-p0 defines the x_axis*/ |
312 |
|
VSUB(x_axis,p1,p0); |
313 |
|
normalize(x_axis); |
314 |
|
/* The y axis is */ |
348 |
|
/* Find the normal to the triangle ORIGIN:v0:v1 */ |
349 |
|
if(!NTH_BIT(*nset,0)) |
350 |
|
{ |
351 |
< |
VCROSS(n[0],v1,v0); |
351 |
> |
VCROSS(n[0],v0,v1); |
352 |
|
SET_NTH_BIT(*nset,0); |
353 |
|
} |
354 |
|
/* Test the point for sidedness */ |
366 |
|
/* Test next edge */ |
367 |
|
if(!NTH_BIT(*nset,1)) |
368 |
|
{ |
369 |
< |
VCROSS(n[1],v2,v1); |
369 |
> |
VCROSS(n[1],v1,v2); |
370 |
|
SET_NTH_BIT(*nset,1); |
371 |
|
} |
372 |
|
/* Test the point for sidedness */ |
382 |
|
/* Test next edge */ |
383 |
|
if(!NTH_BIT(*nset,2)) |
384 |
|
{ |
385 |
< |
VCROSS(n[2],v0,v2); |
385 |
> |
VCROSS(n[2],v2,v0); |
386 |
|
SET_NTH_BIT(*nset,2); |
387 |
|
} |
388 |
|
/* Test the point for sidedness */ |
408 |
|
double d; |
409 |
|
FVECT n; |
410 |
|
|
411 |
< |
VCROSS(n,v1,v0); |
411 |
> |
VCROSS(n,v0,v1); |
412 |
|
/* Test the point for sidedness */ |
413 |
|
d = DOT(n,p); |
414 |
|
if(d > 0.0) |
415 |
|
return(FALSE); |
416 |
|
|
417 |
|
/* Test next edge */ |
418 |
< |
VCROSS(n,v2,v1); |
418 |
> |
VCROSS(n,v1,v2); |
419 |
|
/* Test the point for sidedness */ |
420 |
|
d = DOT(n,p); |
421 |
|
if(d > 0.0) |
422 |
|
return(FALSE); |
423 |
|
|
424 |
|
/* Test next edge */ |
425 |
< |
VCROSS(n,v0,v2); |
425 |
> |
VCROSS(n,v2,v0); |
426 |
|
/* Test the point for sidedness */ |
427 |
|
d = DOT(n,p); |
428 |
|
if(d > 0.0) |
516 |
|
if(sides[0][0] == GT_INVALID) |
517 |
|
{ |
518 |
|
if(!NTH_BIT(nset,0)) |
519 |
< |
VCROSS(n[0],t1,t0); |
519 |
> |
VCROSS(n[0],t0,t1); |
520 |
|
/* Test the point for sidedness */ |
521 |
|
d = DOT(n[0],p0); |
522 |
|
if(d >= 0.0) |
529 |
|
if(sides[0][1] == GT_INVALID) |
530 |
|
{ |
531 |
|
if(!NTH_BIT(nset,1)) |
532 |
< |
VCROSS(n[1],t2,t1); |
532 |
> |
VCROSS(n[1],t1,t2); |
533 |
|
/* Test the point for sidedness */ |
534 |
|
d = DOT(n[1],p0); |
535 |
|
if(d >= 0.0) |
542 |
|
if(sides[0][2] == GT_INVALID) |
543 |
|
{ |
544 |
|
if(!NTH_BIT(nset,2)) |
545 |
< |
VCROSS(n[2],t0,t2); |
545 |
> |
VCROSS(n[2],t2,t0); |
546 |
|
/* Test the point for sidedness */ |
547 |
|
d = DOT(n[2],p0); |
548 |
|
if(d >= 0.0) |
558 |
|
if(sides[1][0] == GT_INVALID) |
559 |
|
{ |
560 |
|
if(!NTH_BIT(nset,0)) |
561 |
< |
VCROSS(n[0],t1,t0); |
561 |
> |
VCROSS(n[0],t0,t1); |
562 |
|
/* Test the point for sidedness */ |
563 |
|
d = DOT(n[0],p1); |
564 |
|
if(d >= 0.0) |
572 |
|
if(sides[1][1] == GT_INVALID) |
573 |
|
{ |
574 |
|
if(!NTH_BIT(nset,1)) |
575 |
< |
VCROSS(n[1],t2,t1); |
575 |
> |
VCROSS(n[1],t1,t2); |
576 |
|
/* Test the point for sidedness */ |
577 |
|
d = DOT(n[1],p1); |
578 |
|
if(d >= 0.0) |
586 |
|
if(sides[1][2] == GT_INVALID) |
587 |
|
{ |
588 |
|
if(!NTH_BIT(nset,2)) |
589 |
< |
VCROSS(n[2],t0,t2); |
589 |
> |
VCROSS(n[2],t2,t0); |
590 |
|
/* Test the point for sidedness */ |
591 |
|
d = DOT(n[2],p1); |
592 |
|
if(d >= 0.0) |
602 |
|
if(sides[2][0] == GT_INVALID) |
603 |
|
{ |
604 |
|
if(!NTH_BIT(nset,0)) |
605 |
< |
VCROSS(n[0],t1,t0); |
605 |
> |
VCROSS(n[0],t0,t1); |
606 |
|
/* Test the point for sidedness */ |
607 |
|
d = DOT(n[0],p2); |
608 |
|
if(d >= 0.0) |
615 |
|
if(sides[2][1] == GT_INVALID) |
616 |
|
{ |
617 |
|
if(!NTH_BIT(nset,1)) |
618 |
< |
VCROSS(n[1],t2,t1); |
618 |
> |
VCROSS(n[1],t1,t2); |
619 |
|
/* Test the point for sidedness */ |
620 |
|
d = DOT(n[1],p2); |
621 |
|
if(d >= 0.0) |
628 |
|
if(sides[2][2] == GT_INVALID) |
629 |
|
{ |
630 |
|
if(!NTH_BIT(nset,2)) |
631 |
< |
VCROSS(n[2],t0,t2); |
631 |
> |
VCROSS(n[2],t2,t0); |
632 |
|
/* Test the point for sidedness */ |
633 |
|
d = DOT(n[2],p2); |
634 |
|
if(d >= 0.0) |
1315 |
|
|
1316 |
|
if(b[i] <= 0.0) |
1317 |
|
{ |
1308 |
– |
#ifdef EXTRA_DEBUG |
1309 |
– |
if(b[i] < 0.0) |
1310 |
– |
printf("under %f\n",b[i]); |
1311 |
– |
#endif |
1318 |
|
bi[i]= 0; |
1319 |
|
} |
1320 |
|
else |
1321 |
|
if(b[i] >= 1.0) |
1322 |
|
{ |
1317 |
– |
#ifdef EXTRA_DEBUG |
1318 |
– |
if(b[i] > 1.0) |
1319 |
– |
printf("over %f\n",b[i]); |
1320 |
– |
#endif |
1323 |
|
bi[i]= MAXBCOORD; |
1324 |
|
} |
1325 |
|
else |
1328 |
|
bi[2] = bi[0] + bi[1]; |
1329 |
|
if(bi[2] > MAXBCOORD) |
1330 |
|
{ |
1329 |
– |
#ifdef EXTRA_DEBUG |
1330 |
– |
printf("sum over %f\n",b[0]+b[1]); |
1331 |
– |
#endif |
1331 |
|
bi[2] = 0; |
1332 |
|
bi[1] = MAXBCOORD - bi[0]; |
1333 |
|
} |