[brlcad-commits] CVS: brlcad/src/librt g_pipe.c,14.31,14.32
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: John A. <joh...@us...> - 2007-08-24 01:50:56
|
Update of /cvsroot/brlcad/brlcad/src/librt In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv11568 Modified Files: g_pipe.c Log Message: Rays parallel to the plane of a bend that missed the bend segment were producing error messaages from rt_poly_findroot(). Added a check for these misses in the bend segment shot routine (probably improves performance, too!!!). Index: g_pipe.c =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/librt/g_pipe.c,v retrieving revision 14.31 retrieving revision 14.32 diff -w -u -r14.31 -r14.32 --- g_pipe.c 23 Aug 2007 01:07:24 -0000 14.31 +++ g_pipe.c 24 Aug 2007 01:50:50 -0000 14.32 @@ -625,11 +625,29 @@ LOCAL fastf_t ir_sq; /* inside radius squared */ LOCAL fastf_t or2_sq; /* outside radius squared (from adjacent seg) */ LOCAL fastf_t ir2_sq; /* inside radius squared (from adjacent seg) */ + LOCAL int parallel; /* set to one when ray is parallel to plane of bend */ + LOCAL fastf_t dist; /* distance between ray and plane of bend */ + LOCAL fastf_t tmp; struct id_pipe *prev; struct id_pipe *next; *hit_count = 0; + tmp = VDOT( rp->r_dir, pipe->bend_N ); + if( NEAR_ZERO(tmp, 0.0000005) ) { + /* ray is parallel to plane of bend */ + parallel = 1; + dist = fabs( VDOT(rp->r_pt, pipe->bend_N) - + VDOT(pipe->bend_V, pipe->bend_N) ); + + if( dist > pipe->bend_or ) { + /* ray is more than outer radius away from plane of bend */ + goto check_discont_radii; + } + } else { + parallel = 0; + } + or_sq = pipe->bend_or * pipe->bend_or; ir_sq = pipe->bend_ir * pipe->bend_ir; @@ -762,6 +780,11 @@ if( pipe->bend_alpha_i <= 0.0 ) goto check_discont_radii; /* no inner torus */ + if( parallel && dist > pipe->bend_ir ) { + /* ray is parallel to plane of bend and more than inner radius away */ + goto check_discont_radii; + } + /* Now do inner torus */ A.cf[2] = X2_Y2.cf[2] + cor_pprime[Z] * cor_pprime[Z] + 1.0 - pipe->bend_alpha_i * pipe->bend_alpha_i; @@ -855,7 +878,7 @@ struct bend_pipe *bend = (struct bend_pipe *)prev; or2_sq = bend->bend_or*bend->bend_or; ir2_sq = bend->bend_ir*bend->bend_ir; */ - or2_sq = or2_sq; + or2_sq = or_sq; ir2_sq = ir_sq; } else { struct lin_pipe *lin = (struct lin_pipe *)prev; |