Thread: [brlcad-commits] SF.net SVN: brlcad:[31985] brlcad/trunk/src/librt/primitives/pipe/pipe.c
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <d_r...@us...> - 2008-07-28 08:29:55
|
Revision: 31985 http://brlcad.svn.sourceforge.net/brlcad/?rev=31985&view=rev Author: d_rossberg Date: 2008-07-28 08:30:03 +0000 (Mon, 28 Jul 2008) Log Message: ----------- a goto skipped the initialization of variables, moved the initialization of the variables (which are important after the goto) up Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2008-07-28 08:26:46 UTC (rev 31984) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2008-07-28 08:30:03 UTC (rev 31985) @@ -597,6 +597,9 @@ struct id_pipe *prev; struct id_pipe *next; + or_sq = pipe->bend_or * pipe->bend_or; + ir_sq = pipe->bend_ir * pipe->bend_ir; + tmp = VDOT( rp->r_dir, pipe->bend_N ); if ( NEAR_ZERO(tmp, 0.0000005) ) { /* ray is parallel to plane of bend */ @@ -612,9 +615,6 @@ parallel = 0; } - or_sq = pipe->bend_or * pipe->bend_or; - ir_sq = pipe->bend_ir * pipe->bend_ir; - /* Convert vector into the space of the unit torus */ MAT4X3VEC( dprime, pipe->bend_SoR, rp->r_dir ); VUNITIZE( dprime ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-05-07 03:42:17
|
Revision: 34437 http://brlcad.svn.sourceforge.net/brlcad/?rev=34437&view=rev Author: brlcad Date: 2009-05-07 03:42:10 +0000 (Thu, 07 May 2009) Log Message: ----------- ws indent style cleanup plus consistently wrap all of the (*nh) to be encased consistently in wraps. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2009-05-06 22:56:58 UTC (rev 34436) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2009-05-07 03:42:10 UTC (rev 34437) @@ -51,61 +51,61 @@ struct id_pipe { struct bu_list l; - int pipe_is_bend; + int pipe_is_bend; }; struct lin_pipe { struct bu_list l; - int pipe_is_bend; - vect_t pipe_V; /* start point for pipe section */ - vect_t pipe_H; /* unit vector in direction of pipe section */ - fastf_t pipe_ribase, pipe_ritop; /* base and top inner radii */ + int pipe_is_bend; + vect_t pipe_V; /* start point for pipe section */ + vect_t pipe_H; /* unit vector in direction of pipe section */ + fastf_t pipe_ribase, pipe_ritop; /* base and top inner radii */ fastf_t pipe_ribase_sq, pipe_ritop_sq; /* inner radii squared */ fastf_t pipe_ridiff_sq, pipe_ridiff; /* difference between top and base inner radii */ fastf_t pipe_rodiff_sq, pipe_rodiff; /* difference between top and base outer radii */ - fastf_t pipe_robase, pipe_rotop; /* base and top outer radii */ + fastf_t pipe_robase, pipe_rotop; /* base and top outer radii */ fastf_t pipe_robase_sq, pipe_rotop_sq; /* outer radii squared */ - fastf_t pipe_len; /* length of pipe segment */ - mat_t pipe_SoR; /* Scale and rotate */ - mat_t pipe_invRoS; /* inverse rotation and scale */ + fastf_t pipe_len; /* length of pipe segment */ + mat_t pipe_SoR; /* Scale and rotate */ + mat_t pipe_invRoS; /* inverse rotation and scale */ point_t pipe_min; point_t pipe_max; }; struct bend_pipe { struct bu_list l; - int pipe_is_bend; - fastf_t bend_radius; /* distance from bend_v to center of pipe */ - fastf_t bend_or; /* outer radius */ - fastf_t bend_ir; /* inner radius */ - mat_t bend_invR; /* inverse rotation matrix */ - mat_t bend_SoR; /* Scale and rotate */ - point_t bend_V; /* Center of bend */ - point_t bend_start; /* Start of bend */ - point_t bend_end; /* End of bend */ - fastf_t bend_alpha_i; /* ratio of inner radius to bend radius */ - fastf_t bend_alpha_o; /* ratio of outer radius to bend radius */ - fastf_t bend_angle; /* Angle that bend goes through */ - vect_t bend_ra; /* unit vector in plane of bend (points toward start from bend_V) */ - vect_t bend_rb; /* unit vector in plane of bend (normal to bend_ra) */ - vect_t bend_endNorm; /* unit vector normal to end plane */ - vect_t bend_startNorm; /* unit vector normal to start plane */ - vect_t bend_N; /* unit vector normal to plane of bend */ - point_t bend_bound_center; /* center of bounding sphere */ - fastf_t bend_bound_radius_sq; /* square of bounding sphere radius */ + int pipe_is_bend; + fastf_t bend_radius; /* distance from bend_v to center of pipe */ + fastf_t bend_or; /* outer radius */ + fastf_t bend_ir; /* inner radius */ + mat_t bend_invR; /* inverse rotation matrix */ + mat_t bend_SoR; /* Scale and rotate */ + point_t bend_V; /* Center of bend */ + point_t bend_start; /* Start of bend */ + point_t bend_end; /* End of bend */ + fastf_t bend_alpha_i; /* ratio of inner radius to bend radius */ + fastf_t bend_alpha_o; /* ratio of outer radius to bend radius */ + fastf_t bend_angle; /* Angle that bend goes through */ + vect_t bend_ra; /* unit vector in plane of bend (points toward start from bend_V) */ + vect_t bend_rb; /* unit vector in plane of bend (normal to bend_ra) */ + vect_t bend_endNorm; /* unit vector normal to end plane */ + vect_t bend_startNorm; /* unit vector normal to start plane */ + vect_t bend_N; /* unit vector normal to plane of bend */ + point_t bend_bound_center; /* center of bounding sphere */ + fastf_t bend_bound_radius_sq; /* square of bounding sphere radius */ }; -#define PIPE_MM(_v) VMINMAX( stp->st_min, stp->st_max, _v ); +#define PIPE_MM(_v) VMINMAX(stp->st_min, stp->st_max, _v); -#define ARC_SEGS 16 /* number of segments used to plot a circle */ +#define ARC_SEGS 16 /* number of segments used to plot a circle */ -#define PIPE_LINEAR_OUTER_BODY 1 -#define PIPE_LINEAR_INNER_BODY 2 -#define PIPE_LINEAR_TOP 3 -#define PIPE_LINEAR_BASE 4 +#define PIPE_LINEAR_OUTER_BODY 1 +#define PIPE_LINEAR_INNER_BODY 2 +#define PIPE_LINEAR_TOP 3 +#define PIPE_LINEAR_BASE 4 #define PIPE_BEND_OUTER_BODY 5 #define PIPE_BEND_INNER_BODY 6 -#define PIPE_BEND_BASE 7 +#define PIPE_BEND_BASE 7 #define PIPE_BEND_TOP 8 #define PIPE_RADIUS_CHANGE 9 @@ -114,61 +114,62 @@ HIDDEN int rt_bend_pipe_prep(struct soltab *stp, struct bu_list *head, fastf_t *bend_center, - fastf_t *bend_start, fastf_t *bend_end, fastf_t bend_radius, - fastf_t bend_angle, fastf_t *v1, fastf_t *v2, fastf_t od, fastf_t id, - fastf_t prev_od, fastf_t next_od) { + fastf_t *bend_start, fastf_t *bend_end, fastf_t bend_radius, + fastf_t bend_angle, fastf_t *v1, fastf_t *v2, fastf_t od, fastf_t id, + fastf_t prev_od, fastf_t next_od) +{ register struct bend_pipe *pipe; - vect_t to_start, to_end; - mat_t R; - point_t work; - fastf_t f; - fastf_t max_od; - fastf_t max_or; - fastf_t max_r; + vect_t to_start, to_end; + mat_t R; + point_t work; + fastf_t f; + fastf_t max_od; + fastf_t max_or; + fastf_t max_r; - pipe = (struct bend_pipe *)bu_malloc( sizeof( struct bend_pipe ), "rt_bend_pipe_prep:pipe" ); + pipe = (struct bend_pipe *)bu_malloc(sizeof(struct bend_pipe), "rt_bend_pipe_prep:pipe"); pipe->pipe_is_bend = 1; pipe->bend_or = od * 0.5; pipe->bend_ir = id * 0.5; - VMOVE( pipe->bend_start, bend_start ); - VMOVE( pipe->bend_end, bend_end ); - VMOVE( pipe->bend_V, bend_center ); - VSUB2( to_start, bend_start, bend_center ); + VMOVE(pipe->bend_start, bend_start); + VMOVE(pipe->bend_end, bend_end); + VMOVE(pipe->bend_V, bend_center); + VSUB2(to_start, bend_start, bend_center); pipe->bend_radius = bend_radius; - VSUB2( to_end, bend_end, bend_center ); - VSCALE( pipe->bend_ra, to_start, 1.0/pipe->bend_radius ); - VCROSS( pipe->bend_N, to_start, to_end ); - VUNITIZE( pipe->bend_N ); - VCROSS( pipe->bend_rb, pipe->bend_N, pipe->bend_ra ); - VCROSS( pipe->bend_startNorm, pipe->bend_ra, pipe->bend_N ); - VCROSS( pipe->bend_endNorm, pipe->bend_N, to_end ); - VUNITIZE( pipe->bend_endNorm ); + VSUB2(to_end, bend_end, bend_center); + VSCALE(pipe->bend_ra, to_start, 1.0/pipe->bend_radius); + VCROSS(pipe->bend_N, to_start, to_end); + VUNITIZE(pipe->bend_N); + VCROSS(pipe->bend_rb, pipe->bend_N, pipe->bend_ra); + VCROSS(pipe->bend_startNorm, pipe->bend_ra, pipe->bend_N); + VCROSS(pipe->bend_endNorm, pipe->bend_N, to_end); + VUNITIZE(pipe->bend_endNorm); pipe->bend_angle = bend_angle; /* angle goes from 0.0 at start to some angle less than PI */ - if ( pipe->bend_angle >= bn_pi ) { - bu_log( "Error: rt_pipe_prep: Bend section bends through more than 180 degrees\n" ); - return( 1 ); + if (pipe->bend_angle >= bn_pi) { + bu_log("Error: rt_pipe_prep: Bend section bends through more than 180 degrees\n"); + return(1); } pipe->bend_alpha_i = pipe->bend_ir/pipe->bend_radius; pipe->bend_alpha_o = pipe->bend_or/pipe->bend_radius; - MAT_IDN( R ); - VMOVE( &R[0], pipe->bend_ra ); - VMOVE( &R[4], pipe->bend_rb ); - VMOVE( &R[8], pipe->bend_N ); + MAT_IDN(R); + VMOVE(&R[0], pipe->bend_ra); + VMOVE(&R[4], pipe->bend_rb); + VMOVE(&R[8], pipe->bend_N); - if (bn_mat_inverse( pipe->bend_invR, R ) == 0) { + if (bn_mat_inverse(pipe->bend_invR, R) == 0) { bu_free(pipe, "rt_bend_pipe_prep:pipe"); return 0; /* there is nothing to bend, that's OK */ } - MAT_COPY( pipe->bend_SoR, R ); + MAT_COPY(pipe->bend_SoR, R); pipe->bend_SoR[15] *= pipe->bend_radius; /* bounding box for entire torus */ @@ -176,17 +177,17 @@ * to allow for dinscontinuous radii */ max_od = od; - if ( prev_od > max_od ) { + if (prev_od > max_od) { max_od = prev_od; } - if ( next_od > max_od ) { + if (next_od > max_od) { max_od = next_od; } max_or = max_od/2.0; max_r = bend_radius + max_or; - VBLEND2(pipe->bend_bound_center, 0.5, bend_start, 0.5, bend_end ); - pipe->bend_bound_radius_sq = max_r * sin( bend_angle/2.0 ); + VBLEND2(pipe->bend_bound_center, 0.5, bend_start, 0.5, bend_end); + pipe->bend_bound_radius_sq = max_r * sin(bend_angle/2.0); pipe->bend_bound_radius_sq = pipe->bend_bound_radius_sq * pipe->bend_bound_radius_sq; pipe->bend_bound_radius_sq += max_or * max_or; f = sqrt(pipe->bend_bound_radius_sq); @@ -201,29 +202,30 @@ work[Z] += f; PIPE_MM(work); - BU_LIST_INSERT( head, &pipe->l ); + BU_LIST_INSERT(head, &pipe->l); - return( 0 ); + return(0); } HIDDEN void -rt_linear_pipe_prep(struct soltab *stp, struct bu_list *head, fastf_t *pt1, fastf_t id1, fastf_t od1, fastf_t *pt2, fastf_t id2, fastf_t od2) { +rt_linear_pipe_prep(struct soltab *stp, struct bu_list *head, fastf_t *pt1, fastf_t id1, fastf_t od1, fastf_t *pt2, fastf_t id2, fastf_t od2) +{ register struct lin_pipe *pipe; - mat_t R; - mat_t Rinv; - mat_t S; + mat_t R; + mat_t Rinv; + mat_t S; point_t work; vect_t seg_ht; vect_t v1, v2; - pipe = (struct lin_pipe *)bu_malloc( sizeof( struct lin_pipe ), "rt_bend_pipe_prep:pipe" ); - BU_LIST_INSERT( head, &pipe->l ); + pipe = (struct lin_pipe *)bu_malloc(sizeof(struct lin_pipe), "rt_bend_pipe_prep:pipe"); + BU_LIST_INSERT(head, &pipe->l); - VMOVE( pipe->pipe_V, pt1 ); + VMOVE(pipe->pipe_V, pt1); - VSUB2( seg_ht, pt2, pt1 ); + VSUB2(seg_ht, pt2, pt1); pipe->pipe_ribase = id1/2.0; pipe->pipe_ribase_sq = pipe->pipe_ribase * pipe->pipe_ribase; pipe->pipe_ritop = id2/2.0; @@ -238,107 +240,108 @@ pipe->pipe_rodiff_sq = pipe->pipe_rodiff * pipe->pipe_rodiff; pipe->pipe_is_bend = 0; - pipe->pipe_len = MAGNITUDE( seg_ht ); - VSCALE( seg_ht, seg_ht, 1.0/pipe->pipe_len ); - VMOVE( pipe->pipe_H, seg_ht ); - bn_vec_ortho( v1, seg_ht ); - VCROSS( v2, seg_ht, v1 ); + pipe->pipe_len = MAGNITUDE(seg_ht); + VSCALE(seg_ht, seg_ht, 1.0/pipe->pipe_len); + VMOVE(pipe->pipe_H, seg_ht); + bn_vec_ortho(v1, seg_ht); + VCROSS(v2, seg_ht, v1); /* build R matrix */ - MAT_IDN( R ); - VMOVE( &R[0], v1 ); - VMOVE( &R[4], v2 ); - VMOVE( &R[8], seg_ht ); + MAT_IDN(R); + VMOVE(&R[0], v1); + VMOVE(&R[4], v2); + VMOVE(&R[8], seg_ht); /* Rinv is transpose */ - bn_mat_trn( Rinv, R ); + bn_mat_trn(Rinv, R); /* Build Scale matrix */ - MAT_IDN( S ); + MAT_IDN(S); S[10] = 1.0/pipe->pipe_len; /* Compute SoR and invRoS */ - bn_mat_mul( pipe->pipe_SoR, S, R ); - bn_mat_mul( pipe->pipe_invRoS, Rinv, S ); + bn_mat_mul(pipe->pipe_SoR, S, R); + bn_mat_mul(pipe->pipe_invRoS, Rinv, S); - VSETALL( pipe->pipe_min, MAX_FASTF ); - VSETALL( pipe->pipe_max, -MAX_FASTF ); + VSETALL(pipe->pipe_min, MAX_FASTF); + VSETALL(pipe->pipe_max, -MAX_FASTF); - VJOIN2( work, pt1, od1, v1, od1, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); - VJOIN2( work, pt1, -od1, v1, od1, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); - VJOIN2( work, pt1, od1, v1, -od1, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); - VJOIN2( work, pt1, -od1, v1, -od1, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); + VJOIN2(work, pt1, od1, v1, od1, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); + VJOIN2(work, pt1, -od1, v1, od1, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); + VJOIN2(work, pt1, od1, v1, -od1, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); + VJOIN2(work, pt1, -od1, v1, -od1, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); - VJOIN2( work, pt2, od2, v1, od2, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); - VJOIN2( work, pt2, -od2, v1, od2, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); - VJOIN2( work, pt2, od2, v1, -od2, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); - VJOIN2( work, pt2, -od2, v1, -od2, v2 ); - PIPE_MM( work ) - VMINMAX( pipe->pipe_min, pipe->pipe_max, work ); + VJOIN2(work, pt2, od2, v1, od2, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); + VJOIN2(work, pt2, -od2, v1, od2, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); + VJOIN2(work, pt2, od2, v1, -od2, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); + VJOIN2(work, pt2, -od2, v1, -od2, v2); + PIPE_MM(work) + VMINMAX(pipe->pipe_min, pipe->pipe_max, work); } /** - * R T _ P I P E _ P R E P + * R T _ P I P E _ P R E P * - * Given a pointer to a GED database record, and a transformation matrix, - * determine if this is a valid pipe solid, and if so, precompute various - * terms of the formula. + * Given a pointer to a GED database record, and a transformation + * matrix, determine if this is a valid pipe solid, and if so, + * precompute various terms of the formula. * - * Returns - - * 0 pipe solid is OK - * !0 Error in description + * Returns - + * 0 if pipe solid is OK + * !0 if there is an error in the description * - * Implicit return - - * A struct bu_list is created, and it's address is stored in - * stp->st_specific for use by pipe_shot(). + * Implicit return - + * A struct bu_list is created, and it's address is stored in + * stp->st_specific for use by pipe_shot(). */ int -rt_pipe_prep(struct soltab *stp, struct rt_db_internal *ip, struct rt_i *rtip) { +rt_pipe_prep(struct soltab *stp, struct rt_db_internal *ip, struct rt_i *rtip) +{ register struct bu_list *head; - struct rt_pipe_internal *pip; + struct rt_pipe_internal *pip; struct wdb_pipept *pp1, *pp2, *pp3; point_t curr_pt; fastf_t curr_id, curr_od; fastf_t dx, dy, dz, f; - RT_CK_DB_INTERNAL( ip ); + RT_CK_DB_INTERNAL(ip); pip = (struct rt_pipe_internal *)ip->idb_ptr; RT_PIPE_CK_MAGIC(pip); - head = (struct bu_list *)bu_malloc( sizeof( struct bu_list ), "rt_pipe_prep:head" ); + head = (struct bu_list *)bu_malloc(sizeof(struct bu_list), "rt_pipe_prep:head"); stp->st_specific = (genptr_t)head; - BU_LIST_INIT( head ); + BU_LIST_INIT(head); - if ( BU_LIST_IS_EMPTY( &(pip->pipe_segs_head) ) ) - return( 0 ); + if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) + return(0); - pp1 = BU_LIST_FIRST( wdb_pipept, &(pip->pipe_segs_head) ); - pp2 = BU_LIST_NEXT( wdb_pipept, &pp1->l ); - if ( BU_LIST_IS_HEAD( &pp2->l, &(pip->pipe_segs_head) ) ) - return( 0 ); - pp3 = BU_LIST_NEXT( wdb_pipept, &pp2->l ); - if ( BU_LIST_IS_HEAD( &pp3->l, &(pip->pipe_segs_head) ) ) + pp1 = BU_LIST_FIRST(wdb_pipept, &(pip->pipe_segs_head)); + pp2 = BU_LIST_NEXT(wdb_pipept, &pp1->l); + if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) + return(0); + pp3 = BU_LIST_NEXT(wdb_pipept, &pp2->l); + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) pp3 = (struct wdb_pipept *)NULL; - VMOVE( curr_pt, pp1->pp_coord ); + VMOVE(curr_pt, pp1->pp_coord); curr_od = pp1->pp_od; curr_id = pp1->pp_id; - while ( 1 ) { + while (1) { vect_t n1, n2; vect_t norm; vect_t v1, v2; @@ -347,120 +350,120 @@ fastf_t dist_to_bend; point_t bend_start, bend_end, bend_center; - VSUB2( n1, curr_pt, pp2->pp_coord ); - if ( VNEAR_ZERO( n1, RT_LEN_TOL ) ) { + VSUB2(n1, curr_pt, pp2->pp_coord); + if (VNEAR_ZERO(n1, RT_LEN_TOL)) { /* duplicate point, skip to next point */ goto next_pt; } - if ( !pp3 ) { + if (!pp3) { /* last segment */ - rt_linear_pipe_prep( stp, head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od ); + rt_linear_pipe_prep(stp, head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od); break; } - VSUB2( n2, pp3->pp_coord, pp2->pp_coord ); - VCROSS( norm, n1, n2 ); - VUNITIZE( n1 ); - VUNITIZE( n2 ); - angle = bn_pi - acos( VDOT( n1, n2 ) ); - dist_to_bend = pp2->pp_bendradius * tan( angle/2.0 ); - if ( isnan( dist_to_bend ) || VNEAR_ZERO( norm, SQRT_SMALL_FASTF) || NEAR_ZERO( dist_to_bend, SQRT_SMALL_FASTF) ) { + VSUB2(n2, pp3->pp_coord, pp2->pp_coord); + VCROSS(norm, n1, n2); + VUNITIZE(n1); + VUNITIZE(n2); + angle = bn_pi - acos(VDOT(n1, n2)); + dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); + if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { /* points are colinear, treat as a linear segment */ - rt_linear_pipe_prep( stp, head, curr_pt, curr_id, curr_od, - pp2->pp_coord, pp2->pp_id, pp2->pp_od ); - VMOVE( curr_pt, pp2->pp_coord ); + rt_linear_pipe_prep(stp, head, curr_pt, curr_id, curr_od, + pp2->pp_coord, pp2->pp_id, pp2->pp_od); + VMOVE(curr_pt, pp2->pp_coord); goto next_pt; } - VJOIN1( bend_start, pp2->pp_coord, dist_to_bend, n1 ); - VJOIN1( bend_end, pp2->pp_coord, dist_to_bend, n2 ); + VJOIN1(bend_start, pp2->pp_coord, dist_to_bend, n1); + VJOIN1(bend_end, pp2->pp_coord, dist_to_bend, n2); - VUNITIZE( norm ); + VUNITIZE(norm); /* linear section */ - VSUB2( diff, curr_pt, bend_start ); - if ( MAGNITUDE( diff ) <= RT_LEN_TOL ) { + VSUB2(diff, curr_pt, bend_start); + if (MAGNITUDE(diff) <= RT_LEN_TOL) { /* do not make linear sections that are too small to raytrace */ - VMOVE( bend_start, curr_pt ); + VMOVE(bend_start, curr_pt); } else { - rt_linear_pipe_prep( stp, head, curr_pt, curr_id, curr_od, - bend_start, pp2->pp_id, pp2->pp_od ); + rt_linear_pipe_prep(stp, head, curr_pt, curr_id, curr_od, + bend_start, pp2->pp_id, pp2->pp_od); } /* and bend section */ - VCROSS( v1, n1, norm ); - VCROSS( v2, v1, norm ); - VJOIN1( bend_center, bend_start, -pp2->pp_bendradius, v1 ); - rt_bend_pipe_prep( stp, head, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, - v1, v2, pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od ); + VCROSS(v1, n1, norm); + VCROSS(v2, v1, norm); + VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); + rt_bend_pipe_prep(stp, head, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, + v1, v2, pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od); - VMOVE( curr_pt, bend_end ); - next_pt: + VMOVE(curr_pt, bend_end); + next_pt: if (!pp3) break; curr_id = pp2->pp_id; curr_od = pp2->pp_od; pp1 = pp2; pp2 = pp3; - pp3 = BU_LIST_NEXT( wdb_pipept, &pp3->l ); - if ( BU_LIST_IS_HEAD( &pp3->l, &(pip->pipe_segs_head) ) ) + pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) pp3 = (struct wdb_pipept *)NULL; } - VSET( stp->st_center, - (stp->st_max[X] + stp->st_min[X])/2, - (stp->st_max[Y] + stp->st_min[Y])/2, - (stp->st_max[Z] + stp->st_min[Z])/2 ); + VSET(stp->st_center, + (stp->st_max[X] + stp->st_min[X])/2, + (stp->st_max[Y] + stp->st_min[Y])/2, + (stp->st_max[Z] + stp->st_min[Z])/2); dx = (stp->st_max[X] - stp->st_min[X])/2; f = dx; dy = (stp->st_max[Y] - stp->st_min[Y])/2; - if ( dy > f ) f = dy; + if (dy > f) f = dy; dz = (stp->st_max[Z] - stp->st_min[Z])/2; - if ( dz > f ) f = dz; + if (dz > f) f = dz; stp->st_aradius = f; stp->st_bradius = sqrt(dx*dx + dy*dy + dz*dz); - return( 0 ); + return(0); } /** - * R T _ P I P E _ P R I N T + * R T _ P I P E _ P R I N T */ void -rt_pipe_print(register const struct soltab *stp) { - /* register struct bu_list *pipe = - (struct bu_list *)stp->st_specific; */ +rt_pipe_print(register const struct soltab *stp) +{ + /* register struct bu_list *pipe = + (struct bu_list *)stp->st_specific; */ } /** - * R T _ P I P E P T _ P R I N T + * R T _ P I P E P T _ P R I N T */ void -rt_pipept_print( const struct wdb_pipept *pipe, double mm2local ) { +rt_pipept_print(const struct wdb_pipept *pipe, double mm2local) +{ point_t p1; - bu_log( "Pipe Vertex:\n" ); - VSCALE( p1, pipe->pp_coord, mm2local ); - bu_log( "\tat (%g %g %g)\n", V3ARGS( p1 ) ); - bu_log( "\tbend radius = %g\n", pipe->pp_bendradius*mm2local ); - if ( pipe->pp_id > 0.0 ) - bu_log( "\tod=%g, id=%g\n", - pipe->pp_od*mm2local, - pipe->pp_id*mm2local ); - else - bu_log( "\tod=%g\n", pipe->pp_od*mm2local ); + bu_log("Pipe Vertex:\n"); + VSCALE(p1, pipe->pp_coord, mm2local); + bu_log("\tat (%g %g %g)\n", V3ARGS(p1)); + bu_log("\tbend radius = %g\n", pipe->pp_bendradius*mm2local); + if (pipe->pp_id > 0.0) { + bu_log("\tod=%g, id=%g\n", + pipe->pp_od*mm2local, + pipe->pp_id*mm2local); + } else { + bu_log("\tod=%g\n", pipe->pp_od*mm2local); + } } /** - * R T _ V L S _ P I P E P T + * R T _ V L S _ P I P E P T */ void -rt_vls_pipept( -struct bu_vls *vp, - int seg_no, - const struct rt_db_internal *ip, - double mm2local) { +rt_vls_pipept(struct bu_vls *vp, int seg_no, const struct rt_db_internal *ip, double mm2local) +{ struct rt_pipe_internal *pint; struct wdb_pipept *pipe; int seg_count=0; @@ -468,41 +471,43 @@ point_t p1; pint = (struct rt_pipe_internal *)ip->idb_ptr; - RT_PIPE_CK_MAGIC( pint ); + RT_PIPE_CK_MAGIC(pint); - pipe = BU_LIST_FIRST( wdb_pipept, &pint->pipe_segs_head ); - while ( ++seg_count != seg_no && BU_LIST_NOT_HEAD( &pipe->l, &pint->pipe_segs_head ) ) - pipe = BU_LIST_NEXT( wdb_pipept, &pipe->l ); + pipe = BU_LIST_FIRST(wdb_pipept, &pint->pipe_segs_head); + while (++seg_count != seg_no && BU_LIST_NOT_HEAD(&pipe->l, &pint->pipe_segs_head)) + pipe = BU_LIST_NEXT(wdb_pipept, &pipe->l); - sprintf( buf, "Pipe Vertex:\n" ); - bu_vls_strcat( vp, buf ); - VSCALE( p1, pipe->pp_coord, mm2local ); - sprintf( buf, "\tat (%g %g %g)\n", V3ARGS( p1 ) ); - bu_vls_strcat( vp, buf ); - sprintf( buf, "\tbend radius = %g\n", pipe->pp_bendradius*mm2local ); - bu_vls_strcat( vp, buf ); - if ( pipe->pp_id > 0.0 ) - sprintf( buf, "\tod=%g, id=%g\n", + sprintf(buf, "Pipe Vertex:\n"); + bu_vls_strcat(vp, buf); + VSCALE(p1, pipe->pp_coord, mm2local); + sprintf(buf, "\tat (%g %g %g)\n", V3ARGS(p1)); + bu_vls_strcat(vp, buf); + sprintf(buf, "\tbend radius = %g\n", pipe->pp_bendradius*mm2local); + bu_vls_strcat(vp, buf); + if (pipe->pp_id > 0.0) { + sprintf(buf, "\tod=%g, id=%g\n", pipe->pp_od*mm2local, - pipe->pp_id*mm2local ); - else - sprintf( buf, "\tod=%g\n", pipe->pp_od*mm2local ); - bu_vls_strcat( vp, buf ); + pipe->pp_id*mm2local); + } else { + sprintf(buf, "\tod=%g\n", pipe->pp_od*mm2local); + } + bu_vls_strcat(vp, buf); } -/* - * Check for hits on surfaces created by discontinuous radius changes from - * one pipe segment to the next. Can only happen when one segment is a bend, - * because linear segments handle different radii at each end. Bend segments - * must have constant radii . - * These surfaces are normal to the flow of the pipe. +/** + * Check for hits on surfaces created by discontinuous radius changes + * from one pipe segment to the next. Can only happen when one segment + * is a bend, because linear segments handle different radii at each + * end. Bend segments must have constant radii . These surfaces are + * normal to the flow of the pipe. */ HIDDEN void discont_radius_shot(register struct xray *rp, struct seg *seghead, - point_t center, vect_t norm, - fastf_t or1_sq, fastf_t ir1_sq, fastf_t or2_sq, fastf_t ir2_sq, - struct hit *hits, int *hit_count, int seg_no, struct soltab *stp) { + point_t center, vect_t norm, + fastf_t or1_sq, fastf_t ir1_sq, fastf_t or2_sq, fastf_t ir2_sq, + struct hit *hits, int *hit_count, int seg_no, struct soltab *stp) +{ fastf_t dist_to_plane; fastf_t norm_dist; fastf_t slant_factor; @@ -511,40 +516,40 @@ fastf_t radius_sq; /* calculate interstection with plane at center (with normal "norm") */ - dist_to_plane = VDOT( norm, center ); - norm_dist = dist_to_plane - VDOT( norm, rp->r_pt ); - slant_factor = VDOT( norm, rp->r_dir ); - if ( !NEAR_ZERO( slant_factor, SMALL_FASTF ) ) { + dist_to_plane = VDOT(norm, center); + norm_dist = dist_to_plane - VDOT(norm, rp->r_pt); + slant_factor = VDOT(norm, rp->r_dir); + if (!NEAR_ZERO(slant_factor, SMALL_FASTF)) { vect_t to_center; struct hit *hitp; t_tmp = norm_dist/slant_factor; - VJOIN1( hit_pt, rp->r_pt, t_tmp, rp->r_dir ); - VSUB2( to_center, center, hit_pt ); - radius_sq = MAGSQ( to_center ); + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, center, hit_pt); + radius_sq = MAGSQ(to_center); /* where the radius ranges overlap, there is no hit */ - if ( radius_sq <= or1_sq && radius_sq >= ir1_sq && - radius_sq <= or2_sq && radius_sq >= ir2_sq ) { + if (radius_sq <= or1_sq && radius_sq >= ir1_sq && + radius_sq <= or2_sq && radius_sq >= ir2_sq) { return; } /* if we are within one of the radius ranges, we have a hit */ - if ( (radius_sq <= or2_sq && radius_sq >= ir2_sq) || - (radius_sq <= or1_sq && radius_sq >= ir1_sq) ) { + if ((radius_sq <= or2_sq && radius_sq >= ir2_sq) || + (radius_sq <= or1_sq && radius_sq >= ir1_sq)) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_RADIUS_CHANGE; /* within first range, use norm, otherwise reverse */ - if ( radius_sq <= or1_sq && radius_sq >= ir1_sq ) { - VMOVE( hitp->hit_normal, norm ); + if (radius_sq <= or1_sq && radius_sq >= ir1_sq) { + VMOVE(hitp->hit_normal, norm); } else { - VREVERSE( hitp->hit_normal, norm ); + VREVERSE(hitp->hit_normal, norm); } - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } @@ -555,16 +560,17 @@ * check if a ray passes within a bounding sphere */ int -rt_in_sph( struct xray *rp, point_t center, fastf_t radius_sq ) { +rt_in_sph(struct xray *rp, point_t center, fastf_t radius_sq) +{ vect_t toCenter; vect_t toPCA; fastf_t dist_sq; - VSUB2( toCenter, center, rp->r_pt ); - VCROSS( toPCA, toCenter, rp->r_dir ); - dist_sq = MAGSQ( toPCA ); + VSUB2(toCenter, center, rp->r_pt); + VCROSS(toPCA, toCenter, rp->r_dir); + dist_sq = MAGSQ(toPCA); - if ( dist_sq <= radius_sq) { + if (dist_sq <= radius_sq) { return 1; } else { return 0; @@ -572,40 +578,41 @@ } HIDDEN void -bend_pipe_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct bend_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) { - vect_t dprime; /* D' */ - vect_t pprime; /* P' */ - vect_t work; /* temporary vector */ - bn_poly_t C; /* The final equation */ - bn_complex_t val[4]; /* The complex roots */ - int j; +bend_pipe_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct bend_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) +{ + vect_t dprime; /* D' */ + vect_t pprime; /* P' */ + vect_t work; /* temporary vector */ + bn_poly_t C; /* The final equation */ + bn_complex_t val[4]; /* The complex roots */ + int j; - int root_count=0; - bn_poly_t A, Asqr; - bn_poly_t X2_Y2; /* X**2 + Y**2 */ - vect_t cor_pprime; /* new ray origin */ - fastf_t cor_proj; - fastf_t or_sq; /* outside radius squared */ - fastf_t ir_sq; /* inside radius squared */ - fastf_t or2_sq; /* outside radius squared (from adjacent seg) */ - fastf_t ir2_sq; /* inside radius squared (from adjacent seg) */ - int parallel; /* set to one when ray is parallel to plane of bend */ - fastf_t dist; /* distance between ray and plane of bend */ - fastf_t tmp; - struct id_pipe *prev; - struct id_pipe *next; + int root_count=0; + bn_poly_t A, Asqr; + bn_poly_t X2_Y2; /* X**2 + Y**2 */ + vect_t cor_pprime; /* new ray origin */ + fastf_t cor_proj; + fastf_t or_sq; /* outside radius squared */ + fastf_t ir_sq; /* inside radius squared */ + fastf_t or2_sq; /* outside radius squared (from adjacent seg) */ + fastf_t ir2_sq; /* inside radius squared (from adjacent seg) */ + int parallel; /* set to one when ray is parallel to plane of bend */ + fastf_t dist; /* distance between ray and plane of bend */ + fastf_t tmp; + struct id_pipe *prev; + struct id_pipe *next; or_sq = pipe->bend_or * pipe->bend_or; ir_sq = pipe->bend_ir * pipe->bend_ir; - tmp = VDOT( rp->r_dir, pipe->bend_N ); - if ( NEAR_ZERO(tmp, 0.0000005) ) { + 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) ); + dist = fabs(VDOT(rp->r_pt, pipe->bend_N) - + VDOT(pipe->bend_V, pipe->bend_N)); - if ( dist > pipe->bend_or ) { + if (dist > pipe->bend_or) { /* ray is more than outer radius away from plane of bend */ goto check_discont_radii; } @@ -614,54 +621,53 @@ } /* Convert vector into the space of the unit torus */ - MAT4X3VEC( dprime, pipe->bend_SoR, rp->r_dir ); - VUNITIZE( dprime ); + MAT4X3VEC(dprime, pipe->bend_SoR, rp->r_dir); + VUNITIZE(dprime); - VSUB2( work, rp->r_pt, pipe->bend_V ); - MAT4X3VEC( pprime, pipe->bend_SoR, work ); + VSUB2(work, rp->r_pt, pipe->bend_V); + MAT4X3VEC(pprime, pipe->bend_SoR, work); - /* normalize distance from torus. substitute - * corrected pprime which contains a translation along ray - * direction to closest approach to vertex of torus. - * Translating ray origin along direction of ray to closest pt. to - * origin of solid's coordinate system, new ray origin is - * 'cor_pprime'. + /* normalize distance from torus. substitute corrected pprime + * which contains a translation along ray direction to closest + * approach to vertex of torus. Translating ray origin along + * direction of ray to closest pt. to origin of solid's coordinate + * system, new ray origin is 'cor_pprime'. */ - cor_proj = VDOT( pprime, dprime ); - VSCALE( cor_pprime, dprime, cor_proj ); - VSUB2( cor_pprime, pprime, cor_pprime ); + cor_proj = VDOT(pprime, dprime); + VSCALE(cor_pprime, dprime, cor_proj); + VSUB2(cor_pprime, pprime, cor_pprime); /* - * Given a line and a ratio, alpha, finds the equation of the - * unit torus in terms of the variable 't'. + * Given a line and a ratio, alpha, finds the equation of the unit + * torus in terms of the variable 't'. * - * The equation for the torus is: + * The equation for the torus is: * - * [ X**2 + Y**2 + Z**2 + (1 - alpha**2) ]**2 - 4*( X**2 + Y**2 ) = 0 + * [ X**2 + Y**2 + Z**2 + (1 - alpha**2) ]**2 - 4*(X**2 + Y**2) = 0 * - * First, find X, Y, and Z in terms of 't' for this line, then - * substitute them into the equation above. + * First, find X, Y, and Z in terms of 't' for this line, then + * substitute them into the equation above. * - * Wx = Dx*t + Px + * Wx = Dx*t + Px * - * Wx**2 = Dx**2 * t**2 + 2 * Dx * Px + Px**2 - * [0] [1] [2] dgr=2 + * Wx**2 = Dx**2 * t**2 + 2 * Dx * Px + Px**2 + * [0] [1] [2] dgr=2 */ X2_Y2.dgr = 2; X2_Y2.cf[0] = dprime[X] * dprime[X] + dprime[Y] * dprime[Y]; X2_Y2.cf[1] = 2.0 * (dprime[X] * cor_pprime[X] + - dprime[Y] * cor_pprime[Y]); + dprime[Y] * cor_pprime[Y]); X2_Y2.cf[2] = cor_pprime[X] * cor_pprime[X] + - cor_pprime[Y] * cor_pprime[Y]; + cor_pprime[Y] * cor_pprime[Y]; /* A = X2_Y2 + Z2 */ A.dgr = 2; A.cf[0] = X2_Y2.cf[0] + dprime[Z] * dprime[Z]; A.cf[1] = X2_Y2.cf[1] + 2.0 * dprime[Z] * cor_pprime[Z]; A.cf[2] = X2_Y2.cf[2] + cor_pprime[Z] * cor_pprime[Z] + - 1.0 - pipe->bend_alpha_o * pipe->bend_alpha_o; + 1.0 - pipe->bend_alpha_o * pipe->bend_alpha_o; - /* Inline expansion of (void) bn_poly_mul( &Asqr, &A, &A ) */ + /* Inline expansion of (void) bn_poly_mul(&Asqr, &A, &A) */ /* Both polys have degree two */ Asqr.dgr = 4; Asqr.cf[0] = A.cf[0] * A.cf[0]; @@ -670,8 +676,8 @@ Asqr.cf[3] = A.cf[1] * A.cf[2] + A.cf[2] * A.cf[1]; Asqr.cf[4] = A.cf[2] * A.cf[2]; - /* Inline expansion of bn_poly_scale( &X2_Y2, 4.0 ) and - * bn_poly_sub( &C, &Asqr, &X2_Y2 ). + /* Inline expansion of bn_poly_scale(&X2_Y2, 4.0) and + * bn_poly_sub(&C, &Asqr, &X2_Y2). */ C.dgr = 4; C.cf[0] = Asqr.cf[0]; @@ -680,13 +686,13 @@ C.cf[3] = Asqr.cf[3] - X2_Y2.cf[1] * 4.0; C.cf[4] = Asqr.cf[4] - X2_Y2.cf[2] * 4.0; - /* It is known that the equation is 4th order. Therefore, - * if the root finder returns other than 4 roots, error. + /* It is known that the equation is 4th order. Therefore, if the + * root finder returns other than 4 roots, error. */ - if ( (root_count = rt_poly_roots( &C, val, stp->st_dp->d_namep )) != 4 ) { - if ( root_count > 0 ) { + if ((root_count = rt_poly_roots(&C, val, stp->st_dp->d_namep)) != 4) { + if (root_count > 0) { bu_log("pipe: rt_poly_roots() 4!=%d\n", root_count); - bn_pr_roots( stp->st_name, val, root_count ); + bn_pr_roots(stp->st_name, val, root_count); } else if (root_count < 0) { static int reported=0; bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); @@ -700,58 +706,58 @@ goto check_discont_radii; /* MISSED */ } - /* Only real roots indicate an intersection in real space. + /* Only real roots indicate an intersection in real space. * - * Look at each root returned; if the imaginary part is zero - * or sufficiently close, then use the real part as one value - * of 't' for the intersections + * Look at each root returned; if the imaginary part is zero or + * sufficiently close, then use the real part as one value of 't' + * for the intersections */ - for ( j=0 ; j < 4; j++ ) { - if ( NEAR_ZERO( val[j].im, 0.0001 ) ) { + for (j=0 ; j < 4; j++) { + if (NEAR_ZERO(val[j].im, 0.0001)) { struct hit *hitp; fastf_t normalized_dist; fastf_t dist; point_t hit_pt; - vect_t to_hit; - fastf_t angle; + vect_t to_hit; + fastf_t angle; normalized_dist = val[j].re - cor_proj; dist = normalized_dist * pipe->bend_radius; /* check if this hit is within bend angle */ - VJOIN1( hit_pt, rp->r_pt, dist, rp->r_dir ); - VSUB2( to_hit, hit_pt, pipe->bend_V ); - angle = atan2( VDOT( to_hit, pipe->bend_rb ), VDOT( to_hit, pipe->bend_ra ) ); - if ( angle < 0.0 ) + VJOIN1(hit_pt, rp->r_pt, dist, rp->r_dir); + VSUB2(to_hit, hit_pt, pipe->bend_V); + angle = atan2(VDOT(to_hit, pipe->bend_rb), VDOT(to_hit, pipe->bend_ra)); + if (angle < 0.0) angle += 2.0 * bn_pi; - if ( angle <= pipe->bend_angle ) { + if (angle <= pipe->bend_angle) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = dist; - VJOIN1( hitp->hit_vpriv, pprime, normalized_dist, dprime ); + VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); hitp->hit_surfno = seg_no*10 + PIPE_BEND_OUTER_BODY; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } } } - if ( pipe->bend_alpha_i <= 0.0 ) + if (pipe->bend_alpha_i <= 0.0) goto check_discont_radii; /* no inner torus */ - if ( parallel && dist > pipe->bend_ir ) { + 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; + 1.0 - pipe->bend_alpha_i * pipe->bend_alpha_i; - /* Inline expansion of (void) bn_poly_mul( &Asqr, &A, &A ) */ + /* Inline expansion of (void) bn_poly_mul(&Asqr, &A, &A) */ /* Both polys have degree two */ Asqr.dgr = 4; Asqr.cf[0] = A.cf[0] * A.cf[0]; @@ -760,8 +766,8 @@ Asqr.cf[3] = A.cf[1] * A.cf[2] + A.cf[2] * A.cf[1]; Asqr.cf[4] = A.cf[2] * A.cf[2]; - /* Inline expansion of bn_poly_scale( &X2_Y2, 4.0 ) and - * bn_poly_sub( &C, &Asqr, &X2_Y2 ). + /* Inline expansion of bn_poly_scale(&X2_Y2, 4.0) and + * bn_poly_sub(&C, &Asqr, &X2_Y2). */ C.dgr = 4; C.cf[0] = Asqr.cf[0]; @@ -770,13 +776,13 @@ C.cf[3] = Asqr.cf[3] - X2_Y2.cf[1] * 4.0; C.cf[4] = Asqr.cf[4] - X2_Y2.cf[2] * 4.0; - /* It is known that the equation is 4th order. Therefore, - * if the root finder returns other than 4 roots, error. + /* It is known that the equation is 4th order. Therefore, + * if the root finder returns other than 4 roots, error. */ - if ( (root_count = rt_poly_roots( &C, val, stp->st_dp->d_namep)) != 4 ) { - if ( root_count > 0 ) { + if ((root_count = rt_poly_roots(&C, val, stp->st_dp->d_namep)) != 4) { + if (root_count > 0) { bu_log("tor: rt_poly_roots() 4!=%d\n", root_count); - bn_pr_roots( stp->st_name, val, root_count ); + bn_pr_roots(stp->st_name, val, root_count); } else if (root_count < 0) { static int reported=0; bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); @@ -790,39 +796,39 @@ goto check_discont_radii; /* MISSED */ } - /* Only real roots indicate an intersection in real space. + /* Only real roots indicate an intersection in real space. * - * Look at each root returned; if the imaginary part is zero - * or sufficiently close, then use the real part as one value - * of 't' for the intersections + * Look at each root returned; if the imaginary part is zero or + * sufficiently close, then use the real part as one value of 't' + * for the intersections */ - for ( j=0, root_count=0; j < 4; j++ ) { - if ( NEAR_ZERO( val[j].im, 0.0001 ) ) { + for (j=0, root_count=0; j < 4; j++) { + if (NEAR_ZERO(val[j].im, 0.0001)) { struct hit *hitp; fastf_t normalized_dist; fastf_t dist; point_t hit_pt; - vect_t to_hit; - fastf_t angle; + vect_t to_hit; + fastf_t angle; normalized_dist = val[j].re - cor_proj; dist = normalized_dist * pipe->bend_radius; /* check if this hit is within bend angle */ - VJOIN1( hit_pt, rp->r_pt, dist, rp->r_dir ); - VSUB2( to_hit, hit_pt, pipe->bend_V ); - angle = atan2( VDOT( to_hit, pipe->bend_rb ), VDOT( to_hit, pipe->bend_ra ) ); - if ( angle < 0.0 ) + VJOIN1(hit_pt, rp->r_pt, dist, rp->r_dir); + VSUB2(to_hit, hit_pt, pipe->bend_V); + angle = atan2(VDOT(to_hit, pipe->bend_rb), VDOT(to_hit, pipe->bend_ra)); + if (angle < 0.0) angle += 2.0 * bn_pi; - if ( angle <= pipe->bend_angle ) { + if (angle <= pipe->bend_angle) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = dist; - VJOIN1( hitp->hit_vpriv, pprime, normalized_dist, dprime ); + VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); hitp->hit_surfno = seg_no*10 + PIPE_BEND_INNER_BODY; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } @@ -830,11 +836,11 @@ } - check_discont_radii: + check_discont_radii: /* check for surfaces created by discontinuous changes in radii */ - prev = BU_LIST_BACK( id_pipe, &pipe->l ); - if ( prev->l.magic != BU_LIST_HEAD_MAGIC ) { - if ( prev->pipe_is_bend ) { + prev = BU_LIST_BACK(id_pipe, &pipe->l); + if (prev->l.magic != BU_LIST_HEAD_MAGIC) { + if (prev->pipe_is_bend) { /* do not process previous bend * struct bend_pipe *bend = (struct bend_pipe *)prev; * or2_sq = bend->bend_or*bend->bend_or; @@ -845,33 +851,33 @@ struct lin_pipe *lin = (struct lin_pipe *)prev; or2_sq = lin->pipe_rotop_sq; ir2_sq = lin->pipe_ritop_sq; - if ( !NEAR_ZERO( (or_sq - or2_sq), RT_LEN_TOL) || - !NEAR_ZERO( (ir_sq - ir2_sq), RT_LEN_TOL) ) { - discont_radius_shot( rp, seghead, pipe->bend_start, pipe->bend_startNorm, - or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); + if (!NEAR_ZERO((or_sq - or2_sq), RT_LEN_TOL) || + !NEAR_ZERO((ir_sq - ir2_sq), RT_LEN_TOL)) { + discont_radius_shot(rp, seghead, pipe->bend_start, pipe->bend_startNorm, + or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); } } } - next = BU_LIST_NEXT( id_pipe, &pipe->l ); - if ( next->l.magic != BU_LIST_HEAD_MAGIC ) { - if ( next->pipe_is_bend ) { + next = BU_LIST_NEXT(id_pipe, &pipe->l); + if (next->l.magic != BU_LIST_HEAD_MAGIC) { + if (next->pipe_is_bend) { struct bend_pipe *bend = (struct bend_pipe *)next; or2_sq = bend->bend_or*bend->bend_or; ir2_sq = bend->bend_ir*bend->bend_ir; - if ( !NEAR_ZERO( (or_sq - or2_sq), RT_LEN_TOL) || - !NEAR_ZERO( (ir_sq - ir2_sq), RT_LEN_TOL) ) { - discont_radius_shot( rp, seghead, pipe->bend_end, pipe->bend_endNorm, - or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); + if (!NEAR_ZERO((or_sq - or2_sq), RT_LEN_TOL) || + !NEAR_ZERO((ir_sq - ir2_sq), RT_LEN_TOL)) { + discont_radius_shot(rp, seghead, pipe->bend_end, pipe->bend_endNorm, + or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); } } else { struct lin_pipe *lin = (struct lin_pipe *)next; or2_sq = lin->pipe_robase_sq; ir2_sq = lin->pipe_ribase_sq; - if ( !NEAR_ZERO( (or_sq - or2_sq), RT_LEN_TOL) || - !NEAR_ZERO( (ir_sq - ir2_sq), RT_LEN_TOL) ) { - discont_radius_shot( rp, seghead, pipe->bend_end, pipe->bend_endNorm, - or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); + if (!NEAR_ZERO((or_sq - or2_sq), RT_LEN_TOL) || + !NEAR_ZERO((ir_sq - ir2_sq), RT_LEN_TOL)) { + discont_radius_shot(rp, seghead, pipe->bend_end, pipe->bend_endNorm, + or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); } } } @@ -882,138 +888,139 @@ } HIDDEN void -linear_pipe_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct lin_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) { - struct hit *hitp; - point_t work_pt; - point_t ray_start; - vect_t ray_dir; - double t_tmp; - double a, b, c; - double descrim; +linear_pipe_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct lin_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) +{ + struct hit *hitp; + point_t work_pt; + point_t ray_start; + vect_t ray_dir; + double t_tmp; + double a, b, c; + double descrim; - if ( pipe->pipe_is_bend ) { - bu_log( "linear_pipe_shot called for pipe bend\n" ); - bu_bomb( "linear_pipe_shot\n" ); + if (pipe->pipe_is_bend) { + bu_log("linear_pipe_shot called for pipe bend\n"); + bu_bomb("linear_pipe_shot\n"); } /* transform ray start point */ - VSUB2( work_pt, rp->r_pt, pipe->pipe_V ); - MAT4X3VEC( ray_start, pipe->pipe_SoR, work_pt ); + VSUB2(work_pt, rp->r_pt, pipe->pipe_V); + MAT4X3VEC(ray_start, pipe->pipe_SoR, work_pt); /* rotate ray direction */ - MAT4X3VEC( ray_dir, pipe->pipe_SoR, rp->r_dir ); + MAT4X3VEC(ray_dir, pipe->pipe_SoR, rp->r_dir); /* Intersect with outer sides */ a = ray_dir[X]*ray_dir[X] - + ray_dir[Y]*ray_dir[Y] - - ray_dir[Z]*ray_dir[Z]*pipe->pipe_rodiff_sq; + + ray_dir[Y]*ray_dir[Y] + - ray_dir[Z]*ray_dir[Z]*pipe->pipe_rodiff_sq; b = 2.0*(ray_start[X]*ray_dir[X] - + ray_start[Y]*ray_dir[Y] - - ray_start[Z]*ray_dir[Z]*pipe->pipe_rodiff_sq - - ray_dir[Z]*pipe->pipe_robase*pipe->pipe_rodiff); + + ray_start[Y]*ray_dir[Y] + - ray_start[Z]*ray_dir[Z]*pipe->pipe_rodiff_sq + - ray_dir[Z]*pipe->pipe_robase*pipe->pipe_rodiff); c = ray_start[X]*ray_start[X] - + ray_start[Y]*ray_start[Y] - - pipe->pipe_robase*pipe->pipe_robase - - ray_start[Z]*ray_start[Z]*pipe->pipe_rodiff_sq - - 2.0*ray_start[Z]*pipe->pipe_robase*pipe->pipe_rodiff; + + ray_start[Y]*ray_start[Y] + - pipe->pipe_robase*pipe->pipe_robase + - ray_start[Z]*ray_start[Z]*pipe->pipe_rodiff_sq + - 2.0*ray_start[Z]*pipe->pipe_robase*pipe->pipe_rodiff; descrim = b*b - 4.0*a*c; - if ( descrim > 0.0 ) { - fastf_t sqrt_descrim; - point_t hit_pt; + if (descrim > 0.0) { + fastf_t sqrt_descrim; + point_t hit_pt; - sqrt_descrim = sqrt( descrim ); + sqrt_descrim = sqrt(descrim); t_tmp = (-b - sqrt_descrim)/(2.0*a); - VJOIN1( hit_pt, ray_start, t_tmp, ray_dir ); - if ( hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0 ) { + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; - VMOVE( hitp->hit_vpriv, hit_pt ); + VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-pipe->pipe_robase - hit_pt[Z] * pipe->pipe_rodiff) * - pipe->pipe_rodiff; + pipe->pipe_rodiff; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } t_tmp = (-b + sqrt_descrim)/(2.0*a); - VJOIN1( hit_pt, ray_start, t_tmp, ray_dir ); - if ( hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0 ) { + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; - VMOVE( hitp->hit_vpriv, hit_pt ); + VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-pipe->pipe_robase - hit_pt[Z] * pipe->pipe_rodiff) * - pipe->pipe_rodiff; + pipe->pipe_rodiff; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } } - if ( pipe->pipe_ribase > 0.0 || pipe->pipe_ritop > 0.0 ) { + if (pipe->pipe_ribase > 0.0 || pipe->pipe_ritop > 0.0) { /* Intersect with inner sides */ a = ray_dir[X]*ray_dir[X] - + ray_dir[Y]*ray_dir[Y] - - ray_dir[Z]*ray_dir[Z]*pipe->pipe_ridiff_sq; + + ray_dir[Y]*ray_dir[Y] + - ray_dir[Z]*ray_dir[Z]*pipe->pipe_ridiff_sq; b = 2.0*(ray_start[X]*ray_dir[X] - + ray_start[Y]*ray_dir[Y] - - ray_start[Z]*ray_dir[Z]*pipe->pipe_ridiff_sq - - ray_dir[Z]*pipe->pipe_ribase*pipe->pipe_ridiff); + + ray_start[Y]*ray_dir[Y] + - ray_start[Z]*ray_dir[Z]*pipe->pipe_ridiff_sq + - ray_dir[Z]*pipe->pipe_ribase*pipe->pipe_ridiff); c = ray_start[X]*ray_start[X] - + ray_start[Y]*ray_start[Y] - - pipe->pipe_ribase*pipe->pipe_ribase - - ray_start[Z]*ray_start[Z]*pipe->pipe_ridiff_sq - - 2.0*ray_start[Z]*pipe->pipe_ribase*pipe->pipe_ridiff; + + ray_start[Y]*ray_start[Y] + - pipe->pipe_ribase*pipe->pipe_ribase + - ray_start[Z]*ray_start[Z]*pipe->pipe_ridiff_sq + - 2.0*ray_start[Z]*pipe->pipe_ribase*pipe->pipe_ridiff; descrim = b*b - 4.0*a*c; - if ( descrim > 0.0 ) { - fastf_t sqrt_descrim; - point_t hit_pt; + if (descrim > 0.0) { + fastf_t sqrt_descrim; + point_t hit_pt; - sqrt_descrim = sqrt( descrim ); + sqrt_descrim = sqrt(descrim); t_tmp = (-b - sqrt_descrim)/(2.0*a); - VJOIN1( hit_pt, ray_start, t_tmp, ray_dir ); - if ( hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0 ) { + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; - VMOVE( hitp->hit_vpriv, hit_pt ); + VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-pipe->pipe_ribase - hit_pt[Z] * pipe->pipe_ridiff) * - pipe->pipe_ridiff; + pipe->pipe_ridiff; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } t_tmp = (-b + sqrt_descrim)/(2.0*a); - VJOIN1( hit_pt, ray_start, t_tmp, ray_dir ); - if ( hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0 ) { + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; - VMOVE( hitp->hit_vpriv, hit_pt ); + VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-pipe->pipe_ribase - hit_pt[Z] * pipe->pipe_ridiff) * - pipe->pipe_ridiff; + pipe->pipe_ridiff; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } @@ -1023,67 +1030,66 @@ } HIDDEN void -pipe_start_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct id_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) { +pipe_start_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct id_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) +{ point_t hit_pt; fastf_t t_tmp; fastf_t radius_sq; struct hit *hitp; - - - if ( !pipe->pipe_is_bend ) { + + if (!pipe->pipe_is_bend) { struct lin_pipe *lin=(struct lin_pipe *)(&pipe->l); fastf_t dist_to_plane; fastf_t norm_dist; fastf_t slant_factor; - dist_to_plane = VDOT( lin->pipe_H, lin->pipe_V ); - norm_dist = dist_to_plane - VDOT( lin->pipe_H, rp->r_pt ); - slant_factor = VDOT( lin->pipe_H, rp->r_dir ); - if ( !NEAR_ZERO( slant_factor, SMALL_FASTF ) ) { + dist_to_plane = VDOT(lin->pipe_H, lin->pipe_V); + norm_dist = dist_to_plane - VDOT(lin->pipe_H, rp->r_pt); + slant_factor = VDOT(lin->pipe_H, rp->r_dir); + if (!NEAR_ZERO(slant_factor, SMALL_FASTF)) { vect_t to_center; t_tmp = norm_dist/slant_factor; - VJOIN1( hit_pt, rp->r_pt, t_tmp, rp->r_dir ); - VSUB2( to_center, lin->pipe_V, hit_pt ); - radius_sq = MAGSQ( to_center ); - if ( radius_sq <= lin->pipe_robase_sq && radius_sq >= lin->pipe_ribase_sq ) { + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, lin->pipe_V, hit_pt); + radius_sq = MAGSQ(to_center); + if (radius_sq <= lin->pipe_robase_sq && radius_sq >= lin->pipe_ribase_sq) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_BASE; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } } - } - else if ( pipe->pipe_is_bend ) { + } else if (pipe->pipe_is_bend) { struct bend_pipe *bend=(struct bend_pipe *)(&pipe->l); fastf_t dist_to_plane; fastf_t norm_dist; fastf_t slant_factor; - dist_to_plane = VDOT( bend->bend_rb, bend->bend_start ); - norm_dist = dist_to_plane - VDOT( bend->bend_rb, rp->r_pt ); - slant_factor = VDOT( bend->bend_rb, rp->r_dir ); + dist_to_plane = VDOT(bend->bend_rb, bend->bend_start); + norm_dist = dist_to_plane - VDOT(bend->bend_rb, rp->r_pt); + slant_factor = VDOT(bend->bend_rb, rp->r_dir); - if ( !NEAR_ZERO( slant_factor, SMALL_FASTF ) ) { + if (!NEAR_ZERO(slant_factor, SMALL_FASTF)) { vect_t to_center; t_tmp = norm_dist/slant_factor; - VJOIN1( hit_pt, rp->r_pt, t_tmp, rp->r_dir ); - VSUB2( to_center, bend->bend_start, hit_pt ); - radius_sq = MAGSQ( to_center ); - if ( radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir ) { + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, bend->bend_start, hit_pt); + radius_sq = MAGSQ(to_center); + if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; hitp->hit_surfno = seg_no*10 + PIPE_BEND_BASE; - if( (*hit_count)++ >= RT_PIPE_MAXHITS ) { - bu_log( "Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); return; } } @@ -1092,44 +1098,44 @@ } HIDDEN void -pipe_end_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct id_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) { +pipe_end_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead, struct id_pipe *pipe, struct hit *hits, int *hit_count, int seg_no) +{ point_t hit_pt; fastf_t t_tmp; fastf_t radius_sq; struct hit *hitp; - i... [truncated message content] |
From: <d_r...@us...> - 2009-09-11 09:16:47
|
Revision: 35879 http://brlcad.svn.sourceforge.net/brlcad/?rev=35879&view=rev Author: d_rossberg Date: 2009-09-11 09:16:39 +0000 (Fri, 11 Sep 2009) Log Message: ----------- extended rt_pipe_ck() by a check of inner_diameter < outer_diameter and used this to do the check of a pipe's correctness in rt_pipe_adjust() at the end of the function this way an only temporary invalid pipe segment will not be considered as an error any more Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2009-09-10 18:37:01 UTC (rev 35878) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2009-09-11 09:16:39 UTC (rev 35879) @@ -3520,7 +3520,8 @@ * Check pipe solid. Bend radius must be at least as large as the * outer radius. All bends must have constant diameters. No * consecutive LINEAR sections without BENDS unless the LINEAR - * sections are collinear. + * sections are collinear. Inner diameter must be less than outer + * diameter. */ int rt_pipe_ck(const struct bu_list *headp) @@ -3532,18 +3533,32 @@ fastf_t v2_len=0.0; prev = BU_LIST_FIRST(wdb_pipept, headp); + + if (prev->pp_id >= prev->pp_od) { + bu_log("Inner diameter (%gmm) has to be less than outer diameter (%gmm)\n", + prev->pp_id, prev->pp_od); + error_count++; + } + if (prev->pp_bendradius < prev->pp_od * 0.5) { bu_log("Bend radius (%gmm) is less than outer radius at (%g %g %g)\n", prev->pp_bendradius, V3ARGS(prev->pp_coord)); error_count++; } + cur = BU_LIST_NEXT(wdb_pipept, &prev->l); next = BU_LIST_NEXT(wdb_pipept, &cur->l); while (BU_LIST_NOT_HEAD(&next->l, headp)) { vect_t v1, v2, norm; fastf_t v1_len; fastf_t angle; - + + if (cur->pp_id >= cur->pp_od) { + bu_log("Inner diameter (%gmm) has to be less than outer diameter (%gmm)\n", + cur->pp_id, cur->pp_od); + error_count++; + } + if (cur->pp_bendradius < cur->pp_od * 0.5) { bu_log("Bend radius (%gmm) is less than outer radius at (%g %g %g)\n", cur->pp_bendradius, V3ARGS(cur->pp_coord)); @@ -3595,7 +3610,13 @@ cur = next; next = BU_LIST_NEXT(wdb_pipept, &cur->l); } - + + if (cur->pp_id >= cur->pp_od) { + bu_log("Inner diameter (%gmm) has to be less than outer diameter (%gmm)\n", + cur->pp_id, cur->pp_od); + error_count++; + } + if (old_bend_dist > v2_len) { error_count++; bu_log("last segment (%g %g %g) to (%g %g %g) is too short to allow\n", @@ -3787,12 +3808,7 @@ Tcl_DecrRefCount(list); break; case 'I': - tmp = atof(argv[1]); - if (tmp >= ptp->pp_od) { - bu_vls_printf(log, "inner diameter must be less than outer diameter"); - return BRLCAD_ERROR; - } - ptp->pp_id = tmp; + ptp->pp_id = atof(argv[1]); break; case 'O': tmp = atof(argv[1]); @@ -3800,19 +3816,10 @@ bu_vls_printf(log, "outer diameter cannot be 0.0 or less"); return BRLCAD_ERROR; } - if (tmp <= ptp->pp_id) { - bu_vls_printf(log, "outer diameter must be greater than inner diameter"); - return BRLCAD_ERROR; - } ptp->pp_od = tmp; break; case 'R': - tmp = atof(argv[1]); - if (tmp < ptp->pp_od * 0.5) { - bu_vls_printf(log, "cannot set bend radius to less than outer radius"); - return BRLCAD_ERROR; - } - ptp->pp_bendradius = tmp; + ptp->pp_bendradius = atof(argv[1]); break; default: bu_vls_printf(log, "unrecognized attribute, choices are V, I, O, or R"); @@ -3823,7 +3830,7 @@ argv += 2; } - return(TCL_OK); + return (rt_pipe_ck(&pipe->pipe_segs_head) == 0) ? TCL_OK : BRLCAD_ERROR; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <joh...@us...> - 2010-06-20 21:28:20
|
Revision: 39628 http://brlcad.svn.sourceforge.net/brlcad/?rev=39628&view=rev Author: johnranderson Date: 2010-06-20 21:28:14 +0000 (Sun, 20 Jun 2010) Log Message: ----------- tessellate_pipe_bend() was not able to handle cases where the bend radius equals the outer radius of the pipe. The problem was that such a situation produces degenerate faces. The fix was to add a vertex tree and a vertex array to help in identifying and skipping the degenerate faces. This fixes bug ID#3013742. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2010-06-19 00:56:35 UTC (rev 39627) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2010-06-20 21:28:14 UTC (rev 39628) @@ -2589,6 +2589,8 @@ { struct vertex **new_outer_loop; struct vertex **new_inner_loop; + struct vert_root *vertex_tree; + struct vertex **vertex_array; fastf_t bend_radius; fastf_t bend_angle; fastf_t x, y, xnew, ynew; @@ -2608,11 +2610,12 @@ int bend_segs=1; /* minimum number of edges along bend */ int bend_seg; int tol_segs; - int i, j; + int i, j, k; NMG_CK_SHELL(s); BN_CK_TOL(tol); RT_CK_TESS_TOL(ttol); + vertex_tree = create_vert_tree(); VMOVE(r1, start_r1); VMOVE(r2, start_r2); @@ -2652,6 +2655,15 @@ if (tol_segs > bend_segs) bend_segs = tol_segs; } + + /* add starting loops to the vertex tree */ + vertex_array = bu_calloc((bend_segs+1) * arc_segs , sizeof( struct vertex *), "vertex array in pipe.c"); + for (i=0 ; i<arc_segs ; i++) { + struct vertex *v = (*outer_loop)[i]; + struct vertex_g *vg = v->vg_p; + j= Add_vert(vg->coord[X], vg->coord[Y], vg->coord[Z], vertex_tree, tol->dist_sq); + vertex_array[j] = v; + } delta_angle = bend_angle/(fastf_t)(bend_segs); @@ -2683,124 +2695,147 @@ j = i+1; if (j == arc_segs) j = 0; + + VJOIN2(pt, center, x, r1, y, r2); + k = Add_vert(pt[X], pt[Y], pt[Z], vertex_tree, tol->dist_sq); verts[0] = &(*outer_loop)[j]; verts[1] = &(*outer_loop)[i]; verts[2] = &new_outer_loop[i]; - - if ((fu=nmg_cmface(s, verts, 3)) == NULL) { - bu_log("tesselate_pipe_bend(): nmg_cmface failed\n"); - bu_bomb("tesselate_pipe_bend\n"); - } - VJOIN2(pt, center, x, r1, y, r2); - if (!new_outer_loop[i]->vg_p) - nmg_vertex_gv(new_outer_loop[i], pt); - if (nmg_calc_face_g(fu)) { - bu_log("tesselate_pipe_bend: nmg_calc_face_g failed\n"); - nmg_kfu(fu); - } else { - struct loopuse *lu; - struct edgeuse *eu; - - NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) - fu = fu->fumate_p; - - lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); - for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { - struct edgeuse *eu_opp_use; - - NMG_CK_EDGEUSE(eu); - eu_opp_use = BU_LIST_PNEXT_CIRC(edgeuse, &eu->eumate_p->l); - - if (eu->vu_p->v_p == (*outer_loop)[j]) { - VSUB2(norm, (*outer_loop)[j]->vg_p->coord, old_center); - VUNITIZE(norm); - nmg_vertexuse_nv(eu->vu_p, norm); - VREVERSE(norm, norm); - nmg_vertexuse_nv(eu_opp_use->vu_p, norm); - } else if (eu->vu_p->v_p == (*outer_loop)[i]) { - VSUB2(norm, (*outer_loop)[i]->vg_p->coord, old_center); - VUNITIZE(norm); - nmg_vertexuse_nv(eu->vu_p, norm); - VREVERSE(norm, norm); - nmg_vertexuse_nv(eu_opp_use->vu_p, norm); - } else if (eu->vu_p->v_p == new_outer_loop[i]) { - VSUB2(norm, new_outer_loop[i]->vg_p->coord, center); - VUNITIZE(norm); - nmg_vertexuse_nv(eu->vu_p, norm); - VREVERSE(norm, norm); - nmg_vertexuse_nv(eu_opp_use->vu_p, norm); - } else { - bu_log("No vu_normal assigned at (%g %g %g)\n", V3ARGS(eu->vu_p->v_p->vg_p->coord)); - bu_log("\ti=%d, j=%d, arc_segs=%d, fu = x%x\n", i, j, arc_segs, fu); - } - } - } - + + if (i != j && j != k && i != k) { + if ((fu = nmg_cmface(s, verts, 3)) == NULL) { + bu_log("tesselate_pipe_bend(): nmg_cmface failed\n"); + bu_bomb("tesselate_pipe_bend\n"); + } + if (!new_outer_loop[i]->vg_p) { + nmg_vertex_gv(new_outer_loop[i], pt); + } + if (nmg_calc_face_g(fu)) { + bu_log("tesselate_pipe_bend: nmg_calc_face_g failed\n"); + nmg_kfu(fu); + } else { + struct loopuse *lu; + struct edgeuse *eu; + + vertex_array[k] = new_outer_loop[i]; + + NMG_CK_FACEUSE(fu); + if (fu->orientation != OT_SAME) + fu = fu->fumate_p; + + lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); + for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { + struct edgeuse *eu_opp_use; + + NMG_CK_EDGEUSE(eu); + eu_opp_use = BU_LIST_PNEXT_CIRC(edgeuse, &eu->eumate_p->l); + + if (eu->vu_p->v_p == (*outer_loop)[j]) { + VSUB2(norm, (*outer_loop)[j]->vg_p->coord, old_center); + VUNITIZE(norm); + nmg_vertexuse_nv(eu->vu_p, norm); + VREVERSE(norm, norm); + nmg_vertexuse_nv(eu_opp_use->vu_p, norm); + } else if (eu->vu_p->v_p == (*outer_loop)[i]) { + VSUB2(norm, (*outer_loop)[i]->vg_p->coord, old_center); + VUNITIZE(norm); + nmg_vertexuse_nv(eu->vu_p, norm); + VREVERSE(norm, norm); + nmg_vertexuse_nv(eu_opp_use->vu_p, norm); + } else if (eu->vu_p->v_p == new_outer_loop[i]) { + VSUB2(norm, new_outer_loop[i]->vg_p->coord, center); + VUNITIZE(norm); + nmg_vertexuse_nv(eu->vu_p, norm); + VREVERSE(norm, norm); + nmg_vertexuse_nv(eu_opp_use->vu_p, norm); + } else { + bu_log("No vu_normal assigned at (%g %g %g)\n", V3ARGS(eu->vu_p->v_p->vg_p->coord)); + bu_log("\ti=%d, j=%d, arc_segs=%d, fu = x%x\n", i, j, arc_segs, fu); + } + } + } + } else { + verts[2] = &vertex_array[k]; + new_outer_loop[i] = vertex_array[k]; + } + xnew = x*cos_del - y*sin_del; ynew = x*sin_del + y*cos_del; x = xnew; y = ynew; + + VJOIN2(pt, center, x, r1, y, r2); + k = Add_vert(pt[X], pt[Y], pt[Z], vertex_tree, tol->dist_sq); verts[1] = verts[2]; verts[2] = &new_outer_loop[j]; - - if ((fu=nmg_cmface(s, verts, 3)) == NULL) { - bu_log("tesselate_pipe_bend(): nmg_cmface failed\n"); - bu_bomb("tesselate_pipe_bend\n"); - } - VJOIN2(pt, center, x, r1, y, r2); - if (!(*verts[2])->vg_p) - nmg_vertex_gv(*verts[2], pt); - if (nmg_calc_face_g(fu)) { - bu_log("tesselate_pipe_bend: nmg_calc_face_g failed\n"); - nmg_kfu(fu); - } else { - struct loopuse *lu; - struct edgeuse *eu; - - NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) - fu = fu->fumate_p; - - lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); - for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { - struct edgeuse *eu_opp_use; - - NMG_CK_EDGEUSE(eu); - eu_opp_use = BU_LIST_PNEXT_CIRC(edgeuse, &eu->eumate_p->l); - - if (eu->vu_p->v_p == (*outer_loop)[j]) { - VSUB2(norm, (*outer_loop)[j]->vg_p->coord, old_center); - VUNITIZE(norm); - nmg_vertexuse_nv(eu->vu_p, norm); - VREVERSE(norm, norm); - nmg_vertexuse_nv(eu_opp_use->vu_p, norm); - } else if (eu->vu_p->v_p == new_outer_loop[i]) { - VSUB2(norm, new_outer_loop[i]->vg_p->coord, center); - VUNITIZE(norm); - nmg_vertexuse_nv(eu->vu_p, norm); - VREVERSE(norm, norm); - nmg_vertexuse_nv(eu_opp_use->vu_p, norm); - } else if (eu->vu_p->v_p == new_outer_loop[j]) { - VSUB2(norm, new_outer_loop[j]->vg_p->coord, center); - VUNITIZE(norm); - nmg_vertexuse_nv(eu->vu_p, norm); - VREVERSE(norm, norm); - nmg_vertexuse_nv(eu_opp_use->vu_p, norm); - } else { - bu_log("No vu_normal assigned at (%g %g %g)\n", V3ARGS(eu->vu_p->v_p->vg_p->coord)); - bu_log("\ti=%d, j=%d, arc_segs=%d, fu = x%x\n", i, j, arc_segs, fu); - } - } - } + + if (i != j && j != k && i != k) { + if ((fu = nmg_cmface(s, verts, 3)) == NULL) { + bu_log("tesselate_pipe_bend(): nmg_cmface failed\n"); + bu_bomb("tesselate_pipe_bend\n"); + } + if (!(*verts[2])->vg_p) { + nmg_vertex_gv(*verts[2], pt); + } + if (nmg_calc_face_g(fu)) { + bu_log("tesselate_pipe_bend: nmg_calc_face_g failed\n"); + nmg_kfu(fu); + } else { + struct loopuse *lu; + struct edgeuse *eu; + + vertex_array[k] = new_outer_loop[j]; + + NMG_CK_FACEUSE(fu); + if (fu->orientation != OT_SAME) + fu = fu->fumate_p; + + lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); + for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { + struct edgeuse *eu_opp_use; + + NMG_CK_EDGEUSE(eu); + eu_opp_use = BU_LIST_PNEXT_CIRC(edgeuse, &eu->eumate_p->l); + + if (eu->vu_p->v_p == (*outer_loop)[j]) { + VSUB2(norm, (*outer_loop)[j]->vg_p->coord, old_center); + VUNITIZE(norm); + nmg_vertexuse_nv(eu->vu_p, norm); + VREVERSE(norm, norm); + nmg_vertexuse_nv(eu_opp_use->vu_p, norm); + } else if (eu->vu_p->v_p == new_outer_loop[i]) { + VSUB2(norm, new_outer_loop[i]->vg_p->coord, center); + VUNITIZE(norm); + nmg_vertexuse_nv(eu->vu_p, norm); + VREVERSE(norm, norm); + nmg_vertexuse_nv(eu_opp_use->vu_p, norm); + } else if (eu->vu_p->v_p == new_outer_loop[j]) { + VSUB2(norm, new_outer_loop[j]->vg_p->coord, center); + VUNITIZE(norm); + nmg_vertexuse_nv(eu->vu_p, norm); + VREVERSE(norm, norm); + nmg_vertexuse_nv(eu_opp_use->vu_p, norm); + } else { + bu_log("No vu_normal assigned at (%g %g %g)\n", V3ARGS(eu->vu_p->v_p->vg_p->coord)); + bu_log("\ti=%d, j=%d, arc_segs=%d, fu = x%x\n", i, j, arc_segs, fu); + } + } + } + } else { + verts[2] = &vertex_array[k]; + new_outer_loop[j] = vertex_array[k]; + } } bu_free((char *)(*outer_loop), "tesselate_pipe_bend: outer_loop"); *outer_loop = new_outer_loop; VMOVE(old_center, center); } + free_vert_tree(vertex_tree); + bu_free((char *)vertex_tree, "vertex tree root"); + bu_free((char *)vertex_array, "vertex array in pipe.c"); if (ir <= tol->dist) { VMOVE(start_r1, r1); @@ -2832,20 +2867,20 @@ struct faceuse *fu; struct vertex **verts[3]; point_t pt; - + j = i + 1; if (j == arc_segs) j = 0; - + + VJOIN2(pt, center, x, r1, y, r2); verts[0] = &(*inner_loop)[i]; verts[1] = &(*inner_loop)[j]; verts[2] = &new_inner_loop[i]; - + if ((fu=nmg_cmface(s, verts, 3)) == NULL) { bu_log("tesselate_pipe_bend(): nmg_cmface failed\n"); bu_bomb("tesselate_pipe_bend\n"); } - VJOIN2(pt, center, x, r1, y, r2); if (!new_inner_loop[i]->vg_p) nmg_vertex_gv(new_inner_loop[i], pt); if (nmg_calc_face_g(fu)) { @@ -2895,15 +2930,15 @@ ynew = x*sin_del + y*cos_del; x = xnew; y = ynew; + VJOIN2(pt, center, x, r1, y, r2); verts[0] = verts[2]; verts[2] = &new_inner_loop[j]; - + if ((fu=nmg_cmface(s, verts, 3)) == NULL) { bu_log("tesselate_pipe_bend(): nmg_cmface failed\n"); bu_bomb("tesselate_pipe_bend\n"); } - VJOIN2(pt, center, x, r1, y, r2); if (!(*verts[2])->vg_p) nmg_vertex_gv(*verts[2], pt); if (nmg_calc_face_g(fu)) { @@ -2947,8 +2982,8 @@ bu_log("\ti=%d, j=%d, arc_segs=%d, fu = x%x\n", i, j, arc_segs, fu); } } - } - } + } + } bu_free((char *)(*inner_loop), "tesselate_pipe_bend: inner_loop"); *inner_loop = new_inner_loop; VMOVE(old_center, center); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <r_...@us...> - 2010-12-10 00:25:46
|
Revision: 41572 http://brlcad.svn.sourceforge.net/brlcad/?rev=41572&view=rev Author: r_weiss Date: 2010-12-10 00:25:36 +0000 (Fri, 10 Dec 2010) Log Message: ----------- Updated function rt_pipe_tess. Changed some tolerances that were preventing some pipe bends from tesselating. Also changed some compares from 0.0 to SMALL_FASTF which could be causing problems. These changes improved 'ev' and 'facetize' for the sample model 'toyjeep.g'. Further testing is necessary but I believe these changes will show improvement in other models containing pipes. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2010-12-09 20:36:18 UTC (rev 41571) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2010-12-10 00:25:36 UTC (rev 41572) @@ -3109,7 +3109,7 @@ /* find max diameter */ for (BU_LIST_FOR(pp1, wdb_pipept, &pip->pipe_segs_head)) { - if (pp1->pp_od > 0.0 && pp1->pp_od > max_diam) + if (pp1->pp_od > SMALL_FASTF && pp1->pp_od > max_diam) max_diam = pp1->pp_od; VMINMAX(min_pt, max_pt, pp1->pp_coord); @@ -3123,17 +3123,17 @@ pipe_size = MAGNITUDE(min_to_max); /* calculate number of segments for circles */ - if (ttol->abs > 0.0 && ttol->abs * 2.0 < max_diam) { + if (ttol->abs > SMALL_FASTF && ttol->abs * 2.0 < max_diam) { tol_segs = ceil(bn_pi/acos(1.0 - 2.0 * ttol->abs/max_diam)); if (tol_segs > arc_segs) arc_segs = tol_segs; } - if (ttol->rel > 0.0 && 2.0 * ttol->rel * pipe_size < max_diam) { + if (ttol->rel > SMALL_FASTF && 2.0 * ttol->rel * pipe_size < max_diam) { tol_segs = ceil(bn_pi/acos(1.0 - 2.0 * ttol->rel*pipe_size/max_diam)); if (tol_segs > arc_segs) arc_segs = tol_segs; } - if (ttol->norm > 0.0) { + if (ttol->norm > SMALL_FASTF) { tol_segs = ceil(bn_pi/ttol->norm); if (tol_segs > arc_segs) arc_segs = tol_segs; @@ -3173,7 +3173,7 @@ point_t bend_start, bend_end, bend_center; VSUB2(n1, curr_pt, pp2->pp_coord); - if (VNEAR_ZERO(n1, SQRT_SMALL_FASTF)) { + if (VNEAR_ZERO(n1, VUNITIZE_TOL)) { /* duplicate point, skip to next point */ goto next_pt; } @@ -3188,7 +3188,7 @@ VSUB2(n2, pp3->pp_coord, pp2->pp_coord); VCROSS(norm, n1, n2); - if (VNEAR_ZERO(norm, SQRT_SMALL_FASTF)) { + if (VNEAR_ZERO(norm, VUNITIZE_TOL)) { /* points are colinear, treat as a linear segment */ tesselate_pipe_linear(curr_pt, curr_od/2.0, curr_id/2.0, pp2->pp_coord, pp2->pp_od/2.0, pp2->pp_id/2.0, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2011-03-04 14:15:38
|
Revision: 43682 http://brlcad.svn.sourceforge.net/brlcad/?rev=43682&view=rev Author: starseeker Date: 2011-03-04 14:15:32 +0000 (Fri, 04 Mar 2011) Log Message: ----------- acos isn't happy if we go outside the domain -1,1 and it looks like floating point fuzz is taking us inside in some cases and out in others - peg it to -1 or 1 if we're within VUNITIZE_TOL to avoid uncertainty principle effects in conversion behavior Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 13:50:39 UTC (rev 43681) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 14:15:32 UTC (rev 43682) @@ -3606,6 +3606,7 @@ vect_t v1, v2, norm; fastf_t v1_len; fastf_t angle; + fastf_t local_vdot; if (cur->pp_id >= cur->pp_od) { bu_log("Inner diameter (%gmm) has to be less than outer diameter (%gmm)\n", @@ -3647,17 +3648,26 @@ goto next_pt; } - angle = bn_pi - acos(VDOT(v1, v2)); + local_vdot = VDOT(v1, v2); + if (NEAR_ZERO(local_vdot + 1.0, VUNITIZE_TOL)) local_vdot = -1.0; + if (NEAR_ZERO(local_vdot - 1.0, VUNITIZE_TOL)) local_vdot = 1.0; + angle = bn_pi - acos(local_vdot); new_bend_dist = cur->pp_bendradius * tan(angle/2.0); if (new_bend_dist + old_bend_dist > v1_len) { + fastf_t vdot; error_count++; bu_log("Bend radii (%gmm) at (%g %g %g) and (%gmm) at (%g %g %g) are too large\n", prev->pp_bendradius, V3ARGS(prev->pp_coord), cur->pp_bendradius, V3ARGS(cur->pp_coord)); bu_log("for pipe segment between (%g %g %g) and (%g %g %g)\n", V3ARGS(prev->pp_coord), V3ARGS(cur->pp_coord)); - } + bu_log("failed test: %g + %g > %g\n", new_bend_dist, old_bend_dist, v1_len); + vdot = VDOT(v1, v2); + bu_log("angle(%g) = bn_pi(%g) - acos(VDOT(v1, v2)(%g))(%g)\n", angle, bn_pi, vdot, acos(vdot)); + bu_log("v1: %g,%g,%g\n", v1[0], v1[1], v1[2]); + bu_log("v2: %g,%g,%g\n", v2[0], v2[1], v2[2]); + } next_pt: old_bend_dist = new_bend_dist; prev = cur; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-03-04 15:39:18
|
Revision: 43685 http://brlcad.svn.sourceforge.net/brlcad/?rev=43685&view=rev Author: brlcad Date: 2011-03-04 15:39:12 +0000 (Fri, 04 Mar 2011) Log Message: ----------- why there are custom blocks of code to unitize the vector instead of calling VUNITIZE() is curious and potentially related to the fuzzy instability. regardless, tweak the dot product result if it just barely over/under-shoots due to precision problems. using NEAR_ZERO/NEAR_EQUAL here isn't optimal since it'll clamp values already within the valid [1.0,-1.0] range to the limit of that range. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 15:22:06 UTC (rev 43684) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 15:39:12 UTC (rev 43685) @@ -3621,26 +3621,10 @@ } VSUB2(v1, prev->pp_coord, cur->pp_coord); - v1_len = MAGNITUDE(v1); - if (v1_len > VDIVIDE_TOL) { - fastf_t inv_len; - - inv_len = 1.0/v1_len; - VSCALE(v1, v1, inv_len); - } else { - VSETALL(v1, 0.0); - } + VUNITIZE(v1); VSUB2(v2, next->pp_coord, cur->pp_coord); - v2_len = MAGNITUDE(v2); - if (v2_len > VDIVIDE_TOL) { - fastf_t inv_len; - - inv_len = 1.0/v2_len; - VSCALE(v2, v2, inv_len); - } else { - VSETALL(v2, 0.0); - } + VUNITIZE(v2); VCROSS(norm, v1, v2); if (VNEAR_ZERO(norm, SQRT_SMALL_FASTF)) { @@ -3649,8 +3633,12 @@ } local_vdot = VDOT(v1, v2); - if (NEAR_ZERO(local_vdot + 1.0, VUNITIZE_TOL)) local_vdot = -1.0; - if (NEAR_ZERO(local_vdot - 1.0, VUNITIZE_TOL)) local_vdot = 1.0; + /* protect against fuzzy overflow/underflow */ + if (local_vdot > 1.0 && local_vdot < 1.0+VUNITIZE_TOL) + local_vdot = 1.0; + if (local_vdot < -1.0 && local_vdot > -1.0-VUNITIZE_TOL) + local_vdot = -1.0; + angle = bn_pi - acos(local_vdot); new_bend_dist = cur->pp_bendradius * tan(angle/2.0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-03-04 15:44:54
|
Revision: 43686 http://brlcad.svn.sourceforge.net/brlcad/?rev=43686&view=rev Author: brlcad Date: 2011-03-04 15:44:47 +0000 (Fri, 04 Mar 2011) Log Message: ----------- still need the lengths of v1/v2 for subsequent input validation Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 15:39:12 UTC (rev 43685) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 15:44:47 UTC (rev 43686) @@ -3621,9 +3621,11 @@ } VSUB2(v1, prev->pp_coord, cur->pp_coord); + v1_len = MAGNITUDE(v1); VUNITIZE(v1); VSUB2(v2, next->pp_coord, cur->pp_coord); + v2_len = MAGNITUDE(v2); VUNITIZE(v2); VCROSS(norm, v1, v2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-03-04 16:00:56
|
Revision: 43687 http://brlcad.svn.sourceforge.net/brlcad/?rev=43687&view=rev Author: brlcad Date: 2011-03-04 16:00:48 +0000 (Fri, 04 Mar 2011) Log Message: ----------- daniel has a good point, they're already unit so no harm saying anything outside of range is clamped to the range limit Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 15:44:47 UTC (rev 43686) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 16:00:48 UTC (rev 43687) @@ -3635,10 +3635,13 @@ } local_vdot = VDOT(v1, v2); - /* protect against fuzzy overflow/underflow */ - if (local_vdot > 1.0 && local_vdot < 1.0+VUNITIZE_TOL) + /* protect against fuzzy overflow/underflow, clamp unitized + * vectors in order to prevent acos() from throwing an + * exception (or crashing). + */ + if (local_vdot > 1.0) local_vdot = 1.0; - if (local_vdot < -1.0 && local_vdot > -1.0-VUNITIZE_TOL) + if (local_vdot < -1.0) local_vdot = -1.0; angle = bn_pi - acos(local_vdot); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-03-04 16:06:31
|
Revision: 43688 http://brlcad.svn.sourceforge.net/brlcad/?rev=43688&view=rev Author: brlcad Date: 2011-03-04 16:06:25 +0000 (Fri, 04 Mar 2011) Log Message: ----------- um, call CLAMP() dummy Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 16:00:48 UTC (rev 43687) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-03-04 16:06:25 UTC (rev 43688) @@ -3639,10 +3639,7 @@ * vectors in order to prevent acos() from throwing an * exception (or crashing). */ - if (local_vdot > 1.0) - local_vdot = 1.0; - if (local_vdot < -1.0) - local_vdot = -1.0; + CLAMP(local_vdot, -1.0, 1.0); angle = bn_pi - acos(local_vdot); new_bend_dist = cur->pp_bendradius * tan(angle/2.0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2011-08-19 00:52:58
|
Revision: 46280 http://brlcad.svn.sourceforge.net/brlcad/?rev=46280&view=rev Author: starseeker Date: 2011-08-19 00:52:51 +0000 (Fri, 19 Aug 2011) Log Message: ----------- Make the minimal changes to be able to add a bbox function for pipe that doesn't pass an stp pointer. Undoubtedly more optimization could be done here - the bbox process doesn't need to malloc and free the lp/bp storage, at least in principle) but for now go simple. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-08-19 00:34:02 UTC (rev 46279) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-08-19 00:52:51 UTC (rev 46280) @@ -98,7 +98,7 @@ }; -#define PIPE_MM(_v) VMINMAX(stp->st_min, stp->st_max, _v); +#define PIPE_MM(_v) VMINMAX((*min), (*max), _v); #define ARC_SEGS 16 /* number of segments used to plot a circle */ @@ -116,10 +116,10 @@ HIDDEN int -rt_bend_pipe_prep(struct soltab *stp, struct bu_list *head, fastf_t *bend_center, +rt_bend_pipe_prep(struct bu_list *head, fastf_t *bend_center, fastf_t *bend_start, fastf_t *bend_end, fastf_t bend_radius, fastf_t bend_angle, fastf_t od, fastf_t id, - fastf_t prev_od, fastf_t next_od) + fastf_t prev_od, fastf_t next_od, point_t *min, point_t *max) { struct bend_pipe *bp; vect_t to_start, to_end; @@ -204,16 +204,20 @@ work[Y] += f; work[Z] += f; PIPE_MM(work); - - BU_LIST_INSERT(head, &bp->l); - + + if (head) { + BU_LIST_INSERT(head, &bp->l); + } else { + bu_free(bp, "free pipe bbox bp struct"); + } + return 0; } HIDDEN void -rt_linear_pipe_prep(struct soltab *stp, struct bu_list *head, fastf_t *pt1, fastf_t id1, fastf_t od1, fastf_t *pt2, fastf_t id2, fastf_t od2) +rt_linear_pipe_prep(struct bu_list *head, fastf_t *pt1, fastf_t id1, fastf_t od1, fastf_t *pt2, fastf_t id2, fastf_t od2, point_t *min, point_t *max) { struct lin_pipe *lp; mat_t R; @@ -224,9 +228,7 @@ vect_t v1, v2; lp = (struct lin_pipe *)bu_malloc(sizeof(struct lin_pipe), "rt_bend_pipe_prep:pipe"); - BU_LIST_INSERT(head, &lp->l); - VMOVE(lp->pipe_V, pt1); VSUB2(seg_ht, pt2, pt1); @@ -296,9 +298,115 @@ PIPE_MM(work) VMINMAX(lp->pipe_min, lp->pipe_max, work); + if (head) { + BU_LIST_INSERT(head, &lp->l); + } else { + bu_free(lp, "free pipe bb lp segment"); + } } +/** + * R T _ P I P E _ B B O X + * + * Calculate a bounding RPP for a pipe + */ +int +rt_pipe_bbox(struct rt_db_internal *ip, point_t *min, point_t *max) { + struct rt_pipe_internal *pip; + struct wdb_pipept *pp1, *pp2, *pp3; + point_t curr_pt; + fastf_t curr_id, curr_od; + RT_CK_DB_INTERNAL(ip); + pip = (struct rt_pipe_internal *)ip->idb_ptr; + RT_PIPE_CK_MAGIC(pip); + + if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) + return 0; + + pp1 = BU_LIST_FIRST(wdb_pipept, &(pip->pipe_segs_head)); + pp2 = BU_LIST_NEXT(wdb_pipept, &pp1->l); + if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) + return 0; + pp3 = BU_LIST_NEXT(wdb_pipept, &pp2->l); + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + pp3 = (struct wdb_pipept *)NULL; + + VMOVE(curr_pt, pp1->pp_coord); + curr_od = pp1->pp_od; + curr_id = pp1->pp_id; + while (1) { + vect_t n1, n2; + vect_t norm; + vect_t v1; + vect_t diff; + fastf_t angle; + fastf_t dist_to_bend; + point_t bend_start, bend_end, bend_center; + + VSUB2(n1, curr_pt, pp2->pp_coord); + if (VNEAR_ZERO(n1, RT_LEN_TOL)) { + /* duplicate point, skip to next point */ + goto next_pt; + } + + if (!pp3) { + /* last segment */ + rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, min, max); + break; + } + + VSUB2(n2, pp3->pp_coord, pp2->pp_coord); + VCROSS(norm, n1, n2); + VUNITIZE(n1); + VUNITIZE(n2); + angle = bn_pi - acos(VDOT(n1, n2)); + dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); + if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { + /* points are colinear, treat as a linear segment */ + rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, + pp2->pp_coord, pp2->pp_id, pp2->pp_od, min, max); + VMOVE(curr_pt, pp2->pp_coord); + goto next_pt; + } + + VJOIN1(bend_start, pp2->pp_coord, dist_to_bend, n1); + VJOIN1(bend_end, pp2->pp_coord, dist_to_bend, n2); + + VUNITIZE(norm); + + /* linear section */ + VSUB2(diff, curr_pt, bend_start); + if (MAGNITUDE(diff) <= RT_LEN_TOL) { + /* do not make linear sections that are too small to raytrace */ + VMOVE(bend_start, curr_pt); + } else { + rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, + bend_start, pp2->pp_id, pp2->pp_od, min, max); + } + + /* and bend section */ + VCROSS(v1, n1, norm); + VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); + rt_bend_pipe_prep(NULL, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, + pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, min, max); + + VMOVE(curr_pt, bend_end); + next_pt: + if (!pp3) break; + curr_id = pp2->pp_id; + curr_od = pp2->pp_od; + pp1 = pp2; + pp2 = pp3; + pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + pp3 = (struct wdb_pipept *)NULL; + } + + return 0; +} + + /** * R T _ P I P E _ P R E P * @@ -364,7 +472,7 @@ if (!pp3) { /* last segment */ - rt_linear_pipe_prep(stp, head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od); + rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); break; } @@ -376,8 +484,8 @@ dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { /* points are colinear, treat as a linear segment */ - rt_linear_pipe_prep(stp, head, curr_pt, curr_id, curr_od, - pp2->pp_coord, pp2->pp_id, pp2->pp_od); + rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, + pp2->pp_coord, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); VMOVE(curr_pt, pp2->pp_coord); goto next_pt; } @@ -393,15 +501,15 @@ /* do not make linear sections that are too small to raytrace */ VMOVE(bend_start, curr_pt); } else { - rt_linear_pipe_prep(stp, head, curr_pt, curr_id, curr_od, - bend_start, pp2->pp_id, pp2->pp_od); + rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, + bend_start, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); } /* and bend section */ VCROSS(v1, n1, norm); VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); - rt_bend_pipe_prep(stp, head, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, - pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od); + rt_bend_pipe_prep(head, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, + pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, &(stp->st_min), &(stp->st_max)); VMOVE(curr_pt, bend_end); next_pt: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-12-01 15:01:22
|
Revision: 47723 http://brlcad.svn.sourceforge.net/brlcad/?rev=47723&view=rev Author: brlcad Date: 2011-12-01 15:01:14 +0000 (Thu, 01 Dec 2011) Log Message: ----------- prevent a pipe tesselation double-free, detected by the conversion script and verbose blather on linux Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-12-01 14:43:31 UTC (rev 47722) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-12-01 15:01:14 UTC (rev 47723) @@ -2678,10 +2678,10 @@ tesselate_pipe_bend(fastf_t *bend_start, fastf_t *bend_end, fastf_t *bend_center, fastf_t or, fastf_t ir, int arc_segs, double sin_del, double cos_del, struct vertex ***outer_loop, struct vertex ***inner_loop, fastf_t *start_r1, fastf_t *start_r2, struct shell *s, const struct bn_tol *tol, const struct rt_tess_tol *ttol) { - struct vertex **new_outer_loop; - struct vertex **new_inner_loop; - struct vert_root *vertex_tree; - struct vertex **vertex_array; + struct vertex **new_outer_loop = NULL; + struct vertex **new_inner_loop = NULL; + struct vert_root *vertex_tree = NULL; + struct vertex **vertex_array = NULL; fastf_t bend_radius; fastf_t bend_angle; fastf_t x, y, xnew, ynew; @@ -2924,9 +2924,11 @@ *outer_loop = new_outer_loop; VMOVE(old_center, center); } + + /* release resources, sanity */ free_vert_tree(vertex_tree); - bu_free((char *)vertex_tree, "vertex tree root"); bu_free((char *)vertex_array, "vertex array in pipe.c"); + vertex_tree = vertex_array = NULL; if (ir <= tol->dist) { VMOVE(start_r1, r1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-12-01 15:16:34
|
Revision: 47724 http://brlcad.svn.sourceforge.net/brlcad/?rev=47724&view=rev Author: brlcad Date: 2011-12-01 15:16:24 +0000 (Thu, 01 Dec 2011) Log Message: ----------- cleanup Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-12-01 15:01:14 UTC (rev 47723) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-12-01 15:16:24 UTC (rev 47724) @@ -305,6 +305,7 @@ } } + /** * R T _ P I P E _ B B O X * @@ -403,7 +404,7 @@ pp3 = (struct wdb_pipept *)NULL; } - return 0; + return 0; } @@ -955,7 +956,7 @@ } - check_discont_radii: +check_discont_radii: /* check for surfaces created by discontinuous changes in radii */ prev = BU_LIST_BACK(id_pipe, &bp->l); if (prev->l.magic != BU_LIST_HEAD_MAGIC) { @@ -2748,7 +2749,7 @@ } /* add starting loops to the vertex tree */ - vertex_array = bu_calloc((bend_segs+1) * arc_segs , sizeof( struct vertex *), "vertex array in pipe.c"); + vertex_array = bu_calloc((bend_segs+1) * arc_segs, sizeof(struct vertex *), "vertex array in pipe.c"); for (i=0 ; i<arc_segs ; i++) { struct vertex *v = (*outer_loop)[i]; struct vertex_g *vg = v->vg_p; @@ -3748,8 +3749,8 @@ bu_log("failed test: %g + %g > %g\n", new_bend_dist, old_bend_dist, v1_len); vdot = VDOT(v1, v2); bu_log("angle(%g) = bn_pi(%g) - acos(VDOT(v1, v2)(%g))(%g)\n", angle, bn_pi, vdot, acos(vdot)); - bu_log("v1: %g,%g,%g\n", v1[0], v1[1], v1[2]); - bu_log("v2: %g,%g,%g\n", v2[0], v2[1], v2[2]); + bu_log("v1: (%g %g %g)\n", V3ARGS(v1)); + bu_log("v2: (%g %g %g)\n", V3ARGS(v2)); } next_pt: old_bend_dist = new_bend_dist; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2011-12-01 18:55:28
|
Revision: 47731 http://brlcad.svn.sourceforge.net/brlcad/?rev=47731&view=rev Author: erikgreenwald Date: 2011-12-01 18:55:20 +0000 (Thu, 01 Dec 2011) Log Message: ----------- split assignments to avoid incompatible pointer error Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-12-01 17:36:36 UTC (rev 47730) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2011-12-01 18:55:20 UTC (rev 47731) @@ -2929,7 +2929,8 @@ /* release resources, sanity */ free_vert_tree(vertex_tree); bu_free((char *)vertex_array, "vertex array in pipe.c"); - vertex_tree = vertex_array = NULL; + vertex_tree = NULL; + vertex_array = NULL; if (ir <= tol->dist) { VMOVE(start_r1, r1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-04-17 01:02:30
|
Revision: 50099 http://brlcad.svn.sourceforge.net/brlcad/?rev=50099&view=rev Author: brlcad Date: 2012-04-17 01:02:20 +0000 (Tue, 17 Apr 2012) Log Message: ----------- big ws messy cleanup. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-04-17 00:57:23 UTC (rev 50098) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-04-17 01:02:20 UTC (rev 50099) @@ -129,13 +129,13 @@ fastf_t max_od; fastf_t max_or; fastf_t max_r; - + bp = (struct bend_pipe *)bu_malloc(sizeof(struct bend_pipe), "rt_bend_pipe_prep:bp"); - + bp->pipe_is_bend = 1; bp->bend_or = od * 0.5; bp->bend_ir = id * 0.5; - + VMOVE(bp->bend_start, bend_start); VMOVE(bp->bend_end, bend_end); VMOVE(bp->bend_V, bend_center); @@ -149,46 +149,46 @@ VCROSS(bp->bend_startNorm, bp->bend_ra, bp->bend_N); VCROSS(bp->bend_endNorm, bp->bend_N, to_end); VUNITIZE(bp->bend_endNorm); - + bp->bend_angle = bend_angle; - + /* angle goes from 0.0 at start to some angle less than PI */ if (bp->bend_angle >= bn_pi) { - bu_log("Error: rt_pipe_prep: Bend section bends through more than 180 degrees\n"); - return 1; + bu_log("Error: rt_pipe_prep: Bend section bends through more than 180 degrees\n"); + return 1; } - + bp->bend_alpha_i = bp->bend_ir/bp->bend_radius; bp->bend_alpha_o = bp->bend_or/bp->bend_radius; - + MAT_IDN(R); VMOVE(&R[0], bp->bend_ra); VMOVE(&R[4], bp->bend_rb); VMOVE(&R[8], bp->bend_N); - + if (bn_mat_inverse(bp->bend_invR, R) == 0) { - bu_free(bp, "rt_bend_pipe_prep:bp"); - return 0; /* there is nothing to bend, that's OK */ + bu_free(bp, "rt_bend_pipe_prep:bp"); + return 0; /* there is nothing to bend, that's OK */ } MAT_COPY(bp->bend_SoR, R); bp->bend_SoR[15] *= bp->bend_radius; - + /* bounding box for entire torus */ /* include od of previous and next segment * to allow for dinscontinuous radii */ max_od = od; if (prev_od > max_od) { - max_od = prev_od; + max_od = prev_od; } if (next_od > max_od) { - max_od = next_od; + max_od = next_od; } max_or = max_od/2.0; max_r = bend_radius + max_or; - + VBLEND2(bp->bend_bound_center, 0.5, bend_start, 0.5, bend_end); bp->bend_bound_radius_sq = max_r * sin(bend_angle/2.0); bp->bend_bound_radius_sq = bp->bend_bound_radius_sq * bp->bend_bound_radius_sq; @@ -204,7 +204,7 @@ work[Y] += f; work[Z] += f; PIPE_MM(work); - + if (head) { BU_LIST_INSERT(head, &bp->l); } else { @@ -212,7 +212,7 @@ } return 0; - + } @@ -226,11 +226,11 @@ point_t work; vect_t seg_ht; vect_t v1, v2; - + lp = (struct lin_pipe *)bu_malloc(sizeof(struct lin_pipe), "rt_bend_pipe_prep:pipe"); VMOVE(lp->pipe_V, pt1); - + VSUB2(seg_ht, pt2, pt1); lp->pipe_ribase = id1/2.0; lp->pipe_ribase_sq = lp->pipe_ribase * lp->pipe_ribase; @@ -245,33 +245,33 @@ lp->pipe_rodiff = lp->pipe_rotop - lp->pipe_robase; lp->pipe_rodiff_sq = lp->pipe_rodiff * lp->pipe_rodiff; lp->pipe_is_bend = 0; - + lp->pipe_len = MAGNITUDE(seg_ht); VSCALE(seg_ht, seg_ht, 1.0/lp->pipe_len); VMOVE(lp->pipe_H, seg_ht); bn_vec_ortho(v1, seg_ht); VCROSS(v2, seg_ht, v1); - + /* build R matrix */ MAT_IDN(R); VMOVE(&R[0], v1); VMOVE(&R[4], v2); VMOVE(&R[8], seg_ht); - + /* Rinv is transpose */ bn_mat_trn(Rinv, R); - + /* Build Scale matrix */ MAT_IDN(S); S[10] = 1.0/lp->pipe_len; - + /* Compute SoR and invRoS */ bn_mat_mul(lp->pipe_SoR, S, R); bn_mat_mul(lp->pipe_invRoS, Rinv, S); - + VSETALL(lp->pipe_min, MAX_FASTF); VSETALL(lp->pipe_max, -MAX_FASTF); - + VJOIN2(work, pt1, od1, v1, od1, v2); PIPE_MM(work) VMINMAX(lp->pipe_min, lp->pipe_max, work); @@ -284,7 +284,7 @@ VJOIN2(work, pt1, -od1, v1, -od1, v2); PIPE_MM(work) VMINMAX(lp->pipe_min, lp->pipe_max, work); - + VJOIN2(work, pt2, od2, v1, od2, v2); PIPE_MM(work) VMINMAX(lp->pipe_min, lp->pipe_max, work); @@ -297,7 +297,7 @@ VJOIN2(work, pt2, -od2, v1, -od2, v2); PIPE_MM(work) VMINMAX(lp->pipe_min, lp->pipe_max, work); - + if (head) { BU_LIST_INSERT(head, &lp->l); } else { @@ -323,85 +323,85 @@ RT_PIPE_CK_MAGIC(pip); if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) - return 0; + return 0; pp1 = BU_LIST_FIRST(wdb_pipept, &(pip->pipe_segs_head)); pp2 = BU_LIST_NEXT(wdb_pipept, &pp1->l); if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) - return 0; + return 0; pp3 = BU_LIST_NEXT(wdb_pipept, &pp2->l); if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) - pp3 = (struct wdb_pipept *)NULL; + pp3 = (struct wdb_pipept *)NULL; VMOVE(curr_pt, pp1->pp_coord); curr_od = pp1->pp_od; curr_id = pp1->pp_id; while (1) { - vect_t n1, n2; - vect_t norm; - vect_t v1; - vect_t diff; - fastf_t angle; - fastf_t dist_to_bend; - point_t bend_start, bend_end, bend_center; + vect_t n1, n2; + vect_t norm; + vect_t v1; + vect_t diff; + fastf_t angle; + fastf_t dist_to_bend; + point_t bend_start, bend_end, bend_center; - VSUB2(n1, curr_pt, pp2->pp_coord); - if (VNEAR_ZERO(n1, RT_LEN_TOL)) { - /* duplicate point, skip to next point */ - goto next_pt; - } + VSUB2(n1, curr_pt, pp2->pp_coord); + if (VNEAR_ZERO(n1, RT_LEN_TOL)) { + /* duplicate point, skip to next point */ + goto next_pt; + } - if (!pp3) { - /* last segment */ - rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, min, max); - break; - } + if (!pp3) { + /* last segment */ + rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, min, max); + break; + } - VSUB2(n2, pp3->pp_coord, pp2->pp_coord); - VCROSS(norm, n1, n2); - VUNITIZE(n1); - VUNITIZE(n2); - angle = bn_pi - acos(VDOT(n1, n2)); - dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); - if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { - /* points are colinear, treat as a linear segment */ - rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, - pp2->pp_coord, pp2->pp_id, pp2->pp_od, min, max); - VMOVE(curr_pt, pp2->pp_coord); - goto next_pt; - } + VSUB2(n2, pp3->pp_coord, pp2->pp_coord); + VCROSS(norm, n1, n2); + VUNITIZE(n1); + VUNITIZE(n2); + angle = bn_pi - acos(VDOT(n1, n2)); + dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); + if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { + /* points are colinear, treat as a linear segment */ + rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, + pp2->pp_coord, pp2->pp_id, pp2->pp_od, min, max); + VMOVE(curr_pt, pp2->pp_coord); + goto next_pt; + } - VJOIN1(bend_start, pp2->pp_coord, dist_to_bend, n1); - VJOIN1(bend_end, pp2->pp_coord, dist_to_bend, n2); + VJOIN1(bend_start, pp2->pp_coord, dist_to_bend, n1); + VJOIN1(bend_end, pp2->pp_coord, dist_to_bend, n2); - VUNITIZE(norm); + VUNITIZE(norm); - /* linear section */ - VSUB2(diff, curr_pt, bend_start); - if (MAGNITUDE(diff) <= RT_LEN_TOL) { - /* do not make linear sections that are too small to raytrace */ - VMOVE(bend_start, curr_pt); - } else { - rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, - bend_start, pp2->pp_id, pp2->pp_od, min, max); - } + /* linear section */ + VSUB2(diff, curr_pt, bend_start); + if (MAGNITUDE(diff) <= RT_LEN_TOL) { + /* do not make linear sections that are too small to raytrace */ + VMOVE(bend_start, curr_pt); + } else { + rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, + bend_start, pp2->pp_id, pp2->pp_od, min, max); + } - /* and bend section */ - VCROSS(v1, n1, norm); - VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); - rt_bend_pipe_prep(NULL, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, - pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, min, max); + /* and bend section */ + VCROSS(v1, n1, norm); + VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); + rt_bend_pipe_prep(NULL, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, + pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, min, max); - VMOVE(curr_pt, bend_end); + VMOVE(curr_pt, bend_end); next_pt: - if (!pp3) break; - curr_id = pp2->pp_id; - curr_od = pp2->pp_od; - pp1 = pp2; - pp2 = pp3; - pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); - if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) - pp3 = (struct wdb_pipept *)NULL; + if (!pp3) break; + curr_id = pp2->pp_id; + curr_od = pp2->pp_od; + pp1 = pp2; + pp2 = pp3; + pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + pp3 = (struct wdb_pipept *)NULL; } return 0; @@ -432,103 +432,103 @@ point_t curr_pt; fastf_t curr_id, curr_od; fastf_t dx, dy, dz, f; - + if (rtip) RT_CK_RTI(rtip); RT_CK_DB_INTERNAL(ip); pip = (struct rt_pipe_internal *)ip->idb_ptr; RT_PIPE_CK_MAGIC(pip); - + head = (struct bu_list *)bu_malloc(sizeof(struct bu_list), "rt_pipe_prep:head"); stp->st_specific = (genptr_t)head; BU_LIST_INIT(head); - + if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) - return 0; - + return 0; + pp1 = BU_LIST_FIRST(wdb_pipept, &(pip->pipe_segs_head)); pp2 = BU_LIST_NEXT(wdb_pipept, &pp1->l); if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) - return 0; + return 0; pp3 = BU_LIST_NEXT(wdb_pipept, &pp2->l); if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) - pp3 = (struct wdb_pipept *)NULL; - + pp3 = (struct wdb_pipept *)NULL; + VMOVE(curr_pt, pp1->pp_coord); curr_od = pp1->pp_od; curr_id = pp1->pp_id; while (1) { - vect_t n1, n2; - vect_t norm; - vect_t v1; - vect_t diff; - fastf_t angle; - fastf_t dist_to_bend; - point_t bend_start, bend_end, bend_center; - - VSUB2(n1, curr_pt, pp2->pp_coord); - if (VNEAR_ZERO(n1, RT_LEN_TOL)) { - /* duplicate point, skip to next point */ - goto next_pt; - } - - if (!pp3) { - /* last segment */ - rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); - break; - } - - VSUB2(n2, pp3->pp_coord, pp2->pp_coord); - VCROSS(norm, n1, n2); - VUNITIZE(n1); - VUNITIZE(n2); - angle = bn_pi - acos(VDOT(n1, n2)); - dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); - if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { - /* points are colinear, treat as a linear segment */ - rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, + vect_t n1, n2; + vect_t norm; + vect_t v1; + vect_t diff; + fastf_t angle; + fastf_t dist_to_bend; + point_t bend_start, bend_end, bend_center; + + VSUB2(n1, curr_pt, pp2->pp_coord); + if (VNEAR_ZERO(n1, RT_LEN_TOL)) { + /* duplicate point, skip to next point */ + goto next_pt; + } + + if (!pp3) { + /* last segment */ + rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); + break; + } + + VSUB2(n2, pp3->pp_coord, pp2->pp_coord); + VCROSS(norm, n1, n2); + VUNITIZE(n1); + VUNITIZE(n2); + angle = bn_pi - acos(VDOT(n1, n2)); + dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); + if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { + /* points are colinear, treat as a linear segment */ + rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, pp2->pp_coord, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); - VMOVE(curr_pt, pp2->pp_coord); - goto next_pt; - } - - VJOIN1(bend_start, pp2->pp_coord, dist_to_bend, n1); - VJOIN1(bend_end, pp2->pp_coord, dist_to_bend, n2); - - VUNITIZE(norm); - - /* linear section */ - VSUB2(diff, curr_pt, bend_start); - if (MAGNITUDE(diff) <= RT_LEN_TOL) { - /* do not make linear sections that are too small to raytrace */ - VMOVE(bend_start, curr_pt); - } else { - rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, + VMOVE(curr_pt, pp2->pp_coord); + goto next_pt; + } + + VJOIN1(bend_start, pp2->pp_coord, dist_to_bend, n1); + VJOIN1(bend_end, pp2->pp_coord, dist_to_bend, n2); + + VUNITIZE(norm); + + /* linear section */ + VSUB2(diff, curr_pt, bend_start); + if (MAGNITUDE(diff) <= RT_LEN_TOL) { + /* do not make linear sections that are too small to raytrace */ + VMOVE(bend_start, curr_pt); + } else { + rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, bend_start, pp2->pp_id, pp2->pp_od, &(stp->st_min), &(stp->st_max)); - } - - /* and bend section */ - VCROSS(v1, n1, norm); - VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); - rt_bend_pipe_prep(head, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, + } + + /* and bend section */ + VCROSS(v1, n1, norm); + VJOIN1(bend_center, bend_start, -pp2->pp_bendradius, v1); + rt_bend_pipe_prep(head, bend_center, bend_start, bend_end, pp2->pp_bendradius, angle, pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, &(stp->st_min), &(stp->st_max)); - - VMOVE(curr_pt, bend_end); + + VMOVE(curr_pt, bend_end); next_pt: - if (!pp3) break; - curr_id = pp2->pp_id; - curr_od = pp2->pp_od; - pp1 = pp2; - pp2 = pp3; - pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); - if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) - pp3 = (struct wdb_pipept *)NULL; + if (!pp3) break; + curr_id = pp2->pp_id; + curr_od = pp2->pp_od; + pp1 = pp2; + pp2 = pp3; + pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + pp3 = (struct wdb_pipept *)NULL; } - + VSET(stp->st_center, (stp->st_max[X] + stp->st_min[X])/2, (stp->st_max[Y] + stp->st_min[Y])/2, (stp->st_max[Z] + stp->st_min[Z])/2); - + dx = (stp->st_max[X] - stp->st_min[X])/2; f = dx; dy = (stp->st_max[Y] - stp->st_min[Y])/2; @@ -537,7 +537,7 @@ if (dz > f) f = dz; stp->st_aradius = f; stp->st_bradius = sqrt(dx*dx + dy*dy + dz*dz); - + return 0; } @@ -562,17 +562,17 @@ rt_pipept_print(const struct wdb_pipept *pipept, double mm2local) { point_t p1; - + bu_log("Pipe Vertex:\n"); VSCALE(p1, pipept->pp_coord, mm2local); bu_log("\tat (%g %g %g)\n", V3ARGS(p1)); bu_log("\tbend radius = %g\n", pipept->pp_bendradius*mm2local); if (pipept->pp_id > 0.0) { - bu_log("\tod=%g, id=%g\n", + bu_log("\tod=%g, id=%g\n", pipept->pp_od*mm2local, pipept->pp_id*mm2local); } else { - bu_log("\tod=%g\n", pipept->pp_od*mm2local); + bu_log("\tod=%g\n", pipept->pp_od*mm2local); } } @@ -588,13 +588,13 @@ int seg_count=0; char buf[256]; point_t p1; - + pint = (struct rt_pipe_internal *)ip->idb_ptr; RT_PIPE_CK_MAGIC(pint); - + pipept = BU_LIST_FIRST(wdb_pipept, &pint->pipe_segs_head); while (++seg_count != seg_no && BU_LIST_NOT_HEAD(&pipept->l, &pint->pipe_segs_head)) - pipept = BU_LIST_NEXT(wdb_pipept, &pipept->l); + pipept = BU_LIST_NEXT(wdb_pipept, &pipept->l); sprintf(buf, "Pipe Vertex:\n"); @@ -605,11 +605,11 @@ sprintf(buf, "\tbend radius = %g\n", pipept->pp_bendradius*mm2local); bu_vls_strcat(vp, buf); if (pipept->pp_id > 0.0) { - sprintf(buf, "\tod=%g, id=%g\n", - pipept->pp_od*mm2local, - pipept->pp_id*mm2local); + sprintf(buf, "\tod=%g, id=%g\n", + pipept->pp_od*mm2local, + pipept->pp_id*mm2local); } else { - sprintf(buf, "\tod=%g\n", pipept->pp_od*mm2local); + sprintf(buf, "\tod=%g\n", pipept->pp_od*mm2local); } bu_vls_strcat(vp, buf); } @@ -632,45 +632,45 @@ fastf_t t_tmp; point_t hit_pt; fastf_t radius_sq; - + /* calculate interstection with plane at center (with normal "norm") */ dist_to_plane = VDOT(norm, center); norm_dist = dist_to_plane - VDOT(norm, rp->r_pt); slant_factor = VDOT(norm, rp->r_dir); if (!ZERO(slant_factor)) { - vect_t to_center; - struct hit *hitp; - - t_tmp = norm_dist/slant_factor; - VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); - VSUB2(to_center, center, hit_pt); - radius_sq = MAGSQ(to_center); - - /* where the radius ranges overlap, there is no hit */ - if (radius_sq <= or1_sq && radius_sq >= ir1_sq && + vect_t to_center; + struct hit *hitp; + + t_tmp = norm_dist/slant_factor; + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, center, hit_pt); + radius_sq = MAGSQ(to_center); + + /* where the radius ranges overlap, there is no hit */ + if (radius_sq <= or1_sq && radius_sq >= ir1_sq && radius_sq <= or2_sq && radius_sq >= ir2_sq) { - return; - } - - /* if we are within one of the radius ranges, we have a hit */ - if ((radius_sq <= or2_sq && radius_sq >= ir2_sq) || + return; + } + + /* if we are within one of the radius ranges, we have a hit */ + if ((radius_sq <= or2_sq && radius_sq >= ir2_sq) || (radius_sq <= or1_sq && radius_sq >= ir1_sq)) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_RADIUS_CHANGE; - - /* within first range, use norm, otherwise reverse */ - if (radius_sq <= or1_sq && radius_sq >= ir1_sq) { - VMOVE(hitp->hit_normal, norm); - } else { - VREVERSE(hitp->hit_normal, norm); - } - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_RADIUS_CHANGE; + + /* within first range, use norm, otherwise reverse */ + if (radius_sq <= or1_sq && radius_sq >= ir1_sq) { + VMOVE(hitp->hit_normal, norm); + } else { + VREVERSE(hitp->hit_normal, norm); + } + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } } } @@ -684,15 +684,15 @@ vect_t toCenter; vect_t toPCA; fastf_t dist_sq; - + VSUB2(toCenter, center, rp->r_pt); VCROSS(toPCA, toCenter, rp->r_dir); dist_sq = MAGSQ(toPCA); - + if (dist_sq <= radius_sq) { - return 1; + return 1; } else { - return 0; + return 0; } } @@ -706,7 +706,7 @@ bn_poly_t C; /* The final equation */ bn_complex_t val[4]; /* The complex roots */ int j; - + int root_count=0; bn_poly_t A, Asqr; bn_poly_t X2_Y2; /* X**2 + Y**2 */ @@ -724,29 +724,29 @@ or_sq = bp->bend_or * bp->bend_or; ir_sq = bp->bend_ir * bp->bend_ir; - + tmp = VDOT(rp->r_dir, bp->bend_N); if (NEAR_ZERO(tmp, 0.0000005)) { - /* ray is parallel to plane of bend */ - parallel = 1; - dist = fabs(VDOT(rp->r_pt, bp->bend_N) - + /* ray is parallel to plane of bend */ + parallel = 1; + dist = fabs(VDOT(rp->r_pt, bp->bend_N) - VDOT(bp->bend_V, bp->bend_N)); - - if (dist > bp->bend_or) { - /* ray is more than outer radius away from plane of bend */ - goto check_discont_radii; - } + + if (dist > bp->bend_or) { + /* ray is more than outer radius away from plane of bend */ + goto check_discont_radii; + } } else { - parallel = 0; + parallel = 0; } - + /* Convert vector into the space of the unit torus */ MAT4X3VEC(dprime, bp->bend_SoR, rp->r_dir); VUNITIZE(dprime); - + VSUB2(work, rp->r_pt, bp->bend_V); MAT4X3VEC(pprime, bp->bend_SoR, work); - + /* normalize distance from torus. substitute corrected pprime * which contains a translation along ray direction to closest * approach to vertex of torus. Translating ray origin along @@ -756,7 +756,7 @@ cor_proj = VDOT(pprime, dprime); VSCALE(cor_pprime, dprime, cor_proj); VSUB2(cor_pprime, pprime, cor_pprime); - + /* * Given a line and a ratio, alpha, finds the equation of the unit * torus in terms of the variable 't'. @@ -779,14 +779,14 @@ dprime[Y] * cor_pprime[Y]); X2_Y2.cf[2] = cor_pprime[X] * cor_pprime[X] + cor_pprime[Y] * cor_pprime[Y]; - + /* A = X2_Y2 + Z2 */ A.dgr = 2; A.cf[0] = X2_Y2.cf[0] + dprime[Z] * dprime[Z]; A.cf[1] = X2_Y2.cf[1] + 2.0 * dprime[Z] * cor_pprime[Z]; A.cf[2] = X2_Y2.cf[2] + cor_pprime[Z] * cor_pprime[Z] + 1.0 - bp->bend_alpha_o * bp->bend_alpha_o; - + /* Inline expansion of (void) bn_poly_mul(&Asqr, &A, &A) */ /* Both polys have degree two */ Asqr.dgr = 4; @@ -795,7 +795,7 @@ Asqr.cf[2] = A.cf[0] * A.cf[2] + A.cf[1] * A.cf[1] + A.cf[2] * A.cf[0]; Asqr.cf[3] = A.cf[1] * A.cf[2] + A.cf[2] * A.cf[1]; Asqr.cf[4] = A.cf[2] * A.cf[2]; - + /* Inline expansion of bn_poly_scale(&X2_Y2, 4.0) and * bn_poly_sub(&C, &Asqr, &X2_Y2). */ @@ -805,27 +805,27 @@ C.cf[2] = Asqr.cf[2] - X2_Y2.cf[0] * 4.0; C.cf[3] = Asqr.cf[3] - X2_Y2.cf[1] * 4.0; C.cf[4] = Asqr.cf[4] - X2_Y2.cf[2] * 4.0; - + /* It is known that the equation is 4th order. Therefore, if the * root finder returns other than 4 roots, error. */ if ((root_count = rt_poly_roots(&C, val, stp->st_dp->d_namep)) != 4) { - if (root_count > 0) { - bu_log("pipe: rt_poly_roots() 4!=%d\n", root_count); - bn_pr_roots(stp->st_name, val, root_count); - } else if (root_count < 0) { - static int reported=0; - bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); - if (!reported) { - VPRINT("while shooting from:\t", rp->r_pt); - VPRINT("while shooting at:\t", rp->r_dir); - bu_log("Additional pipe convergence failure details will be suppressed.\n"); - reported=1; - } - } - goto check_discont_radii; /* MISSED */ + if (root_count > 0) { + bu_log("pipe: rt_poly_roots() 4!=%d\n", root_count); + bn_pr_roots(stp->st_name, val, root_count); + } else if (root_count < 0) { + static int reported=0; + bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); + if (!reported) { + VPRINT("while shooting from:\t", rp->r_pt); + VPRINT("while shooting at:\t", rp->r_dir); + bu_log("Additional pipe convergence failure details will be suppressed.\n"); + reported=1; + } + } + goto check_discont_radii; /* MISSED */ } - + /* Only real roots indicate an intersection in real space. * * Look at each root returned; if the imaginary part is zero or @@ -833,50 +833,50 @@ * for the intersections */ for (j=0 ; j < 4; j++) { - if (NEAR_ZERO(val[j].im, 0.0001)) { - struct hit *hitp; - fastf_t normalized_dist; - fastf_t distance; - point_t hit_pt; - vect_t to_hit; - fastf_t angle; - - normalized_dist = val[j].re - cor_proj; - distance = normalized_dist * bp->bend_radius; - - /* check if this hit is within bend angle */ - VJOIN1(hit_pt, rp->r_pt, distance, rp->r_dir); - VSUB2(to_hit, hit_pt, bp->bend_V); - angle = atan2(VDOT(to_hit, bp->bend_rb), VDOT(to_hit, bp->bend_ra)); - if (angle < 0.0) - angle += 2.0 * bn_pi; - if (angle <= bp->bend_angle) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = distance; - VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); - hitp->hit_surfno = seg_no*10 + PIPE_BEND_OUTER_BODY; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + if (NEAR_ZERO(val[j].im, 0.0001)) { + struct hit *hitp; + fastf_t normalized_dist; + fastf_t distance; + point_t hit_pt; + vect_t to_hit; + fastf_t angle; + + normalized_dist = val[j].re - cor_proj; + distance = normalized_dist * bp->bend_radius; + + /* check if this hit is within bend angle */ + VJOIN1(hit_pt, rp->r_pt, distance, rp->r_dir); + VSUB2(to_hit, hit_pt, bp->bend_V); + angle = atan2(VDOT(to_hit, bp->bend_rb), VDOT(to_hit, bp->bend_ra)); + if (angle < 0.0) + angle += 2.0 * bn_pi; + if (angle <= bp->bend_angle) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = distance; + VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); + hitp->hit_surfno = seg_no*10 + PIPE_BEND_OUTER_BODY; + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } - + if (bp->bend_alpha_i <= 0.0) - goto check_discont_radii; /* no inner torus */ - + goto check_discont_radii; /* no inner torus */ + if (parallel && dist > bp->bend_ir) { - /* ray is parallel to plane of bend and more than inner radius away */ - goto check_discont_radii; + /* 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 - bp->bend_alpha_i * bp->bend_alpha_i; - + /* Inline expansion of (void) bn_poly_mul(&Asqr, &A, &A) */ /* Both polys have degree two */ Asqr.dgr = 4; @@ -885,7 +885,7 @@ Asqr.cf[2] = A.cf[0] * A.cf[2] + A.cf[1] * A.cf[1] + A.cf[2] * A.cf[0]; Asqr.cf[3] = A.cf[1] * A.cf[2] + A.cf[2] * A.cf[1]; Asqr.cf[4] = A.cf[2] * A.cf[2]; - + /* Inline expansion of bn_poly_scale(&X2_Y2, 4.0) and * bn_poly_sub(&C, &Asqr, &X2_Y2). */ @@ -895,27 +895,27 @@ C.cf[2] = Asqr.cf[2] - X2_Y2.cf[0] * 4.0; C.cf[3] = Asqr.cf[3] - X2_Y2.cf[1] * 4.0; C.cf[4] = Asqr.cf[4] - X2_Y2.cf[2] * 4.0; - + /* It is known that the equation is 4th order. Therefore, * if the root finder returns other than 4 roots, error. */ if ((root_count = rt_poly_roots(&C, val, stp->st_dp->d_namep)) != 4) { - if (root_count > 0) { - bu_log("tor: rt_poly_roots() 4!=%d\n", root_count); - bn_pr_roots(stp->st_name, val, root_count); - } else if (root_count < 0) { - static int reported=0; - bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); - if (!reported) { - VPRINT("while shooting from:\t", rp->r_pt); - VPRINT("while shooting at:\t", rp->r_dir); - bu_log("Additional pipe convergence failure details will be suppressed.\n"); - reported=1; - } - } - goto check_discont_radii; /* MISSED */ + if (root_count > 0) { + bu_log("tor: rt_poly_roots() 4!=%d\n", root_count); + bn_pr_roots(stp->st_name, val, root_count); + } else if (root_count < 0) { + static int reported=0; + bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); + if (!reported) { + VPRINT("while shooting from:\t", rp->r_pt); + VPRINT("while shooting at:\t", rp->r_dir); + bu_log("Additional pipe convergence failure details will be suppressed.\n"); + reported=1; + } + } + goto check_discont_radii; /* MISSED */ } - + /* Only real roots indicate an intersection in real space. * * Look at each root returned; if the imaginary part is zero or @@ -923,36 +923,36 @@ * for the intersections */ for (j=0, root_count=0; j < 4; j++) { - if (NEAR_ZERO(val[j].im, 0.0001)) { - struct hit *hitp; - fastf_t normalized_dist; - fastf_t distance; - point_t hit_pt; - vect_t to_hit; - fastf_t angle; - - normalized_dist = val[j].re - cor_proj; - distance = normalized_dist * bp->bend_radius; - - /* check if this hit is within bend angle */ - VJOIN1(hit_pt, rp->r_pt, distance, rp->r_dir); - VSUB2(to_hit, hit_pt, bp->bend_V); - angle = atan2(VDOT(to_hit, bp->bend_rb), VDOT(to_hit, bp->bend_ra)); - if (angle < 0.0) - angle += 2.0 * bn_pi; - if (angle <= bp->bend_angle) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = distance; - VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); - hitp->hit_surfno = seg_no*10 + PIPE_BEND_INNER_BODY; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + if (NEAR_ZERO(val[j].im, 0.0001)) { + struct hit *hitp; + fastf_t normalized_dist; + fastf_t distance; + point_t hit_pt; + vect_t to_hit; + fastf_t angle; + + normalized_dist = val[j].re - cor_proj; + distance = normalized_dist * bp->bend_radius; + + /* check if this hit is within bend angle */ + VJOIN1(hit_pt, rp->r_pt, distance, rp->r_dir); + VSUB2(to_hit, hit_pt, bp->bend_V); + angle = atan2(VDOT(to_hit, bp->bend_rb), VDOT(to_hit, bp->bend_ra)); + if (angle < 0.0) + angle += 2.0 * bn_pi; + if (angle <= bp->bend_angle) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = distance; + VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); + hitp->hit_surfno = seg_no*10 + PIPE_BEND_INNER_BODY; + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } @@ -960,51 +960,51 @@ /* check for surfaces created by discontinuous changes in radii */ prev = BU_LIST_BACK(id_pipe, &bp->l); if (prev->l.magic != BU_LIST_HEAD_MAGIC) { - if (prev->pipe_is_bend) { - /* do not process previous bend - * 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 = or_sq; - ir2_sq = ir_sq; - } else { - struct lin_pipe *lin = (struct lin_pipe *)prev; - or2_sq = lin->pipe_rotop_sq; - ir2_sq = lin->pipe_ritop_sq; - if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || + if (prev->pipe_is_bend) { + /* do not process previous bend + * 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 = or_sq; + ir2_sq = ir_sq; + } else { + struct lin_pipe *lin = (struct lin_pipe *)prev; + or2_sq = lin->pipe_rotop_sq; + ir2_sq = lin->pipe_ritop_sq; + if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || !NEAR_EQUAL(ir_sq, ir2_sq, RT_LEN_TOL)) { - discont_radius_shot(rp, bp->bend_start, bp->bend_startNorm, + discont_radius_shot(rp, bp->bend_start, bp->bend_startNorm, or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); - } - } + } + } } - + next = BU_LIST_NEXT(id_pipe, &bp->l); if (next->l.magic != BU_LIST_HEAD_MAGIC) { - if (next->pipe_is_bend) { - struct bend_pipe *bend = (struct bend_pipe *)next; - or2_sq = bend->bend_or*bend->bend_or; - ir2_sq = bend->bend_ir*bend->bend_ir; - if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || + if (next->pipe_is_bend) { + struct bend_pipe *bend = (struct bend_pipe *)next; + or2_sq = bend->bend_or*bend->bend_or; + ir2_sq = bend->bend_ir*bend->bend_ir; + if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || !NEAR_EQUAL(ir_sq, ir2_sq, RT_LEN_TOL)) { - discont_radius_shot(rp, bp->bend_end, bp->bend_endNorm, + discont_radius_shot(rp, bp->bend_end, bp->bend_endNorm, or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); - } - } else { - struct lin_pipe *lin = (struct lin_pipe *)next; - or2_sq = lin->pipe_robase_sq; - ir2_sq = lin->pipe_ribase_sq; - if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || + } + } else { + struct lin_pipe *lin = (struct lin_pipe *)next; + or2_sq = lin->pipe_robase_sq; + ir2_sq = lin->pipe_ribase_sq; + if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || !NEAR_EQUAL(ir_sq, ir2_sq, RT_LEN_TOL)) { - discont_radius_shot(rp, bp->bend_end, bp->bend_endNorm, + discont_radius_shot(rp, bp->bend_end, bp->bend_endNorm, or_sq, ir_sq, or2_sq, ir2_sq, hits, hit_count, seg_no, stp); - } - } + } + } } return; - + } @@ -1018,19 +1018,19 @@ double t_tmp; double a, b, c; double descrim; - + if (lp->pipe_is_bend) { - bu_log("linear_pipe_shot called for pipe bend\n"); - bu_bomb("linear_pipe_shot\n"); + bu_log("linear_pipe_shot called for pipe bend\n"); + bu_bomb("linear_pipe_shot\n"); } - + /* transform ray start point */ VSUB2(work_pt, rp->r_pt, lp->pipe_V); MAT4X3VEC(ray_start, lp->pipe_SoR, work_pt); - + /* rotate ray direction */ MAT4X3VEC(ray_dir, lp->pipe_SoR, rp->r_dir); - + /* Intersect with outer sides */ a = ray_dir[X]*ray_dir[X] + ray_dir[Y]*ray_dir[Y] @@ -1044,110 +1044,110 @@ - lp->pipe_robase*lp->pipe_robase - ray_start[Z]*ray_start[Z]*lp->pipe_rodiff_sq - 2.0*ray_start[Z]*lp->pipe_robase*lp->pipe_rodiff; - + descrim = b*b - 4.0*a*c; - + if (descrim > 0.0) { - fastf_t sqrt_descrim; - point_t hit_pt; - - sqrt_descrim = sqrt(descrim); - - t_tmp = (-b - sqrt_descrim)/(2.0*a); - VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); - if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; - VMOVE(hitp->hit_vpriv, hit_pt); - hitp->hit_vpriv[Z] = (-lp->pipe_robase - hit_pt[Z] * lp->pipe_rodiff) * + fastf_t sqrt_descrim; + point_t hit_pt; + + sqrt_descrim = sqrt(descrim); + + t_tmp = (-b - sqrt_descrim)/(2.0*a); + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; + VMOVE(hitp->hit_vpriv, hit_pt); + hitp->hit_vpriv[Z] = (-lp->pipe_robase - hit_pt[Z] * lp->pipe_rodiff) * lp->pipe_rodiff; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - - t_tmp = (-b + sqrt_descrim)/(2.0*a); - VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); - if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; - VMOVE(hitp->hit_vpriv, hit_pt); - hitp->hit_vpriv[Z] = (-lp->pipe_robase - hit_pt[Z] * lp->pipe_rodiff) * + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + + t_tmp = (-b + sqrt_descrim)/(2.0*a); + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; + VMOVE(hitp->hit_vpriv, hit_pt); + hitp->hit_vpriv[Z] = (-lp->pipe_robase - hit_pt[Z] * lp->pipe_rodiff) * lp->pipe_rodiff; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } } - + if (lp->pipe_ribase > 0.0 || lp->pipe_ritop > 0.0) { - /* Intersect with inner sides */ - - a = ray_dir[X]*ray_dir[X] + /* Intersect with inner sides */ + + a = ray_dir[X]*ray_dir[X] + ray_dir[Y]*ray_dir[Y] - ray_dir[Z]*ray_dir[Z]*lp->pipe_ridiff_sq; - b = 2.0*(ray_start[X]*ray_dir[X] + b = 2.0*(ray_start[X]*ray_dir[X] + ray_start[Y]*ray_dir[Y] - ray_start[Z]*ray_dir[Z]*lp->pipe_ridiff_sq - ray_dir[Z]*lp->pipe_ribase*lp->pipe_ridiff); - c = ray_start[X]*ray_start[X] + c = ray_start[X]*ray_start[X] + ray_start[Y]*ray_start[Y] - lp->pipe_ribase*lp->pipe_ribase - ray_start[Z]*ray_start[Z]*lp->pipe_ridiff_sq - 2.0*ray_start[Z]*lp->pipe_ribase*lp->pipe_ridiff; - - descrim = b*b - 4.0*a*c; - - if (descrim > 0.0) { - fastf_t sqrt_descrim; - point_t hit_pt; - - sqrt_descrim = sqrt(descrim); - - t_tmp = (-b - sqrt_descrim)/(2.0*a); - VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); - if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; - VMOVE(hitp->hit_vpriv, hit_pt); - hitp->hit_vpriv[Z] = (-lp->pipe_ribase - hit_pt[Z] * lp->pipe_ridiff) * + + descrim = b*b - 4.0*a*c; + + if (descrim > 0.0) { + fastf_t sqrt_descrim; + point_t hit_pt; + + sqrt_descrim = sqrt(descrim); + + t_tmp = (-b - sqrt_descrim)/(2.0*a); + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; + VMOVE(hitp->hit_vpriv, hit_pt); + hitp->hit_vpriv[Z] = (-lp->pipe_ribase - hit_pt[Z] * lp->pipe_ridiff) * lp->pipe_ridiff; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - - t_tmp = (-b + sqrt_descrim)/(2.0*a); - VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); - if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; - VMOVE(hitp->hit_vpriv, hit_pt); - hitp->hit_vpriv[Z] = (-lp->pipe_ribase - hit_pt[Z] * lp->pipe_ridiff) * + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + + t_tmp = (-b + sqrt_descrim)/(2.0*a); + VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); + if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; + VMOVE(hitp->hit_vpriv, hit_pt); + hitp->hit_vpriv[Z] = (-lp->pipe_ribase - hit_pt[Z] * lp->pipe_ridiff) * lp->pipe_ridiff; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } - + } @@ -1160,62 +1160,62 @@ struct hit *hitp; if (!id_p->pipe_is_bend) { - struct lin_pipe *lin=(struct lin_pipe *)(&id_p->l); - fastf_t dist_to_plane; - fastf_t norm_dist; - fastf_t slant_factor; - - dist_to_plane = VDOT(lin->pipe_H, lin->pipe_V); - norm_dist = dist_to_plane - VDOT(lin->pipe_H, rp->r_pt); - slant_factor = VDOT(lin->pipe_H, rp->r_dir); - if (!ZERO(slant_factor)) { - vect_t to_center; - - t_tmp = norm_dist/slant_factor; - VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); - VSUB2(to_center, lin->pipe_V, hit_pt); - radius_sq = MAGSQ(to_center); - if (radius_sq <= lin->pipe_robase_sq && radius_sq >= lin->pipe_ribase_sq) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_BASE; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + struct lin_pipe *lin=(struct lin_pipe *)(&id_p->l); + fastf_t dist_to_plane; + fastf_t norm_dist; + fastf_t slant_factor; + + dist_to_plane = VDOT(lin->pipe_H, lin->pipe_V); + norm_dist = dist_to_plane - VDOT(lin->pipe_H, rp->r_pt); + slant_factor = VDOT(lin->pipe_H, rp->r_dir); + if (!ZERO(slant_factor)) { + vect_t to_center; + + t_tmp = norm_dist/slant_factor; + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, lin->pipe_V, hit_pt); + radius_sq = MAGSQ(to_center); + if (radius_sq <= lin->pipe_robase_sq && radius_sq >= lin->pipe_ribase_sq) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_BASE; + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } else if (id_p->pipe_is_bend) { - struct bend_pipe *bend=(struct bend_pipe *)(&id_p->l); - fastf_t dist_to_plane; - fastf_t norm_dist; - fastf_t slant_factor; - - dist_to_plane = VDOT(bend->bend_rb, bend->bend_start); - norm_dist = dist_to_plane - VDOT(bend->bend_rb, rp->r_pt); - slant_factor = VDOT(bend->bend_rb, rp->r_dir); - - if (!ZERO(slant_factor)) { - vect_t to_center; - - t_tmp = norm_dist/slant_factor; - VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); - VSUB2(to_center, bend->bend_start, hit_pt); - radius_sq = MAGSQ(to_center); - if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_BEND_BASE; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + struct bend_pipe *bend=(struct bend_pipe *)(&id_p->l); + fastf_t dist_to_plane; + fastf_t norm_dist; + fastf_t slant_factor; + + dist_to_plane = VDOT(bend->bend_rb, bend->bend_start); + norm_dist = dist_to_plane - VDOT(bend->bend_rb, rp->r_pt); + slant_factor = VDOT(bend->bend_rb, rp->r_dir); + + if (!ZERO(slant_factor)) { + vect_t to_center; + + t_tmp = norm_dist/slant_factor; + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, bend->bend_start, hit_pt); + radius_sq = MAGSQ(to_center); + if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_BEND_BASE; + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } } @@ -1227,72 +1227,72 @@ fastf_t t_tmp; fastf_t radius_sq; struct hit *hitp; - + if (!id_p->pipe_is_bend) { - struct lin_pipe *lin=(struct lin_pipe *)(&id_p->l); - point_t top; - fastf_t dist_to_plane; - fastf_t norm_dist; - fastf_t slant_factor; - - VJOIN1(top, lin->pipe_V, lin->pipe_len, lin->pipe_H); - dist_to_plane = VDOT(lin->pipe_H, top); - norm_dist = dist_to_plane - VDOT(lin->pipe_H, rp->r_pt); - slant_factor = VDOT(lin->pipe_H, rp->r_dir); - if (!ZERO(slant_factor)) { - vect_t to_center; - - t_tmp = norm_dist/slant_factor; - VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); - VSUB2(to_center, top, hit_pt); - radius_sq = MAGSQ(to_center); - if (radius_sq <= lin->pipe_rotop_sq && radius_sq >= lin->pipe_ritop_sq) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_TOP; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + struct lin_pipe *lin=(struct lin_pipe *)(&id_p->l); + point_t top; + fastf_t dist_to_plane; + fastf_t norm_dist; + fastf_t slant_factor; + + VJOIN1(top, lin->pipe_V, lin->pipe_len, lin->pipe_H); + dist_to_plane = VDOT(lin->pipe_H, top); + norm_dist = dist_to_plane - VDOT(lin->pipe_H, rp->r_pt); + slant_factor = VDOT(lin->pipe_H, rp->r_dir); + if (!ZERO(slant_factor)) { + vect_t to_center; + + t_tmp = norm_dist/slant_factor; + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, top, hit_pt); + radius_sq = MAGSQ(to_center); + if (radius_sq <= lin->pipe_rotop_sq && radius_sq >= lin->pipe_ritop_sq) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_TOP; + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } else if (id_p->pipe_is_bend) { - struct bend_pipe *bend=(struct bend_pipe *)(&id_p->l); - vect_t to_end; - vect_t plane_norm; - fastf_t dist_to_plane; - fastf_t norm_dist; - fastf_t slant_factor; - - VSUB2(to_end, bend->bend_end, bend->bend_V); - VCROSS(plane_norm, to_end, bend->bend_N); - VUNITIZE(plane_norm); - - dist_to_plane = VDOT(plane_norm, bend->bend_end); - norm_dist = dist_to_plane - VDOT(plane_norm, rp->r_pt); - slant_factor = VDOT(plane_norm, rp->r_dir); - - if (!ZERO(slant_factor)) { - vect_t to_center; - - t_tmp = norm_dist/slant_factor; - VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); - VSUB2(to_center, bend->bend_end, hit_pt); - radius_sq = MAGSQ(to_center); - if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { - hitp = &hits[*hit_count]; - hitp->hit_magic = RT_HIT_MAGIC; - hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_BEND_TOP; - - if ((*hit_count)++ >= RT_PIPE_MAXHITS) { - bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); - return; - } - } - } + struct bend_pipe *bend=(struct bend_pipe *)(&id_p->l); + vect_t to_end; + vect_t plane_norm; + fastf_t dist_to_plane; + fastf_t norm_dist; + fastf_t slant_factor; + + VSUB2(to_end, bend->bend_end, bend->bend_V); + VCROSS(plane_norm, to_end, bend->bend_N); + VUNITIZE(plane_norm); + + dist_to_plane = VDOT(plane_norm, bend->bend_end); + norm_dist = dist_to_plane - VDOT(plane_norm, rp->r_pt); + slant_factor = VDOT(plane_norm, rp->r_dir); + + if (!ZERO(slant_factor)) { + vect_t to_center; + + t_tmp = norm_dist/slant_factor; + VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); + VSUB2(to_center, bend->bend_end, hit_pt); + radius_sq = MAGSQ(to_center); + if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { + hitp = &hits[*hit_count]; + hitp->hit_magic = RT_HIT_MAGIC; + hitp->hit_dist = t_tmp; + hitp->hit_surfno = seg_no*10 + PIPE_BEND_TOP; + + if ((*hit_count)++ >= RT_PIPE_MAXHITS) { + bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); + return; + } + } + } } } @@ -1303,82 +1303,82 @@ struct hit *hitp; struct hit *next_hit; int hitNo = 0; - + /* delete duplicate hits */ while (hitNo < ((*nh)-1)) { - hitp = &hit[hitNo]; - next_hit = &hit[hitNo+1]; - - if (NEAR_EQUAL(hitp->hit_dist, next_hit->hit_dist, 0.00001) && + hitp = &hit[hitNo]; + next_hit = &hit[hitNo+1]; + + if (NEAR_EQUAL(hitp->hit_dist, next_hit->hit_dist, 0.00001) && hitp->hit_surfno == next_hit->hit_surfno) { - int i; - for (i=hitNo ; i<(*nh) ; i++) { - hit[i] = hit[i+1]; - } - (*nh)--; - } else { - hitNo++; - } + int i; + for (i=hitNo ; i<(*nh) ; i++) { + hit[i] = hit[i+1]; + } + (*nh)--; + } else { + hitNo++; + } } - + if ((*nh) == 1) { - (*nh) = 0; - return; + (*nh) = 0; + return; } - + if ((*nh) == 0 || (*nh) == 2) - return; - + return; + /* handle cases where this pipe overlaps with itself */ hitp = &hit[0]; if (VDOT(hitp->hit_normal, rp->r_dir) > 0.0) { - - bu_log("ERROR: first hit on %s (surfno = %d) is an exit at (%g %g %g)\n", + + bu_log("ERROR: first hit on %s (surfno = %d) is an exit at (%g %g %g)\n", stp->st_dp->d_namep, hitp->hit_surfno, V3ARGS(hitp->hit_point)); - bu_log("\tray start = (%.12e %.12e %.12e), ray dir = (%.12e %.12e %.12e)\n", + bu_log("\tray start = (%.12e %.12e %.12e), ray dir = (%.12e %.12e %.12e)\n", V3ARGS(rp->r_pt), V3ARGS(rp->r_dir)); - - (*nh) = 0; - return; + + (*nh) = 0; + return; } - + hitNo = 0; while (hitNo < ((*nh)-1)) { - int hitNoPlus = hitNo + 1; - /* struct hit *first = &hit[hitNo]; */ - struct hit *second = &hit[hitNoPlus]; + int hitNoPlus = hitNo + 1; + /* struct hit *first = &hit[hitNo]; */ + struct hit *second = &hit[hitNoPlus]; - /* keep first entrance hit, eliminate all successive entrance hits */ - while (hitNoPlus < (*nh) && VDOT(second->hit_normal, rp->r_dir) < 0.0) { - int j; - for (j=hitNoPlus ; j<((*nh)-1) ; j++) { - hit[j] = hit[j+1]; - } - (*nh)--; - second = &hit[hitNoPlus]; - } - - /* second is now an exit hit at hit[hitNoPlus] */ - - /* move to next hit */ - hitNoPlus++; - if (hitNoPlus >= (*nh)) { - break; - } - - /* set second to the next hit */ - second = &hit[hitNoPlus]; - - /* eliminate all exit hits (except the last one) till we find another entrance hit */ - while (hitNoPlus < (*nh) && VDOT(second->hit_normal, rp->r_dir) > 0.0) { - int j; - for (j=hitNoPlus-1 ; j<((*nh)-1) ; j++) { - hit[j] = hit[j+1]; - } - (*nh)--; - second = &hit[hitNoPlus]; - } - hitNo = hitNoPlus; + /* keep first entrance hit, eliminate all successive entrance hits */ + while (hitNoPlus < (*nh) && VDOT(second->hit_normal, rp->r_dir) < 0.0) { + int j; + for (j=hitNoPlus ; j<((*nh)-1) ; j++) { + hit[j] = hit[j+1]; + } + (*nh)--; + second = &hit[hitNoPlus]; + } + + /* second is now an exit hit at hit[hitNoPlus] */ + + /* move to next hit */ + hitNoPlus++; + if (hitNoPlus >= (*nh)) { + break; + } + + /* set second to the next hit */ + second = &hit[hitNoPlus]; + + /* eliminate all exit hits (except the last one) till we find another entrance hit */ + while (hitNoPlus < (*nh) && VDOT(second->hit_normal, rp->r_dir) > 0.0) { + int j; + for (j=hitNoPlus-1 ; j<((*nh)-1) ; j++) { + hit[j] = hit[j+1]; + } + (*nh)--; + second = &hit[hitNoPlus]; + } + hitNo = hitNoPlus; } } @@ -1400,71 +1400,71 @@ vect_t work1; int segno; int i; - + segno = hitp->hit_surfno/10; - + pipe_id = BU_LIST_FIRST(id_pipe, head); for (i=1; i<segno; i++) - pipe_id = BU_LIST_NEXT(id_pipe, &pipe_id->l); - + pipe_id = BU_LIST_NEXT(id_pipe, &pipe_id->l); + pipe_lin = (struct lin_pipe *)pipe_id; pipe_bend = (struct bend_pipe *)pipe_id; - + VJOIN1(hitp->hit_point, rp->r_pt, hitp->hit_dist, rp->r_dir); switch (hitp->hit_surfno%10) { - case PIPE_LINEAR_TOP: - VMOVE(hitp->hit_normal, pipe_lin->pipe_H); - break; - case PIPE_LINEAR_BASE: - VREVERSE(hitp->hit_normal, pipe_lin->pipe_H); - break; - case PIPE_LINEAR_OUTER_BODY: - MAT4X3VEC(hitp->hit_normal, pipe_lin->pipe_invRoS, hitp->hit_vpriv); - VUNITIZE(hitp->hit_normal); - break; - case PIPE_LINEAR_INNER_BODY: - MAT4X3VEC(hitp->hit_normal, pipe_lin->pipe_invRoS, hitp->hit_vpriv); - VUNITIZE(hitp->hit_normal); - VREVERSE(hitp->hit_normal, hitp->hit_normal); - break; - case PIPE_BEND_OUTER_BODY: - w = hitp->hit_vpriv[X]*hitp->hit_vpriv[X] + + case PIPE_LINEAR_TOP: + VMOVE(hitp->hit_normal, pipe_lin->pipe_H); + break; + case PIPE_LINEAR_BASE: + VREVERSE(hitp->hit_normal, pipe_lin->pipe_H); + break; + case PIPE_LINEAR_OUTER_BODY: + MAT4X3VEC(hitp->hit_normal, pipe_lin->pipe_invRoS, hitp->hit_vpriv); + VUNITIZE(hitp->hit_normal); + break; + case PIPE_LINEAR_INNER_BODY: + MAT4X3VEC(hitp->hit_normal, pipe_lin->pipe_invRoS, hitp->hit_vpriv); + VUNITIZE(hitp->hit_normal); + VREVERSE(hitp->hit_normal, hitp->hit_normal); + break; + case PIPE_BEND_OUTER_BODY: + w = hitp->hit_vpriv[X]*hitp->hit_vpriv[X] + hitp->hit_vpriv[Y]*hitp->hit_vpriv[Y] + hitp->hit_vpriv[Z]*hitp->hit_vpriv[Z] + 1.0 - pipe_bend->bend_alpha_o*pipe_bend->bend_alpha_o; - VSET(work, + VSET(work, (w - 2.0) * hitp->hit_vpriv[X], (w - 2.0) * hitp->hit_vpriv[Y], w * hitp->hit_vpriv[Z]); - VUNITIZE(work); - MAT3X3VEC(hitp->hit_normal, pipe_bend->bend_invR, work); - break; - case PIPE_BEND_INNER_BODY: - w = hitp->hit_vpriv[X]*hitp->hit_vpriv[X] + + VUNITIZE(work); + MAT3X3VEC(hitp->hit_normal, pipe_bend->bend_invR, work); + break; + case PIPE_BEND_INNER_BODY: + w = hitp->hit_vpriv[X]*hitp->hit_vpriv[X] + hitp->hit_vpriv[Y]*hitp->hit_vpriv[Y] + hitp->hit_vpriv[Z]*hitp->hit_vpriv[Z] + 1.0 - pipe_bend->bend_alpha_i*pipe_bend->bend_alpha_i; - VSET(work, + VSET(work, (w - 2.0) * hitp->hit_vpriv[X], (w - 2.0) * hitp->hit_vpriv[Y], w * hitp->hit_vpriv[Z]); - VUNITIZE(work); - MAT3X3VEC(work1, pipe_bend->bend_invR, work); - VREVERSE(hitp->hit_normal, work1); - break; - case PIPE_BEND_BASE: - VREVERSE(hitp->hit_normal, pipe_bend->bend_rb); - break; - case PIPE_BEND_TOP: - VSUB2(work, pipe_bend->bend_end, pipe_bend->bend_V); - VCROSS(hitp->hit_normal, pipe_bend->bend_N, work); - VUNITIZE(hitp->hit_normal); - break; - case PIPE_RADIUS_CHANGE: - break; /* already have normal */ - default: - bu_log("rt_pipe_norm: Unrecognized surfno (%d)\n", hitp->hit_surfno); - break; + VUNITIZE(work); + MAT3X3VEC(work1, pipe_bend->bend_invR, work); + VREVERSE(hitp->hit_normal, work1); + break; + case PIPE_BEND_BASE: + VREVERSE(hitp->hit_normal, pipe_bend->bend_rb); + break; + case PIPE_BEND_TOP: + VSUB2(work, pipe_bend->bend_end, pipe_bend->bend_V); + VCROSS(hitp->hit_normal, pipe_bend->bend_N, work); + VUNITIZE(hitp->hit_normal); + break; + case PIPE_RADIUS_CHANGE: + break; /* already have normal */ + default: + bu_log("rt_pipe_norm: Unrecognized surfno (%d)\n", hitp->hit_surfno); + break; } } @@ -1489,76 +1489,76 @@ int total_hits = 0; int seg_no; int i; - + pipe_start_shot(stp, rp, BU_LIST_FIRST(id_pipe, head), hits, &total_hits, 1); seg_no = 0; for (BU_LIST_FOR(pipe_id, id_pipe, head)) - seg_no++; + seg_no++; pipe_end_shot(stp, rp, BU_LIST_LAST(id_pipe, head), hits, &total_hits, seg_no); - + seg_no = 0; for (BU_LIST_FOR(pipe_id, id_pipe, head)) { - seg_no++; - - if (!pipe_id->pipe_is_bend) { - struct lin_pipe *lin = (struct lin_pipe *)pipe_id; - if (!rt_in_rpp(rp, ap->a_inv_dir, lin->pipe_min, lin->pipe_max)) { - continue; - } - linear_pipe_shot(stp, rp, lin, hits, &total_hits, seg_no); - } else { - struct bend_pipe *bend = (struct bend_pipe *)pipe_id; - if (!rt_in_sph(rp, bend->bend_bound_center, bend->bend_bound_radius_sq)) { - continue; - } - bend_pipe_shot(stp, rp, bend, hits, &total_hits, seg_no); - } + seg_no++; + + if (!pipe_id->pipe_is_bend) { + struct lin_pipe *lin = (struct lin_pipe *)pipe_id; + if (!rt_in_rpp(rp, ap->a_... [truncated message content] |
From: <br...@us...> - 2012-04-17 01:53:47
|
Revision: 50100 http://brlcad.svn.sourceforge.net/brlcad/?rev=50100&view=rev Author: brlcad Date: 2012-04-17 01:08:17 +0000 (Tue, 17 Apr 2012) Log Message: ----------- make sure we don't dereference a null pp3 pointer if we're near the end of the point list. check if we're on the last segment before skipping to the next point. should fix coverity cid 305 forward_null defect. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-04-17 01:02:20 UTC (rev 50099) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-04-17 01:08:17 UTC (rev 50100) @@ -312,7 +312,8 @@ * Calculate a bounding RPP for a pipe */ int -rt_pipe_bbox(struct rt_db_internal *ip, point_t *min, point_t *max) { +rt_pipe_bbox(struct rt_db_internal *ip, point_t *min, point_t *max) +{ struct rt_pipe_internal *pip; struct wdb_pipept *pp1, *pp2, *pp3; point_t curr_pt; @@ -3267,12 +3268,6 @@ fastf_t dist_to_bend; point_t bend_start, bend_end, bend_center; - VSUB2(n1, curr_pt, pp2->pp_coord); - if (VNEAR_ZERO(n1, VUNITIZE_TOL)) { - /* duplicate point, skip to next point */ - goto next_pt; - } - if (!pp3) { /* last segment */ tesselate_pipe_linear(curr_pt, curr_od/2.0, curr_id/2.0, @@ -3281,6 +3276,12 @@ break; } + VSUB2(n1, curr_pt, pp2->pp_coord); + if (VNEAR_ZERO(n1, VUNITIZE_TOL)) { + /* duplicate point, skip to next point */ + goto next_pt; + } + VSUB2(n2, pp3->pp_coord, pp2->pp_coord); VCROSS(norm, n1, n2); if (VNEAR_ZERO(norm, VUNITIZE_TOL)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-10-05 16:17:39
|
Revision: 52840 http://brlcad.svn.sourceforge.net/brlcad/?rev=52840&view=rev Author: carlmoore Date: 2012-10-05 16:17:30 +0000 (Fri, 05 Oct 2012) Log Message: ----------- fix spellings Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-10-05 16:14:23 UTC (rev 52839) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-10-05 16:17:30 UTC (rev 52840) @@ -177,7 +177,7 @@ /* bounding box for entire torus */ /* include od of previous and next segment - * to allow for dinscontinuous radii + * to allow for discontinuous radii */ max_od = od; if (prev_od > max_od) { @@ -634,7 +634,7 @@ point_t hit_pt; fastf_t radius_sq; - /* calculate interstection with plane at center (with normal "norm") */ + /* calculate intersection with plane at center (with normal "norm") */ dist_to_plane = VDOT(norm, center); norm_dist = dist_to_plane - VDOT(norm, rp->r_pt); slant_factor = VDOT(norm, rp->r_dir); @@ -1627,7 +1627,7 @@ * v1 and v2 must be unit vectors normal to each other in plane of * circle. v1 must be in direction from center to start point (unless * a full circle is requested). "End" is the endpoint of - * arc. "Seg_count" is how many straight line segements to use to draw + * arc. "Seg_count" is how many straight line segments to use to draw * the arc. "Full_circle" is a flag to indicate that a complete circle * is desired. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <r_...@us...> - 2012-10-25 21:31:57
|
Revision: 53375 http://brlcad.svn.sourceforge.net/brlcad/?rev=53375&view=rev Author: r_weiss Date: 2012-10-25 21:31:50 +0000 (Thu, 25 Oct 2012) Log Message: ----------- Added a call to function "nmg_edge_fuse" at the end of function "rt_pipe_tess" in file "pipe.c". This is required because if a pipe is facetized to an NMG object, the resulting NMG can not be properly raytraced without the edges being fused. This also impacts NMG boolean operations since raytracing is sometimes necessary to determine if an NMG object is in/out/on another NMG object. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-10-25 21:29:18 UTC (rev 53374) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-10-25 21:31:50 UTC (rev 53375) @@ -3333,6 +3333,7 @@ bu_free((char *)inner_loop, "rt_pipe_tess: inner_loop"); nmg_rebound(m, tol); + nmg_edge_fuse(&s->l.magic, tol); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2012-11-15 19:57:19
|
Revision: 53711 http://brlcad.svn.sourceforge.net/brlcad/?rev=53711&view=rev Author: n_reed Date: 2012-11-15 19:57:05 +0000 (Thu, 15 Nov 2012) Log Message: ----------- ws/style Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-15 19:42:39 UTC (rev 53710) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-15 19:57:05 UTC (rev 53711) @@ -98,7 +98,7 @@ }; -#define PIPE_MM(_v) VMINMAX((*min), (*max), _v); +#define PIPE_MM(_v) VMINMAX((*min), (*max), _v) #define ARC_SEGS 16 /* number of segments used to plot a circle */ @@ -116,10 +116,13 @@ HIDDEN int -rt_bend_pipe_prep(struct bu_list *head, fastf_t *bend_center, - fastf_t *bend_start, fastf_t *bend_end, fastf_t bend_radius, - fastf_t bend_angle, fastf_t od, fastf_t id, - fastf_t prev_od, fastf_t next_od, point_t *min, point_t *max) +rt_bend_pipe_prep( + struct bu_list *head, + fastf_t *bend_center, fastf_t *bend_start, fastf_t *bend_end, + fastf_t bend_radius, fastf_t bend_angle, + fastf_t od, fastf_t id, + fastf_t prev_od, fastf_t next_od, + point_t *min, point_t *max) { struct bend_pipe *bp; vect_t to_start, to_end; @@ -142,7 +145,7 @@ VSUB2(to_start, bend_start, bend_center); bp->bend_radius = bend_radius; VSUB2(to_end, bend_end, bend_center); - VSCALE(bp->bend_ra, to_start, 1.0/bp->bend_radius); + VSCALE(bp->bend_ra, to_start, 1.0 / bp->bend_radius); VCROSS(bp->bend_N, to_start, to_end); VUNITIZE(bp->bend_N); VCROSS(bp->bend_rb, bp->bend_N, bp->bend_ra); @@ -158,8 +161,8 @@ return 1; } - bp->bend_alpha_i = bp->bend_ir/bp->bend_radius; - bp->bend_alpha_o = bp->bend_or/bp->bend_radius; + bp->bend_alpha_i = bp->bend_ir / bp->bend_radius; + bp->bend_alpha_o = bp->bend_or / bp->bend_radius; MAT_IDN(R); VMOVE(&R[0], bp->bend_ra); @@ -186,11 +189,11 @@ if (next_od > max_od) { max_od = next_od; } - max_or = max_od/2.0; + max_or = max_od / 2.0; max_r = bend_radius + max_or; VBLEND2(bp->bend_bound_center, 0.5, bend_start, 0.5, bend_end); - bp->bend_bound_radius_sq = max_r * sin(bend_angle/2.0); + bp->bend_bound_radius_sq = max_r * sin(bend_angle / 2.0); bp->bend_bound_radius_sq = bp->bend_bound_radius_sq * bp->bend_bound_radius_sq; bp->bend_bound_radius_sq += max_or * max_or; f = sqrt(bp->bend_bound_radius_sq); @@ -232,13 +235,13 @@ VMOVE(lp->pipe_V, pt1); VSUB2(seg_ht, pt2, pt1); - lp->pipe_ribase = id1/2.0; + lp->pipe_ribase = id1 / 2.0; lp->pipe_ribase_sq = lp->pipe_ribase * lp->pipe_ribase; - lp->pipe_ritop = id2/2.0; + lp->pipe_ritop = id2 / 2.0; lp->pipe_ritop_sq = lp->pipe_ritop * lp->pipe_ritop; - lp->pipe_robase = od1/2.0; + lp->pipe_robase = od1 / 2.0; lp->pipe_robase_sq = lp->pipe_robase * lp->pipe_robase; - lp->pipe_rotop = od2/2.0; + lp->pipe_rotop = od2 / 2.0; lp->pipe_rotop_sq = lp->pipe_rotop * lp->pipe_rotop; lp->pipe_ridiff = lp->pipe_ritop - lp->pipe_ribase; lp->pipe_ridiff_sq = lp->pipe_ridiff * lp->pipe_ridiff; @@ -247,7 +250,7 @@ lp->pipe_is_bend = 0; lp->pipe_len = MAGNITUDE(seg_ht); - VSCALE(seg_ht, seg_ht, 1.0/lp->pipe_len); + VSCALE(seg_ht, seg_ht, 1.0 / lp->pipe_len); VMOVE(lp->pipe_H, seg_ht); bn_vec_ortho(v1, seg_ht); VCROSS(v2, seg_ht, v1); @@ -263,7 +266,7 @@ /* Build Scale matrix */ MAT_IDN(S); - S[10] = 1.0/lp->pipe_len; + S[10] = 1.0 / lp->pipe_len; /* Compute SoR and invRoS */ bn_mat_mul(lp->pipe_SoR, S, R); @@ -273,30 +276,30 @@ VSETALL(lp->pipe_max, -MAX_FASTF); VJOIN2(work, pt1, od1, v1, od1, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt1, -od1, v1, od1, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt1, od1, v1, -od1, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt1, -od1, v1, -od1, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt2, od2, v1, od2, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt2, -od2, v1, od2, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt2, od2, v1, -od2, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); VJOIN2(work, pt2, -od2, v1, -od2, v2); - PIPE_MM(work) - VMINMAX(lp->pipe_min, lp->pipe_max, work); + PIPE_MM(work); + VMINMAX(lp->pipe_min, lp->pipe_max, work); if (head) { BU_LIST_INSERT(head, &lp->l); @@ -323,16 +326,19 @@ pip = (struct rt_pipe_internal *)ip->idb_ptr; RT_PIPE_CK_MAGIC(pip); - if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) + if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) { return 0; + } pp1 = BU_LIST_FIRST(wdb_pipept, &(pip->pipe_segs_head)); pp2 = BU_LIST_NEXT(wdb_pipept, &pp1->l); - if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) + if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) { return 0; + } pp3 = BU_LIST_NEXT(wdb_pipept, &pp2->l); - if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) { pp3 = (struct wdb_pipept *)NULL; + } VMOVE(curr_pt, pp1->pp_coord); curr_od = pp1->pp_od; @@ -363,7 +369,7 @@ VUNITIZE(n1); VUNITIZE(n2); angle = bn_pi - acos(VDOT(n1, n2)); - dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); + dist_to_bend = pp2->pp_bendradius * tan(angle / 2.0); if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { /* points are colinear, treat as a linear segment */ rt_linear_pipe_prep(NULL, curr_pt, curr_id, curr_od, @@ -394,15 +400,18 @@ pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, min, max); VMOVE(curr_pt, bend_end); - next_pt: - if (!pp3) break; +next_pt: + if (!pp3) { + break; + } curr_id = pp2->pp_id; curr_od = pp2->pp_od; pp1 = pp2; pp2 = pp3; pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); - if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) { pp3 = (struct wdb_pipept *)NULL; + } } return 0; @@ -434,7 +443,9 @@ fastf_t curr_id, curr_od; fastf_t dx, dy, dz, f; - if (rtip) RT_CK_RTI(rtip); + if (rtip) { + RT_CK_RTI(rtip); + } RT_CK_DB_INTERNAL(ip); pip = (struct rt_pipe_internal *)ip->idb_ptr; RT_PIPE_CK_MAGIC(pip); @@ -443,16 +454,19 @@ stp->st_specific = (genptr_t)head; BU_LIST_INIT(head); - if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) + if (BU_LIST_IS_EMPTY(&(pip->pipe_segs_head))) { return 0; + } pp1 = BU_LIST_FIRST(wdb_pipept, &(pip->pipe_segs_head)); pp2 = BU_LIST_NEXT(wdb_pipept, &pp1->l); - if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) + if (BU_LIST_IS_HEAD(&pp2->l, &(pip->pipe_segs_head))) { return 0; + } pp3 = BU_LIST_NEXT(wdb_pipept, &pp2->l); - if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) { pp3 = (struct wdb_pipept *)NULL; + } VMOVE(curr_pt, pp1->pp_coord); curr_od = pp1->pp_od; @@ -483,7 +497,7 @@ VUNITIZE(n1); VUNITIZE(n2); angle = bn_pi - acos(VDOT(n1, n2)); - dist_to_bend = pp2->pp_bendradius * tan(angle/2.0); + dist_to_bend = pp2->pp_bendradius * tan(angle / 2.0); if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { /* points are colinear, treat as a linear segment */ rt_linear_pipe_prep(head, curr_pt, curr_id, curr_od, @@ -514,30 +528,37 @@ pp2->pp_od, pp2->pp_id, pp1->pp_od, pp3->pp_od, &(stp->st_min), &(stp->st_max)); VMOVE(curr_pt, bend_end); - next_pt: - if (!pp3) break; +next_pt: + if (!pp3) { + break; + } curr_id = pp2->pp_id; curr_od = pp2->pp_od; pp1 = pp2; pp2 = pp3; pp3 = BU_LIST_NEXT(wdb_pipept, &pp3->l); - if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) + if (BU_LIST_IS_HEAD(&pp3->l, &(pip->pipe_segs_head))) { pp3 = (struct wdb_pipept *)NULL; + } } VSET(stp->st_center, - (stp->st_max[X] + stp->st_min[X])/2, - (stp->st_max[Y] + stp->st_min[Y])/2, - (stp->st_max[Z] + stp->st_min[Z])/2); + (stp->st_max[X] + stp->st_min[X]) / 2, + (stp->st_max[Y] + stp->st_min[Y]) / 2, + (stp->st_max[Z] + stp->st_min[Z]) / 2); - dx = (stp->st_max[X] - stp->st_min[X])/2; + dx = (stp->st_max[X] - stp->st_min[X]) / 2; f = dx; - dy = (stp->st_max[Y] - stp->st_min[Y])/2; - if (dy > f) f = dy; - dz = (stp->st_max[Z] - stp->st_min[Z])/2; - if (dz > f) f = dz; + dy = (stp->st_max[Y] - stp->st_min[Y]) / 2; + if (dy > f) { + f = dy; + } + dz = (stp->st_max[Z] - stp->st_min[Z]) / 2; + if (dz > f) { + f = dz; + } stp->st_aradius = f; - stp->st_bradius = sqrt(dx*dx + dy*dy + dz*dz); + stp->st_bradius = sqrt(dx * dx + dy * dy + dz * dz); return 0; } @@ -551,8 +572,9 @@ { struct bu_list *head = (struct bu_list *)stp->st_specific; - if (!head) + if (!head) { return; + } } @@ -567,13 +589,13 @@ bu_log("Pipe Vertex:\n"); VSCALE(p1, pipept->pp_coord, mm2local); bu_log("\tat (%g %g %g)\n", V3ARGS(p1)); - bu_log("\tbend radius = %g\n", pipept->pp_bendradius*mm2local); + bu_log("\tbend radius = %g\n", pipept->pp_bendradius * mm2local); if (pipept->pp_id > 0.0) { bu_log("\tod=%g, id=%g\n", - pipept->pp_od*mm2local, - pipept->pp_id*mm2local); + pipept->pp_od * mm2local, + pipept->pp_id * mm2local); } else { - bu_log("\tod=%g\n", pipept->pp_od*mm2local); + bu_log("\tod=%g\n", pipept->pp_od * mm2local); } } @@ -586,7 +608,7 @@ { struct rt_pipe_internal *pint; struct wdb_pipept *pipept; - int seg_count=0; + int seg_count = 0; char buf[256]; point_t p1; @@ -594,8 +616,9 @@ RT_PIPE_CK_MAGIC(pint); pipept = BU_LIST_FIRST(wdb_pipept, &pint->pipe_segs_head); - while (++seg_count != seg_no && BU_LIST_NOT_HEAD(&pipept->l, &pint->pipe_segs_head)) + while (++seg_count != seg_no && BU_LIST_NOT_HEAD(&pipept->l, &pint->pipe_segs_head)) { pipept = BU_LIST_NEXT(wdb_pipept, &pipept->l); + } sprintf(buf, "Pipe Vertex:\n"); @@ -603,14 +626,14 @@ VSCALE(p1, pipept->pp_coord, mm2local); sprintf(buf, "\tat (%g %g %g)\n", V3ARGS(p1)); bu_vls_strcat(vp, buf); - sprintf(buf, "\tbend radius = %g\n", pipept->pp_bendradius*mm2local); + sprintf(buf, "\tbend radius = %g\n", pipept->pp_bendradius * mm2local); bu_vls_strcat(vp, buf); if (pipept->pp_id > 0.0) { sprintf(buf, "\tod=%g, id=%g\n", - pipept->pp_od*mm2local, - pipept->pp_id*mm2local); + pipept->pp_od * mm2local, + pipept->pp_id * mm2local); } else { - sprintf(buf, "\tod=%g\n", pipept->pp_od*mm2local); + sprintf(buf, "\tod=%g\n", pipept->pp_od * mm2local); } bu_vls_strcat(vp, buf); } @@ -642,7 +665,7 @@ vect_t to_center; struct hit *hitp; - t_tmp = norm_dist/slant_factor; + t_tmp = norm_dist / slant_factor; VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); VSUB2(to_center, center, hit_pt); radius_sq = MAGSQ(to_center); @@ -659,7 +682,7 @@ hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_RADIUS_CHANGE; + hitp->hit_surfno = seg_no * 10 + PIPE_RADIUS_CHANGE; /* within first range, use norm, otherwise reverse */ if (radius_sq <= or1_sq && radius_sq >= ir1_sq) { @@ -708,7 +731,7 @@ bn_complex_t val[4]; /* The complex roots */ int j; - int root_count=0; + int root_count = 0; bn_poly_t A, Asqr; bn_poly_t X2_Y2; /* X**2 + Y**2 */ vect_t cor_pprime; /* new ray origin */ @@ -779,14 +802,14 @@ X2_Y2.cf[1] = 2.0 * (dprime[X] * cor_pprime[X] + dprime[Y] * cor_pprime[Y]); X2_Y2.cf[2] = cor_pprime[X] * cor_pprime[X] + - cor_pprime[Y] * cor_pprime[Y]; + cor_pprime[Y] * cor_pprime[Y]; /* A = X2_Y2 + Z2 */ A.dgr = 2; A.cf[0] = X2_Y2.cf[0] + dprime[Z] * dprime[Z]; A.cf[1] = X2_Y2.cf[1] + 2.0 * dprime[Z] * cor_pprime[Z]; A.cf[2] = X2_Y2.cf[2] + cor_pprime[Z] * cor_pprime[Z] + - 1.0 - bp->bend_alpha_o * bp->bend_alpha_o; + 1.0 - bp->bend_alpha_o * bp->bend_alpha_o; /* Inline expansion of (void) bn_poly_mul(&Asqr, &A, &A) */ /* Both polys have degree two */ @@ -815,13 +838,13 @@ bu_log("pipe: rt_poly_roots() 4!=%d\n", root_count); bn_pr_roots(stp->st_name, val, root_count); } else if (root_count < 0) { - static int reported=0; + static int reported = 0; bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); if (!reported) { VPRINT("while shooting from:\t", rp->r_pt); VPRINT("while shooting at:\t", rp->r_dir); bu_log("Additional pipe convergence failure details will be suppressed.\n"); - reported=1; + reported = 1; } } goto check_discont_radii; /* MISSED */ @@ -833,7 +856,7 @@ * sufficiently close, then use the real part as one value of 't' * for the intersections */ - for (j=0 ; j < 4; j++) { + for (j = 0 ; j < 4; j++) { if (NEAR_ZERO(val[j].im, 0.0001)) { struct hit *hitp; fastf_t normalized_dist; @@ -849,14 +872,15 @@ VJOIN1(hit_pt, rp->r_pt, distance, rp->r_dir); VSUB2(to_hit, hit_pt, bp->bend_V); angle = atan2(VDOT(to_hit, bp->bend_rb), VDOT(to_hit, bp->bend_ra)); - if (angle < 0.0) + if (angle < 0.0) { angle += 2.0 * bn_pi; + } if (angle <= bp->bend_angle) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = distance; VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); - hitp->hit_surfno = seg_no*10 + PIPE_BEND_OUTER_BODY; + hitp->hit_surfno = seg_no * 10 + PIPE_BEND_OUTER_BODY; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -866,8 +890,9 @@ } } - if (bp->bend_alpha_i <= 0.0) - goto check_discont_radii; /* no inner torus */ + if (bp->bend_alpha_i <= 0.0) { + goto check_discont_radii; /* no inner torus */ + } if (parallel && dist > bp->bend_ir) { /* ray is parallel to plane of bend and more than inner radius away */ @@ -876,7 +901,7 @@ /* Now do inner torus */ A.cf[2] = X2_Y2.cf[2] + cor_pprime[Z] * cor_pprime[Z] + - 1.0 - bp->bend_alpha_i * bp->bend_alpha_i; + 1.0 - bp->bend_alpha_i * bp->bend_alpha_i; /* Inline expansion of (void) bn_poly_mul(&Asqr, &A, &A) */ /* Both polys have degree two */ @@ -905,13 +930,13 @@ bu_log("tor: rt_poly_roots() 4!=%d\n", root_count); bn_pr_roots(stp->st_name, val, root_count); } else if (root_count < 0) { - static int reported=0; + static int reported = 0; bu_log("The root solver failed to converge on a solution for %s\n", stp->st_dp->d_namep); if (!reported) { VPRINT("while shooting from:\t", rp->r_pt); VPRINT("while shooting at:\t", rp->r_dir); bu_log("Additional pipe convergence failure details will be suppressed.\n"); - reported=1; + reported = 1; } } goto check_discont_radii; /* MISSED */ @@ -923,7 +948,7 @@ * sufficiently close, then use the real part as one value of 't' * for the intersections */ - for (j=0, root_count=0; j < 4; j++) { + for (j = 0, root_count = 0; j < 4; j++) { if (NEAR_ZERO(val[j].im, 0.0001)) { struct hit *hitp; fastf_t normalized_dist; @@ -939,14 +964,15 @@ VJOIN1(hit_pt, rp->r_pt, distance, rp->r_dir); VSUB2(to_hit, hit_pt, bp->bend_V); angle = atan2(VDOT(to_hit, bp->bend_rb), VDOT(to_hit, bp->bend_ra)); - if (angle < 0.0) + if (angle < 0.0) { angle += 2.0 * bn_pi; + } if (angle <= bp->bend_angle) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = distance; VJOIN1(hitp->hit_vpriv, pprime, normalized_dist, dprime); - hitp->hit_surfno = seg_no*10 + PIPE_BEND_INNER_BODY; + hitp->hit_surfno = seg_no * 10 + PIPE_BEND_INNER_BODY; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -984,8 +1010,8 @@ if (next->l.magic != BU_LIST_HEAD_MAGIC) { if (next->pipe_is_bend) { struct bend_pipe *bend = (struct bend_pipe *)next; - or2_sq = bend->bend_or*bend->bend_or; - ir2_sq = bend->bend_ir*bend->bend_ir; + or2_sq = bend->bend_or * bend->bend_or; + ir2_sq = bend->bend_ir * bend->bend_ir; if (!NEAR_EQUAL(or_sq, or2_sq, RT_LEN_TOL) || !NEAR_EQUAL(ir_sq, ir2_sq, RT_LEN_TOL)) { discont_radius_shot(rp, bp->bend_end, bp->bend_endNorm, @@ -1033,20 +1059,20 @@ MAT4X3VEC(ray_dir, lp->pipe_SoR, rp->r_dir); /* Intersect with outer sides */ - a = ray_dir[X]*ray_dir[X] - + ray_dir[Y]*ray_dir[Y] - - ray_dir[Z]*ray_dir[Z]*lp->pipe_rodiff_sq; - b = 2.0*(ray_start[X]*ray_dir[X] - + ray_start[Y]*ray_dir[Y] - - ray_start[Z]*ray_dir[Z]*lp->pipe_rodiff_sq - - ray_dir[Z]*lp->pipe_robase*lp->pipe_rodiff); - c = ray_start[X]*ray_start[X] - + ray_start[Y]*ray_start[Y] - - lp->pipe_robase*lp->pipe_robase - - ray_start[Z]*ray_start[Z]*lp->pipe_rodiff_sq - - 2.0*ray_start[Z]*lp->pipe_robase*lp->pipe_rodiff; + a = ray_dir[X] * ray_dir[X] + + ray_dir[Y] * ray_dir[Y] + - ray_dir[Z] * ray_dir[Z] * lp->pipe_rodiff_sq; + b = 2.0 * (ray_start[X] * ray_dir[X] + + ray_start[Y] * ray_dir[Y] + - ray_start[Z] * ray_dir[Z] * lp->pipe_rodiff_sq + - ray_dir[Z] * lp->pipe_robase * lp->pipe_rodiff); + c = ray_start[X] * ray_start[X] + + ray_start[Y] * ray_start[Y] + - lp->pipe_robase * lp->pipe_robase + - ray_start[Z] * ray_start[Z] * lp->pipe_rodiff_sq + - 2.0 * ray_start[Z] * lp->pipe_robase * lp->pipe_rodiff; - descrim = b*b - 4.0*a*c; + descrim = b * b - 4.0 * a * c; if (descrim > 0.0) { fastf_t sqrt_descrim; @@ -1054,16 +1080,16 @@ sqrt_descrim = sqrt(descrim); - t_tmp = (-b - sqrt_descrim)/(2.0*a); + t_tmp = (-b - sqrt_descrim) / (2.0 * a); VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; + hitp->hit_surfno = seg_no * 10 + PIPE_LINEAR_OUTER_BODY; VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-lp->pipe_robase - hit_pt[Z] * lp->pipe_rodiff) * - lp->pipe_rodiff; + lp->pipe_rodiff; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1071,16 +1097,16 @@ } } - t_tmp = (-b + sqrt_descrim)/(2.0*a); + t_tmp = (-b + sqrt_descrim) / (2.0 * a); VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_OUTER_BODY; + hitp->hit_surfno = seg_no * 10 + PIPE_LINEAR_OUTER_BODY; VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-lp->pipe_robase - hit_pt[Z] * lp->pipe_rodiff) * - lp->pipe_rodiff; + lp->pipe_rodiff; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1092,20 +1118,20 @@ if (lp->pipe_ribase > 0.0 || lp->pipe_ritop > 0.0) { /* Intersect with inner sides */ - a = ray_dir[X]*ray_dir[X] - + ray_dir[Y]*ray_dir[Y] - - ray_dir[Z]*ray_dir[Z]*lp->pipe_ridiff_sq; - b = 2.0*(ray_start[X]*ray_dir[X] - + ray_start[Y]*ray_dir[Y] - - ray_start[Z]*ray_dir[Z]*lp->pipe_ridiff_sq - - ray_dir[Z]*lp->pipe_ribase*lp->pipe_ridiff); - c = ray_start[X]*ray_start[X] - + ray_start[Y]*ray_start[Y] - - lp->pipe_ribase*lp->pipe_ribase - - ray_start[Z]*ray_start[Z]*lp->pipe_ridiff_sq - - 2.0*ray_start[Z]*lp->pipe_ribase*lp->pipe_ridiff; + a = ray_dir[X] * ray_dir[X] + + ray_dir[Y] * ray_dir[Y] + - ray_dir[Z] * ray_dir[Z] * lp->pipe_ridiff_sq; + b = 2.0 * (ray_start[X] * ray_dir[X] + + ray_start[Y] * ray_dir[Y] + - ray_start[Z] * ray_dir[Z] * lp->pipe_ridiff_sq + - ray_dir[Z] * lp->pipe_ribase * lp->pipe_ridiff); + c = ray_start[X] * ray_start[X] + + ray_start[Y] * ray_start[Y] + - lp->pipe_ribase * lp->pipe_ribase + - ray_start[Z] * ray_start[Z] * lp->pipe_ridiff_sq + - 2.0 * ray_start[Z] * lp->pipe_ribase * lp->pipe_ridiff; - descrim = b*b - 4.0*a*c; + descrim = b * b - 4.0 * a * c; if (descrim > 0.0) { fastf_t sqrt_descrim; @@ -1113,16 +1139,16 @@ sqrt_descrim = sqrt(descrim); - t_tmp = (-b - sqrt_descrim)/(2.0*a); + t_tmp = (-b - sqrt_descrim) / (2.0 * a); VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; + hitp->hit_surfno = seg_no * 10 + PIPE_LINEAR_INNER_BODY; VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-lp->pipe_ribase - hit_pt[Z] * lp->pipe_ridiff) * - lp->pipe_ridiff; + lp->pipe_ridiff; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1130,16 +1156,16 @@ } } - t_tmp = (-b + sqrt_descrim)/(2.0*a); + t_tmp = (-b + sqrt_descrim) / (2.0 * a); VJOIN1(hit_pt, ray_start, t_tmp, ray_dir); if (hit_pt[Z] >= 0.0 && hit_pt[Z] <= 1.0) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_INNER_BODY; + hitp->hit_surfno = seg_no * 10 + PIPE_LINEAR_INNER_BODY; VMOVE(hitp->hit_vpriv, hit_pt); hitp->hit_vpriv[Z] = (-lp->pipe_ribase - hit_pt[Z] * lp->pipe_ridiff) * - lp->pipe_ridiff; + lp->pipe_ridiff; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1161,7 +1187,7 @@ struct hit *hitp; if (!id_p->pipe_is_bend) { - struct lin_pipe *lin=(struct lin_pipe *)(&id_p->l); + struct lin_pipe *lin = (struct lin_pipe *)(&id_p->l); fastf_t dist_to_plane; fastf_t norm_dist; fastf_t slant_factor; @@ -1172,7 +1198,7 @@ if (!ZERO(slant_factor)) { vect_t to_center; - t_tmp = norm_dist/slant_factor; + t_tmp = norm_dist / slant_factor; VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); VSUB2(to_center, lin->pipe_V, hit_pt); radius_sq = MAGSQ(to_center); @@ -1180,7 +1206,7 @@ hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_BASE; + hitp->hit_surfno = seg_no * 10 + PIPE_LINEAR_BASE; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1189,7 +1215,7 @@ } } } else if (id_p->pipe_is_bend) { - struct bend_pipe *bend=(struct bend_pipe *)(&id_p->l); + struct bend_pipe *bend = (struct bend_pipe *)(&id_p->l); fastf_t dist_to_plane; fastf_t norm_dist; fastf_t slant_factor; @@ -1201,15 +1227,15 @@ if (!ZERO(slant_factor)) { vect_t to_center; - t_tmp = norm_dist/slant_factor; + t_tmp = norm_dist / slant_factor; VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); VSUB2(to_center, bend->bend_start, hit_pt); radius_sq = MAGSQ(to_center); - if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { + if (radius_sq <= bend->bend_or * bend->bend_or && radius_sq >= bend->bend_ir * bend->bend_ir) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_BEND_BASE; + hitp->hit_surfno = seg_no * 10 + PIPE_BEND_BASE; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1230,7 +1256,7 @@ struct hit *hitp; if (!id_p->pipe_is_bend) { - struct lin_pipe *lin=(struct lin_pipe *)(&id_p->l); + struct lin_pipe *lin = (struct lin_pipe *)(&id_p->l); point_t top; fastf_t dist_to_plane; fastf_t norm_dist; @@ -1243,7 +1269,7 @@ if (!ZERO(slant_factor)) { vect_t to_center; - t_tmp = norm_dist/slant_factor; + t_tmp = norm_dist / slant_factor; VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); VSUB2(to_center, top, hit_pt); radius_sq = MAGSQ(to_center); @@ -1251,7 +1277,7 @@ hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_LINEAR_TOP; + hitp->hit_surfno = seg_no * 10 + PIPE_LINEAR_TOP; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1260,7 +1286,7 @@ } } } else if (id_p->pipe_is_bend) { - struct bend_pipe *bend=(struct bend_pipe *)(&id_p->l); + struct bend_pipe *bend = (struct bend_pipe *)(&id_p->l); vect_t to_end; vect_t plane_norm; fastf_t dist_to_plane; @@ -1278,15 +1304,15 @@ if (!ZERO(slant_factor)) { vect_t to_center; - t_tmp = norm_dist/slant_factor; + t_tmp = norm_dist / slant_factor; VJOIN1(hit_pt, rp->r_pt, t_tmp, rp->r_dir); VSUB2(to_center, bend->bend_end, hit_pt); radius_sq = MAGSQ(to_center); - if (radius_sq <= bend->bend_or*bend->bend_or && radius_sq >= bend->bend_ir*bend->bend_ir) { + if (radius_sq <= bend->bend_or * bend->bend_or && radius_sq >= bend->bend_ir * bend->bend_ir) { hitp = &hits[*hit_count]; hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t_tmp; - hitp->hit_surfno = seg_no*10 + PIPE_BEND_TOP; + hitp->hit_surfno = seg_no * 10 + PIPE_BEND_TOP; if ((*hit_count)++ >= RT_PIPE_MAXHITS) { bu_log("Too many hits (%d) on primitive (%s)\n", *hit_count, stp->st_dp->d_namep); @@ -1306,15 +1332,15 @@ int hitNo = 0; /* delete duplicate hits */ - while (hitNo < ((*nh)-1)) { + while (hitNo < ((*nh) - 1)) { hitp = &hit[hitNo]; - next_hit = &hit[hitNo+1]; + next_hit = &hit[hitNo + 1]; if (NEAR_EQUAL(hitp->hit_dist, next_hit->hit_dist, 0.00001) && hitp->hit_surfno == next_hit->hit_surfno) { int i; - for (i=hitNo ; i<(*nh) ; i++) { - hit[i] = hit[i+1]; + for (i = hitNo ; i < (*nh) ; i++) { + hit[i] = hit[i + 1]; } (*nh)--; } else { @@ -1327,8 +1353,9 @@ return; } - if ((*nh) == 0 || (*nh) == 2) + if ((*nh) == 0 || (*nh) == 2) { return; + } /* handle cases where this pipe overlaps with itself */ hitp = &hit[0]; @@ -1344,7 +1371,7 @@ } hitNo = 0; - while (hitNo < ((*nh)-1)) { + while (hitNo < ((*nh) - 1)) { int hitNoPlus = hitNo + 1; /* struct hit *first = &hit[hitNo]; */ struct hit *second = &hit[hitNoPlus]; @@ -1352,8 +1379,8 @@ /* keep first entrance hit, eliminate all successive entrance hits */ while (hitNoPlus < (*nh) && VDOT(second->hit_normal, rp->r_dir) < 0.0) { int j; - for (j=hitNoPlus ; j<((*nh)-1) ; j++) { - hit[j] = hit[j+1]; + for (j = hitNoPlus ; j < ((*nh) - 1) ; j++) { + hit[j] = hit[j + 1]; } (*nh)--; second = &hit[hitNoPlus]; @@ -1373,8 +1400,8 @@ /* eliminate all exit hits (except the last one) till we find another entrance hit */ while (hitNoPlus < (*nh) && VDOT(second->hit_normal, rp->r_dir) > 0.0) { int j; - for (j=hitNoPlus-1 ; j<((*nh)-1) ; j++) { - hit[j] = hit[j+1]; + for (j = hitNoPlus - 1 ; j < ((*nh) - 1) ; j++) { + hit[j] = hit[j + 1]; } (*nh)--; second = &hit[hitNoPlus]; @@ -1402,17 +1429,18 @@ int segno; int i; - segno = hitp->hit_surfno/10; + segno = hitp->hit_surfno / 10; pipe_id = BU_LIST_FIRST(id_pipe, head); - for (i=1; i<segno; i++) + for (i = 1; i < segno; i++) { pipe_id = BU_LIST_NEXT(id_pipe, &pipe_id->l); + } pipe_lin = (struct lin_pipe *)pipe_id; pipe_bend = (struct bend_pipe *)pipe_id; VJOIN1(hitp->hit_point, rp->r_pt, hitp->hit_dist, rp->r_dir); - switch (hitp->hit_surfno%10) { + switch (hitp->hit_surfno % 10) { case PIPE_LINEAR_TOP: VMOVE(hitp->hit_normal, pipe_lin->pipe_H); break; @@ -1429,10 +1457,10 @@ VREVERSE(hitp->hit_normal, hitp->hit_normal); break; case PIPE_BEND_OUTER_BODY: - w = hitp->hit_vpriv[X]*hitp->hit_vpriv[X] + - hitp->hit_vpriv[Y]*hitp->hit_vpriv[Y] + - hitp->hit_vpriv[Z]*hitp->hit_vpriv[Z] + - 1.0 - pipe_bend->bend_alpha_o*pipe_bend->bend_alpha_o; + w = hitp->hit_vpriv[X] * hitp->hit_vpriv[X] + + hitp->hit_vpriv[Y] * hitp->hit_vpriv[Y] + + hitp->hit_vpriv[Z] * hitp->hit_vpriv[Z] + + 1.0 - pipe_bend->bend_alpha_o * pipe_bend->bend_alpha_o; VSET(work, (w - 2.0) * hitp->hit_vpriv[X], (w - 2.0) * hitp->hit_vpriv[Y], @@ -1441,10 +1469,10 @@ MAT3X3VEC(hitp->hit_normal, pipe_bend->bend_invR, work); break; case PIPE_BEND_INNER_BODY: - w = hitp->hit_vpriv[X]*hitp->hit_vpriv[X] + - hitp->hit_vpriv[Y]*hitp->hit_vpriv[Y] + - hitp->hit_vpriv[Z]*hitp->hit_vpriv[Z] + - 1.0 - pipe_bend->bend_alpha_i*pipe_bend->bend_alpha_i; + w = hitp->hit_vpriv[X] * hitp->hit_vpriv[X] + + hitp->hit_vpriv[Y] * hitp->hit_vpriv[Y] + + hitp->hit_vpriv[Z] * hitp->hit_vpriv[Z] + + 1.0 - pipe_bend->bend_alpha_i * pipe_bend->bend_alpha_i; VSET(work, (w - 2.0) * hitp->hit_vpriv[X], (w - 2.0) * hitp->hit_vpriv[Y], @@ -1493,8 +1521,9 @@ pipe_start_shot(stp, rp, BU_LIST_FIRST(id_pipe, head), hits, &total_hits, 1); seg_no = 0; - for (BU_LIST_FOR(pipe_id, id_pipe, head)) + for (BU_LIST_FOR(pipe_id, id_pipe, head)) { seg_no++; + } pipe_end_shot(stp, rp, BU_LIST_LAST(id_pipe, head), hits, &total_hits, seg_no); seg_no = 0; @@ -1515,11 +1544,12 @@ bend_pipe_shot(stp, rp, bend, hits, &total_hits, seg_no); } } - if (!total_hits) + if (!total_hits) { return 0; + } /* calculate hit points and normals */ - for (i=0 ; i<total_hits ; i++) { + for (i = 0 ; i < total_hits ; i++) { rt_pipe_norm(&hits[i], stp, rp); } @@ -1530,11 +1560,11 @@ rt_pipe_elim_dups(hits, &total_hits, rp, stp); /* Build segments */ - if (total_hits%2) { + if (total_hits % 2) { bu_log("rt_pipe_shot: bad number of hits on solid %s (%d)\n", stp->st_dp->d_namep, total_hits); bu_log("Ignoring this solid for this ray\n"); bu_log("\tray start = (%e %e %e), ray dir = (%e %e %e)\n", V3ARGS(rp->r_pt), V3ARGS(rp->r_dir)); - for (i=0 ; i<total_hits ; i++) { + for (i = 0 ; i < total_hits ; i++) { point_t hit_pt; bu_log("#%d, dist = %g, surfno=%d\n", i, hits[i].hit_dist, hits[i].hit_surfno); @@ -1545,21 +1575,22 @@ return 0; } - for (i=0 ; i<total_hits ; i += 2) { + for (i = 0 ; i < total_hits ; i += 2) { RT_GET_SEG(segp, ap->a_resource); segp->seg_stp = stp; segp->seg_in = hits[i]; - segp->seg_out = hits[i+1]; + segp->seg_out = hits[i + 1]; BU_LIST_INSERT(&(seghead->l), &(segp->l)); } - if (total_hits) - return 1; /* HIT */ - else - return 0; /* MISS */ + if (total_hits) { + return 1; /* HIT */ + } else { + return 0; /* MISS */ + } } @@ -1571,9 +1602,12 @@ void rt_pipe_curve(struct curvature *cvp, struct hit *hitp, struct soltab *stp) { - if (!cvp || !hitp) + if (!cvp || !hitp) { return; - if (stp) RT_CK_SOLTAB(stp); + } + if (stp) { + RT_CK_SOLTAB(stp); + } cvp->crv_c1 = cvp->crv_c2 = 0; @@ -1593,8 +1627,9 @@ void rt_pipe_uv(struct application *ap, struct soltab *stp, struct hit *hitp, struct uvcoord *uvp) { - if (!ap || !stp || !hitp || !uvp) + if (!ap || !stp || !hitp || !uvp) { return; + } } @@ -1604,8 +1639,9 @@ void rt_pipe_free(struct soltab *stp) { - if (!stp) + if (!stp) { return; + } /* FIXME: make sure we're not leaking memory here */ } @@ -1648,9 +1684,9 @@ if (!full_circle) { VSUB2(to_end, end, center); arc_angle = atan2(VDOT(to_end, v2), VDOT(to_end, v1)); - delta_ang = arc_angle/seg_count; + delta_ang = arc_angle / seg_count; } else { - delta_ang = 2.0*bn_pi/seg_count; + delta_ang = 2.0 * bn_pi / seg_count; } cos_del = cos(delta_ang); @@ -1660,9 +1696,9 @@ y = 0.0; VJOIN2(pt, center, x, v1, y, v2); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - for (i=0; i<seg_count; i++) { - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + for (i = 0; i < seg_count; i++) { + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; VJOIN2(pt, center, xnew, v1, ynew, v2); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); x = xnew; @@ -1695,8 +1731,9 @@ VJOIN1(pt, p2, -or2, v2); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - if (ir1 <= 0.0 && ir2 <= 0.0) + if (ir1 <= 0.0 && ir2 <= 0.0) { return; + } VJOIN1(pt, p1, ir1, v1); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); @@ -1718,7 +1755,15 @@ HIDDEN void -draw_pipe_bend(struct bu_list *vhead, const fastf_t *center, const fastf_t *end, const fastf_t radius, const fastf_t angle, const fastf_t *v1, const fastf_t *v2, const fastf_t *norm, const fastf_t or, const fastf_t ir, fastf_t *f1, fastf_t *f2, const int seg_count) +draw_pipe_bend( + struct bu_list *vhead, + const fastf_t *center, const fastf_t *end, + const fastf_t radius, const fastf_t angle, + const fastf_t *v1, const fastf_t *v2, + const fastf_t *norm, + const fastf_t or , const fastf_t ir, + fastf_t *f1, fastf_t *f2, + const int seg_count) { point_t tmp_center, tmp_start, tmp_end; vect_t tmp_vec; @@ -1738,28 +1783,28 @@ VMOVE(end_f2, tmp_vec); move_dist = or * VDOT(f1, norm); - VJOIN2(tmp_start, center, radius, v1, or, f1); + VJOIN2(tmp_start, center, radius, v1, or , f1); VJOIN1(tmp_center, center, move_dist, norm); - VJOIN1(tmp_end, end, or, end_f1); + VJOIN1(tmp_end, end, or , end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); - VJOIN2(tmp_start, center, radius, v1, -or, f1); + VJOIN2(tmp_start, center, radius, v1, - or , f1); VJOIN1(tmp_center, center, -move_dist, norm); - VJOIN1(tmp_end, end, -or, end_f1); + VJOIN1(tmp_end, end, - or , end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); move_dist = or * VDOT(f2, norm); - VJOIN2(tmp_start, center, radius, v1, or, f2); + VJOIN2(tmp_start, center, radius, v1, or , f2); VJOIN1(tmp_center, center, move_dist, norm); - VJOIN1(tmp_end, end, or, end_f2); + VJOIN1(tmp_end, end, or , end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); - VJOIN2(tmp_start, center, radius, v1, -or, f2); + VJOIN2(tmp_start, center, radius, v1, - or , f2); VJOIN1(tmp_center, center, -move_dist, norm); - VJOIN1(tmp_end, end, -or, end_f2); + VJOIN1(tmp_end, end, - or , end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); @@ -1820,15 +1865,17 @@ pip = (struct rt_pipe_internal *)ip->idb_ptr; RT_PIPE_CK_MAGIC(pip); - if (BU_LIST_IS_EMPTY(&pip->pipe_segs_head)) + if (BU_LIST_IS_EMPTY(&pip->pipe_segs_head)) { return 0; + } prevp = BU_LIST_FIRST(wdb_pipept, &pip->pipe_segs_head); curp = BU_LIST_NEXT(wdb_pipept, &prevp->l); nextp = BU_LIST_NEXT(wdb_pipept, &curp->l); - if (BU_LIST_IS_HEAD(&curp->l, &pip->pipe_segs_head)) - return 0; /* nothing to plot */ + if (BU_LIST_IS_HEAD(&curp->l, &pip->pipe_segs_head)) { + return 0; /* nothing to plot */ + } VMOVE(current_point, prevp->pp_coord); @@ -1838,9 +1885,10 @@ VCROSS(f2, f3, f1); VUNITIZE(f2); - draw_pipe_arc(vhead, prevp->pp_od/2.0, prevp->pp_coord, f1, f2, f2, ARC_SEGS, 1); - if (prevp->pp_id > 0.0) - draw_pipe_arc(vhead, prevp->pp_id/2.0, prevp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + draw_pipe_arc(vhead, prevp->pp_od / 2.0, prevp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + if (prevp->pp_id > 0.0) { + draw_pipe_arc(vhead, prevp->pp_id / 2.0, prevp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + } while (1) { vect_t n1, n2; @@ -1850,8 +1898,8 @@ if (BU_LIST_IS_HEAD(&nextp->l, &pip->pipe_segs_head)) { /* last segment */ - draw_linear_seg(vhead, current_point, prevp->pp_od/2.0, prevp->pp_id/2.0, - curp->pp_coord, curp->pp_od/2.0, curp->pp_id/2.0, f1, f2); + draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); break; } @@ -1865,11 +1913,11 @@ VUNITIZE(n1); VUNITIZE(n2); angle = bn_pi - acos(VDOT(n1, n2)); - dist_to_bend = curp->pp_bendradius * tan(angle/2.0); + dist_to_bend = curp->pp_bendradius * tan(angle / 2.0); if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { /* points are colinear, draw linear segment */ - draw_linear_seg(vhead, current_point, prevp->pp_od/2.0, prevp->pp_id/2.0, - curp->pp_coord, curp->pp_od/2.0, curp->pp_id/2.0, f1, f2); + draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); VMOVE(current_point, curp->pp_coord); } else { point_t bend_center; @@ -1881,8 +1929,8 @@ /* draw linear segment to start of bend */ VJOIN1(bend_start, curp->pp_coord, dist_to_bend, n1); - draw_linear_seg(vhead, current_point, prevp->pp_od/2.0, prevp->pp_id/2.0, - bend_start, curp->pp_od/2.0, curp->pp_id/2.0, f1, f2); + draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + bend_start, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); /* draw bend */ VJOIN1(bend_end, curp->pp_coord, dist_to_bend, n2); @@ -1890,19 +1938,20 @@ VCROSS(v2, v1, norm); VJOIN1(bend_center, bend_start, -curp->pp_bendradius, v1); draw_pipe_bend(vhead, bend_center, bend_end, curp->pp_bendradius, angle, v1, v2, norm, - curp->pp_od/2.0, curp->pp_id/2.0, f1, f2, ARC_SEGS); + curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2, ARC_SEGS); VMOVE(current_point, bend_end); } - next_pt: +next_pt: prevp = curp; curp = nextp; nextp = BU_LIST_NEXT(wdb_pipept, &curp->l); } - draw_pipe_arc(vhead, curp->pp_od/2.0, curp->pp_coord, f1, f2, f2, ARC_SEGS, 1); - if (curp->pp_id > 0.0) - draw_pipe_arc(vhead, curp->pp_id/2.0, curp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + draw_pipe_arc(vhead, curp->pp_od / 2.0, curp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + if (curp->pp_id > 0.0) { + draw_pipe_arc(vhead, curp->pp_id / 2.0, curp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + } return 0; } @@ -1932,19 +1981,21 @@ bn_vec_ortho(r1, n); VCROSS(r2, n, r1); - or = pipept->pp_od/2.0; - ir = pipept->pp_id/2.0; + or = pipept->pp_od / 2.0; + ir = pipept->pp_id / 2.0; - if (or <= tol->dist) + if ( or <= tol->dist) { return; + } - if (ir > or) { + if (ir > or ) { bu_log("Inner radius larger than outer radius at start of pipe solid\n"); return; } - if (NEAR_EQUAL(ir, or, tol->dist)) + if (NEAR_EQUAL(ir, or , tol->dist)) { return; + } fu = nmg_cface(s, *outer_loop, arc_segs); @@ -1957,8 +2008,8 @@ VJOIN2(pt, pipept->pp_coord, x, r1, y, r2); (*outer_loop)[++i] = eu->vu_p->v_p; nmg_vertex_gv(eu->vu_p->v_p, pt); - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; } @@ -1979,11 +2030,11 @@ VJOIN2(pt, pipept->pp_coord, x, r1, y, r2); nmg_vertex_gv((*inner_loop)[0], pt); /* split edges in loop for each vertex in inner loop */ - for (i=1; i<arc_segs; i++) { + for (i = 1; i < arc_segs; i++) { new_eu = nmg_eusplit((struct vertex *)NULL, eu, 0); (*inner_loop)[i] = new_eu->vu_p->v_p; - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; VJOIN2(pt, pipept->pp_coord, x, r1, y, r2); @@ -1999,14 +2050,16 @@ nmg_vertex_gv(vu->v_p, pipept->pp_coord); } - if (nmg_calc_face_g(fu)) + if (nmg_calc_face_g(fu)) { bu_bomb("tesselate_pipe_start: nmg_calc_face_g failed\n"); + } for (BU_LIST_FOR(lu, loopuse, &fu->lu_hd)) { NMG_CK_LOOPUSE(lu); - if (BU_LIST_FIRST_MAGIC(&lu->down_hd) != NMG_EDGEUSE_MAGIC) + if (BU_LIST_FIRST_MAGIC(&lu->down_hd) != NMG_EDGEUSE_MAGIC) { continue; + } for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { NMG_CK_EDGEUSE(eu); @@ -2018,7 +2071,7 @@ HIDDEN void tesselate_pipe_linear(fastf_t *start_pt, - fastf_t or, + fastf_t or , fastf_t ir, fastf_t *end_pt, fastf_t end_or, @@ -2050,44 +2103,45 @@ if (end_or > tol->dist) { new_outer_loop = (struct vertex **)bu_calloc(arc_segs, sizeof(struct vertex *), - "tesselate_pipe_linear: new_outer_loop"); + "tesselate_pipe_linear: new_outer_loop"); } else { new_outer_loop = (struct vertex **)NULL; } if (end_ir > tol->dist) { new_inner_loop = (struct vertex **)bu_calloc(arc_segs, sizeof(struct vertex *), - "tesselate_pipe_linear: new_inner_loop"); + "tesselate_pipe_linear: new_inner_loop"); } else { new_inner_loop = (struct vertex **)NULL; } VSUB2(n, end_pt, start_pt); seg_len = MAGNITUDE(n); - VSCALE(n, n, 1.0/seg_len); - slope = (or - end_or)/seg_len; + VSCALE(n, n, 1.0 / seg_len); + slope = ( or - end_or) / seg_len; - if (or > tol->dist && end_or > tol->dist) { + if ( or > tol->dist && end_or > tol->dist) { point_t pt; fastf_t x, y, xnew, ynew; - struct faceuse *fu_prev=(struct faceuse *)NULL; + struct faceuse *fu_prev = (struct faceuse *)NULL; x = 1.0; y = 0.0; VCOMB2(norms[0], x, r1, y, r2); VJOIN1(norms[0], norms[0], slope, n); VUNITIZE(norms[0]); - for (i=0; i<arc_segs; i++) { - j = i+1; - if (j == arc_segs) + for (i = 0; i < arc_segs; i++) { + j = i + 1; + if (j == arc_segs) { j = 0; + } - VJOIN2(pt, end_pt, x*end_or, r1, y*end_or, r2); - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + VJOIN2(pt, end_pt, x * end_or, r1, y * end_or, r2); + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; - if (i < arc_segs-1) { + if (i < arc_segs - 1) { VCOMB2(norms[j], x, r1, y, r2); VJOIN1(norms[j], norms[j], slope, n); VUNITIZE(norms[j]); @@ -2105,8 +2159,9 @@ NMG_CK_FACEUSE(fu_prev); - if (fu_prev->orientation != OT_SAME) + if (fu_prev->orientation != OT_SAME) { fu_prev = fu_prev->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu_prev->lu_hd); @@ -2115,13 +2170,13 @@ struct edgeuse *eu_opp_use; eu_opp_use = BU_LIST_PNEXT_CIRC(edgeuse, &eu->eumate_p->l); - if (eu->vu_p->v_p == new_outer_loop[i-1]) { - nmg_vertexuse_nv(eu->vu_p, norms[i-1]); - VREVERSE(reverse_norm, norms[i-1]); + if (eu->vu_p->v_p == new_outer_loop[i - 1]) { + nmg_vertexuse_nv(eu->vu_p, norms[i - 1]); + VREVERSE(reverse_norm, norms[i - 1]); nmg_vertexuse_nv(eu_opp_use->vu_p, reverse_norm); - } else if (eu->vu_p->v_p == (*outer_loop)[i-1]) { - nmg_vertexuse_nv(eu->vu_p, norms[i-1]); - VREVERSE(reverse_norm, norms[i-1]); + } else if (eu->vu_p->v_p == (*outer_loop)[i - 1]) { + nmg_vertexuse_nv(eu->vu_p, norms[i - 1]); + VREVERSE(reverse_norm, norms[i - 1]); nmg_vertexuse_nv(eu_opp_use->vu_p, reverse_norm); } else if (eu->vu_p->v_p == new_outer_loop[i]) { nmg_vertexuse_nv(eu->vu_p, norms[i]); @@ -2145,11 +2200,12 @@ if ((fu = nmg_cmface(s, verts, 3)) == NULL) { bu_log("tesselate_pipe_linear: failed to make outer face #%d or=%g, end_or=%g\n", - i, or, end_or); + i, or , end_or); continue; } - if (!new_outer_loop[i]->vg_p) + if (!new_outer_loop[i]->vg_p) { nmg_vertex_gv(new_outer_loop[i], pt); + } if (nmg_calc_face_g(fu)) { bu_log("tesselate_pipe_linear: nmg_calc_face_g failed\n"); @@ -2161,8 +2217,9 @@ NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); @@ -2199,10 +2256,10 @@ if ((fu_prev = nmg_cmface(s, verts, 3)) == NULL) { bu_log("tesselate_pipe_linear: failed to make outer face #%d or=%g, end_or=%g\n", - i, or, end_or); + i, or , end_or); continue; } - if (i == arc_segs-1) { + if (i == arc_segs - 1) { if (nmg_calc_face_g(fu_prev)) { bu_log("tesselate_pipe_linear: nmg_calc_face_g failed\n"); nmg_kfu(fu_prev); @@ -2211,16 +2268,17 @@ } bu_free((char *)(*outer_loop), "tesselate_pipe_bend: outer_loop"); *outer_loop = new_outer_loop; - } else if (or > tol->dist && end_or <= tol->dist) { - struct vertex *v=(struct vertex *)NULL; + } else if ( or > tol->dist && end_or <= tol->dist) { + struct vertex *v = (struct vertex *)NULL; VSUB2(norms[0], (*outer_loop)[0]->vg_p->coord, start_pt); - VJOIN1(norms[0], norms[0], slope*or, n); + VJOIN1(norms[0], norms[0], slope * or , n); VUNITIZE(norms[0]); - for (i=0; i<arc_segs; i++) { - j = i+1; - if (j == arc_segs) + for (i = 0; i < arc_segs; i++) { + j = i + 1; + if (j == arc_segs) { j = 0; + } verts[0] = &(*outer_loop)[j]; verts[1] = &(*outer_loop)[i]; @@ -2228,15 +2286,16 @@ if ((fu = nmg_cmface(s, verts, 3)) == NULL) { bu_log("tesselate_pipe_linear: failed to make outer face #%d or=%g, end_or=%g\n", - i, or, end_or); + i, or , end_or); continue; } - if (i == 0) + if (i == 0) { nmg_vertex_gv(v, end_pt); + } - if (i < arc_segs-1) { + if (i < arc_segs - 1) { VSUB2(norms[j], (*outer_loop)[j]->vg_p->coord, start_pt); - VJOIN1(norms[j], norms[j], slope*or, n); + VJOIN1(norms[j], norms[j], slope * or , n); VUNITIZE(norms[j]); } @@ -2250,8 +2309,9 @@ vect_t reverse_norm; NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { @@ -2281,7 +2341,7 @@ bu_free((char *)(*outer_loop), "tesselate_pipe_linear: outer_loop"); outer_loop[0] = &v; - } else if (or <= tol->dist && end_or > tol->dist) { + } else if ( or <= tol->dist && end_or > tol->dist) { point_t pt, pt_next; fastf_t x, y, xnew, ynew; @@ -2291,14 +2351,15 @@ VJOIN1(pt_next, end_pt, end_or, norms[0]); VJOIN1(norms[0], norms[0], slope, n); VUNITIZE(norms[0]); - for (i=0; i<arc_segs; i++) { + for (i = 0; i < arc_segs; i++) { j = i + 1; - if (j == arc_segs) + if (j == arc_segs) { j = 0; + } VMOVE(pt, pt_next) - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; if (i < j) { @@ -2314,15 +2375,18 @@ if ((fu = nmg_cmface(s, verts, 3)) == NULL) { bu_log("tesselate_pipe_linear: failed to make outer face #%d or=%g, end_or=%g\n", - i, or, end_or); + i, or , end_or); continue; } - if (!(*outer_loop)[0]->vg_p) + if (!(*outer_loop)[0]->vg_p) { nmg_vertex_gv((*outer_loop)[0], start_pt); - if (!new_outer_loop[i]->vg_p) + } + if (!new_outer_loop[i]->vg_p) { nmg_vertex_gv(new_outer_loop[i], pt); - if (!new_outer_loop[j]->vg_p) + } + if (!new_outer_loop[j]->vg_p) { nmg_vertex_gv(new_outer_loop[j], pt_next); + } if (nmg_calc_face_g(fu)) { bu_log("tesselate_pipe_linear: nmg_calc_face_g failed\n"); nmg_kfu(fu); @@ -2333,8 +2397,9 @@ vect_t reverse_norm; NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { @@ -2365,29 +2430,30 @@ *outer_loop = new_outer_loop; } - slope = (ir - end_ir)/seg_len; + slope = (ir - end_ir) / seg_len; if (ir > tol->dist && end_ir > tol->dist) { point_t pt; fastf_t x, y, xnew, ynew; - struct faceuse *fu_prev=(struct faceuse *)NULL; + struct faceuse *fu_prev = (struct faceuse *)NULL; x = 1.0; y = 0.0; VCOMB2(norms[0], -x, r1, -y, r2); VJOIN1(norms[0], norms[0], -slope, n); VUNITIZE(norms[0]); - for (i=0; i<arc_segs; i++) { - j = i+1; - if (j == arc_segs) + for (i = 0; i < arc_segs; i++) { + j = i + 1; + if (j == arc_segs) { j = 0; + } - VJOIN2(pt, end_pt, x*end_ir, r1, y*end_ir, r2); - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + VJOIN2(pt, end_pt, x * end_ir, r1, y * end_ir, r2); + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; - if (i < arc_segs-1) { + if (i < arc_segs - 1) { VCOMB2(norms[j], -x, r1, -y, r2); VJOIN1(norms[j], norms[j], -slope, n); VUNITIZE(norms[j]); @@ -2405,8 +2471,9 @@ NMG_CK_FACEUSE(fu_prev); - if (fu_prev->orientation != OT_SAME) + if (fu_prev->orientation != OT_SAME) { fu_prev = fu_prev->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu_prev->lu_hd); @@ -2415,13 +2482,13 @@ struct edgeuse *eu_opp_use; eu_opp_use = BU_LIST_PNEXT_CIRC(edgeuse, &eu->eumate_p->l); - if (eu->vu_p->v_p == new_inner_loop[i-1]) { - nmg_vertexuse_nv(eu->vu_p, norms[i-1]); - VREVERSE(reverse_norm, norms[i-1]); + if (eu->vu_p->v_p == new_inner_loop[i - 1]) { + nmg_vertexuse_nv(eu->vu_p, norms[i - 1]); + VREVERSE(reverse_norm, norms[i - 1]); nmg_vertexuse_nv(eu_opp_use->vu_p, reverse_norm); - } else if (eu->vu_p->v_p == (*inner_loop)[i-1]) { - nmg_vertexuse_nv(eu->vu_p, norms[i-1]); - VREVERSE(reverse_norm, norms[i-1]); + } else if (eu->vu_p->v_p == (*inner_loop)[i - 1]) { + nmg_vertexuse_nv(eu->vu_p, norms[i - 1]); + VREVERSE(reverse_norm, norms[i - 1]); nmg_vertexuse_nv(eu_opp_use->vu_p, reverse_norm); } else if (eu->vu_p->v_p == new_inner_loop[i]) { nmg_vertexuse_nv(eu->vu_p, norms[i]); @@ -2448,8 +2515,9 @@ i, ir, end_ir); continue; } - if (!new_inner_loop[i]->vg_p) + if (!new_inner_loop[i]->vg_p) { nmg_vertex_gv(new_inner_loop[i], pt); + } if (nmg_calc_face_g(fu)) { bu_log("tesselate_pipe_linear: nmg_calc_face_g failed\n"); @@ -2461,8 +2529,9 @@ NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); @@ -2497,7 +2566,7 @@ verts[2] = verts[0]; verts[0] = verts[1]; verts[1] = verts[2]; - if (i == arc_segs-1) { + if (i == arc_segs - 1) { verts[2] = &new_inner_loop[0]; } else { verts[2] = &new_inner_loop[j]; @@ -2507,7 +2576,7 @@ i, ir, end_ir); continue; } - if (i == arc_segs-1) { + if (i == arc_segs - 1) { if (nmg_calc_face_g(fu_prev)) { bu_log("tesselate_pipe_linear: nmg_calc_face_g failed\n"); nmg_kfu(fu_prev); @@ -2518,16 +2587,17 @@ bu_free((char *)(*inner_loop), "tesselate_pipe_bend: inner_loop"); *inner_loop = new_inner_loop; } else if (ir > tol->dist && end_ir <= tol->dist) { - struct vertex *v=(struct vertex *)NULL; + struct vertex *v = (struct vertex *)NULL; VSUB2(norms[0], (*inner_loop)[0]->vg_p->coord, start_pt); - VJOIN1(norms[0], norms[0], -slope*ir, n); + VJOIN1(norms[0], norms[0], -slope * ir, n); VUNITIZE(norms[0]); VREVERSE(norms[0], norms[0]); - for (i=0; i<arc_segs; i++) { - j = i+1; - if (j == arc_segs) + for (i = 0; i < arc_segs; i++) { + j = i + 1; + if (j == arc_segs) { j = 0; + } verts[0] = &(*inner_loop)[i]; verts[1] = &(*inner_loop)[j]; @@ -2538,12 +2608,13 @@ i, ir, end_ir); continue; } - if (i == 0) + if (i == 0) { nmg_vertex_gv(v, end_pt); + } - if (i < arc_segs-1) { + if (i < arc_segs - 1) { VSUB2(norms[j], (*inner_loop)[j]->vg_p->coord, start_pt); - VJOIN1(norms[j], norms[j], -slope*ir, n); + VJOIN1(norms[j], norms[j], -slope * ir, n); VUNITIZE(norms[j]); VREVERSE(norms[j], norms[j]); } @@ -2558,8 +2629,9 @@ vect_t reverse_norm; NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { @@ -2599,14 +2671,15 @@ VJOIN1(pt_next, end_pt, -end_ir, norms[0]); VJOIN1(norms[0], norms[0], -slope, n); VUNITIZE(norms[0]); - for (i=0; i<arc_segs; i++) { + for (i = 0; i < arc_segs; i++) { j = i + 1; - if (j == arc_segs) + if (j == arc_segs) { j = 0; + } VMOVE(pt, pt_next) - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; if (i < j) { @@ -2625,12 +2698,15 @@ i, ir, end_ir); continue; } - if (!(*inner_loop)[0]->vg_p) + if (!(*inner_loop)[0]->vg_p) { nmg_vertex_gv((*inner_loop)[0], start_pt); - if (!new_inner_loop[i]->vg_p) + } + if (!new_inner_loop[i]->vg_p) { nmg_vertex_gv(new_inner_loop[i], pt); - if (!new_inner_loop[j]->vg_p) + } + if (!new_inner_loop[j]->vg_p) { nmg_vertex_gv(new_inner_loop[j], pt_next); + } if (nmg_calc_face_g(fu)) { bu_log("tesselate_pipe_linear: nmg_calc_face_g failed\n"); nmg_kfu(fu); @@ -2641,8 +2717,9 @@ vect_t reverse_norm; NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { @@ -2677,7 +2754,7 @@ HIDDEN void -tesselate_pipe_bend(fastf_t *bend_start, fastf_t *bend_end, fastf_t *bend_center, fastf_t or, fastf_t ir, int arc_segs, double sin_del, double cos_del, struct vertex ***outer_loop, struct vertex ***inner_loop, fastf_t *start_r1, fastf_t *start_r2, struct +tesselate_pipe_bend(fastf_t *bend_start, fastf_t *bend_end, fastf_t *bend_center, fastf_t or , fastf_t ir, int arc_segs, double sin_del, double cos_del, struct vertex ***outer_loop, struct vertex ***inner_loop, fastf_t *start_r1, fastf_t *start_r2, struct shell *s, const struct bn_tol *tol, const struct rt_tess_tol *ttol) { struct vertex **new_outer_loop = NULL; @@ -2700,7 +2777,7 @@ point_t origin; point_t center; point_t old_center; - int bend_segs=1; /* minimum number of edges along bend */ + int bend_segs = 1; /* minimum number of edges along bend */ int bend_seg; int tol_segs; int i, j, k; @@ -2718,7 +2795,7 @@ */ VSUB2(to_start, bend_start, bend_center); bend_radius = MAGNITUDE(to_start); - VSCALE(b1, to_start, 1.0/bend_radius); + VSCALE(b1, to_start, 1.0 / bend_radius); /* bend_norm is normal to plane of bend */ VSUB2(to_end, bend_end, bend_center); @@ -2729,45 +2806,49 @@ VCROSS(b2, bend_norm, b1); bend_angle = atan2(VDOT(to_end, b2), VDOT(to_end, b1)); - if (bend_angle < 0.0) - bend_angle += 2.0*bn_pi; + if (bend_angle < 0.0) { + bend_angle += 2.0 * bn_pi; + } /* calculate number of segments to use along bend */ - if (ttol->abs > 0.0 && ttol->abs < bend_radius+or) { - tol_segs = ceil(bend_angle/(2.0*acos(1.0 - ttol->abs/(bend_radius+or)))); - if (tol_segs > bend_segs) + if (ttol->abs > 0.0 && ttol->abs < bend_radius + or ) { + tol_segs = ceil(bend_angle / (2.0 * acos(1.0 - ttol->abs / (bend_radius + or )))); + if (tol_segs > bend_segs) { bend_segs = tol_segs; + } } if (ttol->rel > 0.0) { - tol_segs = ceil(bend_angle/(2.0*acos(1.0 - ttol->rel))); - if (tol_segs > bend_segs) + tol_segs = ceil(bend_angle / (2.0 * acos(1.0 - ttol->rel))); + if (tol_segs > bend_segs) { bend_segs = tol_segs; + } } if (ttol->norm > 0.0) { - tol_segs = ceil(bend_angle/(2.0*ttol->norm)); - if (tol_segs > bend_segs) + tol_segs = ceil(bend_angle / (2.0 * ttol->norm)); + if (tol_segs > bend_segs) { bend_segs = tol_segs; + } } /* add starting loops to the vertex tree */ - vertex_array = bu_calloc((bend_segs+1) * arc_segs, sizeof(struct vertex *), "vertex array in pipe.c"); - for (i=0 ; i<arc_segs ; i++) { + vertex_array = bu_calloc((bend_segs + 1) * arc_segs, sizeof(struct vertex *), "vertex array in pipe.c"); + for (i = 0 ; i < arc_segs ; i++) { struct vertex *v = (*outer_loop)[i]; struct vertex_g *vg = v->vg_p; - j= Add_vert(vg->coord[X], vg->coord[Y], vg->coord[Z], vertex_tree, tol->dist_sq); + j = Add_vert(vg->coord[X], vg->coord[Y], vg->coord[Z], vertex_tree, tol->dist_sq); vertex_array[j] = v; } - delta_angle = bend_angle/(fastf_t)(bend_segs); + delta_angle = bend_angle / (fastf_t)(bend_segs); VSETALL(origin, 0.0); bn_mat_arb_rot(rot, origin, bend_norm, delta_angle); VMOVE(old_center, bend_start); - for (bend_seg=0; bend_seg<bend_segs; bend_seg++) { + for (bend_seg = 0; bend_seg < bend_segs; bend_seg++) { new_outer_loop = (struct vertex **)bu_calloc(arc_segs, sizeof(struct vertex *), - "tesselate_pipe_bend(): new_outer_loop"); + "tesselate_pipe_bend(): new_outer_loop"); MAT4X3VEC(r1_tmp, rot, r1); MAT4X3VEC(r2_tmp, rot, r2); @@ -2780,14 +2861,15 @@ x = or; y = 0.0; - for (i=0; i<arc_segs; i++) { + for (i = 0; i < arc_segs; i++) { struct faceuse *fu; struct vertex **verts[3]; point_t pt; - j = i+1; - if (j == arc_segs) + j = i + 1; + if (j == arc_segs) { j = 0; + } VJOIN2(pt, center, x, r1, y, r2); k = Add_vert(pt[X], pt[Y], pt[Z], vertex_tree, tol->dist_sq); @@ -2814,8 +2896,9 @@ vertex_array[k] = new_outer_loop[i]; NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { @@ -2853,8 +2936,8 @@ new_outer_loop[i] = vertex_array[k]; } - xnew = x*cos_del - y*sin_del; - ynew = x*sin_del + y*cos_del; + xnew = x * cos_del - y * sin_del; + ynew = x * sin_del + y * cos_del; x = xnew; y = ynew; @@ -2882,8 +2965,9 @@ vertex_array[k] = new_outer_loop[j]; NMG_CK_FACEUSE(fu); - if (fu->orientation != OT_SAME) + if (fu->orientation != OT_SAME) { fu = fu->fumate_p; + } lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { @@ -2943,10 +3027,10 @@ VMOVE(r2, start... [truncated message content] |
From: <n_...@us...> - 2012-11-16 19:55:33
|
Revision: 53734 http://brlcad.svn.sourceforge.net/brlcad/?rev=53734&view=rev Author: n_reed Date: 2012-11-16 19:55:25 +0000 (Fri, 16 Nov 2012) Log Message: ----------- turn one function that does two things into two functions that do one thing Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-16 19:38:38 UTC (rev 53733) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-16 19:55:25 UTC (rev 53734) @@ -47,6 +47,7 @@ #include "rtgeom.h" #include "raytrace.h" #include "wdb.h" +#include "../../librt_private.h" struct id_pipe { @@ -1656,20 +1657,45 @@ return 0; } +/** + * Draw a circle that has the given center and radius using the specified + * number of line segments. au and bu are expected to be orthogonal unit + * vectors in the plane of the circle. + */ +static void +draw_pipe_circle( + struct bu_list *vhead, + fastf_t radius, + vect_t center, + vect_t au, + vect_t bu, + int seg_count) +{ + vect_t axis_a, axis_b; + VSCALE(axis_a, au, radius); + VSCALE(axis_b, bu, radius); + + plot_ellipse(vhead, center, axis_a, axis_b, seg_count); +} + /** * D R A W _ P I P E _ A R C * - * v1 and v2 must be unit vectors normal to each other in plane of - * circle. v1 must be in direction from center to start point (unless - * a full circle is requested). "End" is the endpoint of - * arc. "Seg_count" is how many straight line segments to use to draw - * the arc. "Full_circle" is a flag to indicate that a complete circle - * is desired. + * Using the specified number of segments, draw the shortest arc on the circle + * with the given center and radius that ends at (end) and starts at + * (center + radius * v1). v1 and v2 are expected to be orthogonal unit vectors + * in the plane of the circle. */ - HIDDEN void -draw_pipe_arc(struct bu_list *vhead, fastf_t radius, fastf_t *center, const fastf_t *v1, const fastf_t *v2, fastf_t *end, int seg_count, int full_circle) +draw_pipe_arc( + struct bu_list *vhead, + fastf_t radius, + fastf_t *center, + const fastf_t *v1, + const fastf_t *v2, + fastf_t *end, + int seg_count) { fastf_t arc_angle; fastf_t delta_ang; @@ -1681,13 +1707,9 @@ BU_CK_LIST_HEAD(vhead); - if (!full_circle) { - VSUB2(to_end, end, center); - arc_angle = atan2(VDOT(to_end, v2), VDOT(to_end, v1)); - delta_ang = arc_angle / seg_count; - } else { - delta_ang = 2.0 * bn_pi / seg_count; - } + VSUB2(to_end, end, center); + arc_angle = atan2(VDOT(to_end, v2), VDOT(to_end, v1)); + delta_ang = arc_angle / seg_count; cos_del = cos(delta_ang); sin_del = sin(delta_ang); @@ -1788,26 +1810,26 @@ VJOIN1(tmp_end, end, or , end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); VJOIN2(tmp_start, center, radius, v1, - or , f1); VJOIN1(tmp_center, center, -move_dist, norm); VJOIN1(tmp_end, end, - or , end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); move_dist = or * VDOT(f2, norm); VJOIN2(tmp_start, center, radius, v1, or , f2); VJOIN1(tmp_center, center, move_dist, norm); VJOIN1(tmp_end, end, or , end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); VJOIN2(tmp_start, center, radius, v1, - or , f2); VJOIN1(tmp_center, center, -move_dist, norm); VJOIN1(tmp_end, end, - or , end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); if (ir <= 0.0) { VMOVE(f1, end_f1); @@ -1821,26 +1843,26 @@ VJOIN1(tmp_end, end, ir, end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); VJOIN2(tmp_start, center, radius, v1, -ir, f1); VJOIN1(tmp_center, center, -move_dist, norm); VJOIN1(tmp_end, end, -ir, end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); move_dist = ir * VDOT(f2, norm); VJOIN2(tmp_start, center, radius, v1, ir, f2); VJOIN1(tmp_center, center, move_dist, norm); VJOIN1(tmp_end, end, ir, end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); VJOIN2(tmp_start, center, radius, v1, -ir, f2); VJOIN1(tmp_center, center, -move_dist, norm); VJOIN1(tmp_end, end, -ir, end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); - draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count, 0); + draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); VMOVE(f1, end_f1); VMOVE(f2, end_f2); @@ -1885,9 +1907,10 @@ VCROSS(f2, f3, f1); VUNITIZE(f2); - draw_pipe_arc(vhead, prevp->pp_od / 2.0, prevp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + draw_pipe_circle(vhead, prevp->pp_od / 2.0, prevp->pp_coord, f1, f2, ARC_SEGS); + if (prevp->pp_id > 0.0) { - draw_pipe_arc(vhead, prevp->pp_id / 2.0, prevp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + draw_pipe_circle(vhead, prevp->pp_id / 2.0, prevp->pp_coord, f1, f2, ARC_SEGS); } while (1) { @@ -1948,9 +1971,10 @@ nextp = BU_LIST_NEXT(wdb_pipept, &curp->l); } - draw_pipe_arc(vhead, curp->pp_od / 2.0, curp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + draw_pipe_circle(vhead, curp->pp_od / 2.0, curp->pp_coord, f1, f2, ARC_SEGS); + if (curp->pp_id > 0.0) { - draw_pipe_arc(vhead, curp->pp_id / 2.0, curp->pp_coord, f1, f2, f2, ARC_SEGS, 1); + draw_pipe_circle(vhead, curp->pp_id / 2.0, curp->pp_coord, f1, f2, ARC_SEGS); } return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2012-11-16 20:38:11
|
Revision: 53736 http://brlcad.svn.sourceforge.net/brlcad/?rev=53736&view=rev Author: n_reed Date: 2012-11-16 20:38:02 +0000 (Fri, 16 Nov 2012) Log Message: ----------- make arc drawing logic clearer Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-16 19:57:32 UTC (rev 53735) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-16 20:38:02 UTC (rev 53736) @@ -1697,34 +1697,31 @@ fastf_t *end, int seg_count) { - fastf_t arc_angle; - fastf_t delta_ang; - fastf_t cos_del, sin_del; - fastf_t x, y, xnew, ynew; - vect_t to_end; - point_t pt; int i; + point_t pt; + vect_t center_to_start, center_to_end, axis_a, axis_b; + fastf_t radians_from_start_to_end, radian, radian_step; BU_CK_LIST_HEAD(vhead); - VSUB2(to_end, end, center); - arc_angle = atan2(VDOT(to_end, v2), VDOT(to_end, v1)); - delta_ang = arc_angle / seg_count; + VSCALE(axis_a, v1, radius); + VSCALE(axis_b, v2, radius); + VMOVE(center_to_start, v1); + VSUB2(center_to_end, end, center); + VUNITIZE(center_to_end); - cos_del = cos(delta_ang); - sin_del = sin(delta_ang); + radians_from_start_to_end = acos(VDOT(center_to_start, center_to_end)); + radian_step = radians_from_start_to_end / seg_count; - x = radius; - y = 0.0; - VJOIN2(pt, center, x, v1, y, v2); + ellipse_point_at_radian(pt, center, axis_a, axis_b, 0.0); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - for (i = 0; i < seg_count; i++) { - xnew = x * cos_del - y * sin_del; - ynew = x * sin_del + y * cos_del; - VJOIN2(pt, center, xnew, v1, ynew, v2); + + radian = radian_step; + for (i = 0; i < seg_count; ++i) { + ellipse_point_at_radian(pt, center, axis_a, axis_b, radian); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - x = xnew; - y = ynew; + + radian += radian_step; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2012-11-20 00:56:30
|
Revision: 53777 http://brlcad.svn.sourceforge.net/brlcad/?rev=53777&view=rev Author: n_reed Date: 2012-11-20 00:56:23 +0000 (Tue, 20 Nov 2012) Log Message: ----------- document draw_linear_seg routine and give it a more flexible implementation Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-19 23:20:59 UTC (rev 53776) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-20 00:56:23 UTC (rev 53777) @@ -1725,51 +1725,67 @@ } } - +/** + * Draws straight lines between circles which lie in the plane of the + * orthogonal unit vectors v1 and v2. + * + * A first set of lines is drawn from the circle centered at p1 with radius + * or1, to the circle centered at p2 with radius or2. + * + * If ir1 and ir2 are positive, a second set of lines is drawn from the circle + * centered at p1 with radius ir1, to the circle centered at p2 with radius + * ir2. + */ HIDDEN void -draw_linear_seg(struct bu_list *vhead, const fastf_t *p1, const fastf_t or1, const fastf_t ir1, const fastf_t *p2, const fastf_t or2, const fastf_t ir2, const fastf_t *v1, const fastf_t *v2) +draw_linear_seg( + struct bu_list *vhead, + point_t p1, fastf_t or1, fastf_t ir1, + point_t p2, fastf_t or2, fastf_t ir2, + vect_t v1, + vect_t v2) { point_t pt; + int i, num_lines = 4; + fastf_t radian, radian_step; + vect_t p1_axis_a, p1_axis_b, p2_axis_a, p2_axis_b; BU_CK_LIST_HEAD(vhead); - VJOIN1(pt, p1, or1, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, or2, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - VJOIN1(pt, p1, or1, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, or2, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - VJOIN1(pt, p1, -or1, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, -or2, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - VJOIN1(pt, p1, -or1, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, -or2, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); + radian_step = bn_twopi / num_lines; + VSCALE(p1_axis_a, v1, or1); + VSCALE(p1_axis_b, v2, or1); + VSCALE(p2_axis_a, v1, or2); + VSCALE(p2_axis_b, v2, or2); + + radian = 0; + for (i = 0; i < num_lines; ++i) { + ellipse_point_at_radian(pt, p1, p1_axis_a, p1_axis_b, radian); + RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); + ellipse_point_at_radian(pt, p2, p2_axis_a, p2_axis_b, radian); + RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); + + radian += radian_step; + } + if (ir1 <= 0.0 && ir2 <= 0.0) { return; } - VJOIN1(pt, p1, ir1, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, ir2, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - VJOIN1(pt, p1, ir1, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, ir2, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - VJOIN1(pt, p1, -ir1, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, -ir2, v1); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - VJOIN1(pt, p1, -ir1, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - VJOIN1(pt, p2, -ir2, v2); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); + VSCALE(p1_axis_a, v1, ir1); + VSCALE(p1_axis_b, v2, ir1); + VSCALE(p2_axis_a, v1, ir2); + VSCALE(p2_axis_b, v2, ir2); + + radian = 0; + for (i = 0; i < num_lines; ++i) { + ellipse_point_at_radian(pt, p1, p1_axis_a, p1_axis_b, radian); + RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); + ellipse_point_at_radian(pt, p2, p2_axis_a, p2_axis_b, radian); + RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); + + radian += radian_step; + } } @@ -1898,7 +1914,7 @@ VMOVE(current_point, prevp->pp_coord); - /* draw end at pipe start */ + /* draw pipe start */ VSUB2(f3, prevp->pp_coord, curp->pp_coord); bn_vec_ortho(f1, f3); VCROSS(f2, f3, f1); @@ -1918,8 +1934,10 @@ if (BU_LIST_IS_HEAD(&nextp->l, &pip->pipe_segs_head)) { /* last segment */ - draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); + draw_linear_seg(vhead, + current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, + f1, f2); break; } @@ -1936,8 +1954,10 @@ dist_to_bend = curp->pp_bendradius * tan(angle / 2.0); if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { /* points are colinear, draw linear segment */ - draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); + draw_linear_seg(vhead, + current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, + f1, f2); VMOVE(current_point, curp->pp_coord); } else { point_t bend_center; @@ -1949,8 +1969,10 @@ /* draw linear segment to start of bend */ VJOIN1(bend_start, curp->pp_coord, dist_to_bend, n1); - draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - bend_start, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); + draw_linear_seg(vhead, + current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + bend_start, curp->pp_od / 2.0, curp->pp_id / 2.0, + f1, f2); /* draw bend */ VJOIN1(bend_end, curp->pp_coord, dist_to_bend, n2); @@ -1968,6 +1990,7 @@ nextp = BU_LIST_NEXT(wdb_pipept, &curp->l); } + /* draw pipe end */ draw_pipe_circle(vhead, curp->pp_od / 2.0, curp->pp_coord, f1, f2, ARC_SEGS); if (curp->pp_id > 0.0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2012-11-20 16:07:38
|
Revision: 53779 http://brlcad.svn.sourceforge.net/brlcad/?rev=53779&view=rev Author: n_reed Date: 2012-11-20 16:07:27 +0000 (Tue, 20 Nov 2012) Log Message: ----------- clean up draw loop to remove goto Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-20 02:54:37 UTC (rev 53778) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-20 16:07:27 UTC (rev 53779) @@ -1886,14 +1886,18 @@ * R T _ P I P E _ P L O T */ int -rt_pipe_plot(struct bu_list *vhead, struct rt_db_internal *ip, const struct rt_tess_tol *UNUSED(ttol), const struct bn_tol *UNUSED(tol), const struct rt_view_info *UNUSED(info)) +rt_pipe_plot( + struct bu_list *vhead, + struct rt_db_internal *ip, + const struct rt_tess_tol *UNUSED(ttol), + const struct bn_tol *UNUSED(tol), + const struct rt_view_info *UNUSED(info)) { - struct wdb_pipept *prevp; - struct wdb_pipept *curp; - struct wdb_pipept *nextp; + fastf_t angle, dist_to_bend; struct rt_pipe_internal *pip; - point_t current_point; - vect_t f1, f2, f3; + struct wdb_pipept *prevp, *curp, *nextp; + vect_t f1, f2, f3, n1, n2, v1, v2, norm; + point_t current_point, bend_center, bend_start, bend_end; BU_CK_LIST_HEAD(vhead); RT_CK_DB_INTERNAL(ip); @@ -1926,33 +1930,29 @@ draw_pipe_circle(vhead, prevp->pp_id / 2.0, prevp->pp_coord, f1, f2, ARC_SEGS); } - while (1) { - vect_t n1, n2; - vect_t norm; - fastf_t angle; - fastf_t dist_to_bend; +#define ALL_BUT_LAST_SEGMENT ; \ + !BU_LIST_IS_HEAD(&nextp->l, &pip->pipe_segs_head); \ + prevp = curp, curp = nextp, nextp = BU_LIST_NEXT(wdb_pipept, &curp->l) - if (BU_LIST_IS_HEAD(&nextp->l, &pip->pipe_segs_head)) { - /* last segment */ - draw_linear_seg(vhead, - current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, - f1, f2); - break; - } - + for (ALL_BUT_LAST_SEGMENT) { VSUB2(n1, prevp->pp_coord, curp->pp_coord); - if (VNEAR_ZERO(n1, RT_LEN_TOL)) { - /* duplicate point, nothing to plot */ - goto next_pt; - } VSUB2(n2, nextp->pp_coord, curp->pp_coord); VCROSS(norm, n1, n2); VUNITIZE(n1); VUNITIZE(n2); + + if (VNEAR_ZERO(n1, RT_LEN_TOL)) { + /* duplicate point, nothing to plot */ + continue; + } + angle = bn_pi - acos(VDOT(n1, n2)); dist_to_bend = curp->pp_bendradius * tan(angle / 2.0); - if (isnan(dist_to_bend) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) { + + if (isnan(dist_to_bend) + || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) + || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) + { /* points are colinear, draw linear segment */ draw_linear_seg(vhead, current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, @@ -1960,11 +1960,6 @@ f1, f2); VMOVE(current_point, curp->pp_coord); } else { - point_t bend_center; - point_t bend_start; - point_t bend_end; - vect_t v1, v2; - VUNITIZE(norm); /* draw linear segment to start of bend */ @@ -1984,12 +1979,14 @@ VMOVE(current_point, bend_end); } -next_pt: - prevp = curp; - curp = nextp; - nextp = BU_LIST_NEXT(wdb_pipept, &curp->l); } + /* draw last segment */ + draw_linear_seg(vhead, + current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, + f1, f2); + /* draw pipe end */ draw_pipe_circle(vhead, curp->pp_od / 2.0, curp->pp_coord, f1, f2, ARC_SEGS); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2012-11-21 18:21:51
|
Revision: 53801 http://brlcad.svn.sourceforge.net/brlcad/?rev=53801&view=rev Author: n_reed Date: 2012-11-21 18:21:40 +0000 (Wed, 21 Nov 2012) Log Message: ----------- expand comments, rename variables, and rearrange statements for clarity Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-21 16:52:52 UTC (rev 53800) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-21 18:21:40 UTC (rev 53801) @@ -1788,12 +1788,13 @@ } } - HIDDEN void draw_pipe_bend( struct bu_list *vhead, - const fastf_t *center, const fastf_t *end, - const fastf_t radius, const fastf_t angle, + const fastf_t *center, + const fastf_t *end, + const fastf_t radius, + const fastf_t angle, const fastf_t *v1, const fastf_t *v2, const fastf_t *norm, const fastf_t or , const fastf_t ir, @@ -1812,34 +1813,39 @@ VREVERSE(tmp_norm, norm); bn_mat_arb_rot(mat, center, tmp_norm, angle); + MAT4X3VEC(tmp_vec, mat, f1); VMOVE(end_f1, tmp_vec); + MAT4X3VEC(tmp_vec, mat, f2); VMOVE(end_f2, tmp_vec); move_dist = or * VDOT(f1, norm); - VJOIN2(tmp_start, center, radius, v1, or , f1); + VJOIN2(tmp_start, center, radius, v1, or, f1); VJOIN1(tmp_center, center, move_dist, norm); - VJOIN1(tmp_end, end, or , end_f1); + VJOIN1(tmp_end, end, or, end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); - VJOIN2(tmp_start, center, radius, v1, - or , f1); + + VJOIN2(tmp_start, center, radius, v1, -or, f1); VJOIN1(tmp_center, center, -move_dist, norm); - VJOIN1(tmp_end, end, - or , end_f1); + VJOIN1(tmp_end, end, -or, end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); + move_dist = or * VDOT(f2, norm); - VJOIN2(tmp_start, center, radius, v1, or , f2); + VJOIN2(tmp_start, center, radius, v1, or, f2); VJOIN1(tmp_center, center, move_dist, norm); - VJOIN1(tmp_end, end, or , end_f2); + VJOIN1(tmp_end, end, or, end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); - VJOIN2(tmp_start, center, radius, v1, - or , f2); + + VJOIN2(tmp_start, center, radius, v1, -or, f2); VJOIN1(tmp_center, center, -move_dist, norm); - VJOIN1(tmp_end, end, - or , end_f2); + VJOIN1(tmp_end, end, -or, end_f2); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); @@ -1857,12 +1863,14 @@ VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); + VJOIN2(tmp_start, center, radius, v1, -ir, f1); VJOIN1(tmp_center, center, -move_dist, norm); VJOIN1(tmp_end, end, -ir, end_f1); VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); + move_dist = ir * VDOT(f2, norm); VJOIN2(tmp_start, center, radius, v1, ir, f2); VJOIN1(tmp_center, center, move_dist, norm); @@ -1870,6 +1878,7 @@ VSUB2(tmp_vec, tmp_start, tmp_center); tmp_radius = MAGNITUDE(tmp_vec); draw_pipe_arc(vhead, tmp_radius, tmp_center, v1, v2, tmp_end, seg_count); + VJOIN2(tmp_start, center, radius, v1, -ir, f2); VJOIN1(tmp_center, center, -move_dist, norm); VJOIN1(tmp_end, end, -ir, end_f2); @@ -1893,11 +1902,12 @@ const struct bn_tol *UNUSED(tol), const struct rt_view_info *UNUSED(info)) { - fastf_t angle, dist_to_bend; + fastf_t rad_between_segments, supplementary_angle, dist_cur_to_bend_end; struct rt_pipe_internal *pip; struct wdb_pipept *prevp, *curp, *nextp; - vect_t f1, f2, f3, n1, n2, v1, v2, norm; - point_t current_point, bend_center, bend_start, bend_end; + vect_t f1, f2, f3, v1, v2, norm; + vect_t cur_to_prev, cur_to_next; + point_t last_drawn, bend_center, bend_start, bend_end; BU_CK_LIST_HEAD(vhead); RT_CK_DB_INTERNAL(ip); @@ -1916,8 +1926,6 @@ return 0; /* nothing to plot */ } - VMOVE(current_point, prevp->pp_coord); - /* draw pipe start */ VSUB2(f3, prevp->pp_coord, curp->pp_coord); bn_vec_ortho(f1, f3); @@ -1930,60 +1938,76 @@ draw_pipe_circle(vhead, prevp->pp_id / 2.0, prevp->pp_coord, f1, f2, ARC_SEGS); } + VMOVE(last_drawn, prevp->pp_coord); + #define ALL_BUT_LAST_SEGMENT ; \ !BU_LIST_IS_HEAD(&nextp->l, &pip->pipe_segs_head); \ prevp = curp, curp = nextp, nextp = BU_LIST_NEXT(wdb_pipept, &curp->l) for (ALL_BUT_LAST_SEGMENT) { - VSUB2(n1, prevp->pp_coord, curp->pp_coord); - VSUB2(n2, nextp->pp_coord, curp->pp_coord); - VCROSS(norm, n1, n2); - VUNITIZE(n1); - VUNITIZE(n2); + VSUB2(cur_to_prev, prevp->pp_coord, curp->pp_coord); + VSUB2(cur_to_next, nextp->pp_coord, curp->pp_coord); + VCROSS(norm, cur_to_prev, cur_to_next); + VUNITIZE(cur_to_prev); + VUNITIZE(cur_to_next); - if (VNEAR_ZERO(n1, RT_LEN_TOL)) { + if (VNEAR_ZERO(cur_to_prev, RT_LEN_TOL)) { /* duplicate point, nothing to plot */ continue; } - angle = bn_pi - acos(VDOT(n1, n2)); - dist_to_bend = curp->pp_bendradius * tan(angle / 2.0); + rad_between_segments = acos(VDOT(cur_to_prev, cur_to_next)); + supplementary_angle = bn_pi - rad_between_segments; - if (isnan(dist_to_bend) + /* The fewer the radians between the segments, the more the bend is + * pushed away from cur and toward prev and next. + * + * (rad < pi/2) => (dist > bendradius) + * (rad = pi/2) => (dist = bendradius) + * (rad > pi/2) => (dist < bendradius) + */ + dist_cur_to_bend_end = curp->pp_bendradius; + dist_cur_to_bend_end *= tan(supplementary_angle / 2.0); + + /* in the extreme cases where the interior angle between the adjacent + * segments is nearly 0 or pi radians, the points are considered + * colinear and we just draw a linear segment to cur + */ + if (isnan(dist_cur_to_bend_end) || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) - || NEAR_ZERO(dist_to_bend, SQRT_SMALL_FASTF)) + || NEAR_ZERO(dist_cur_to_bend_end, SQRT_SMALL_FASTF)) { - /* points are colinear, draw linear segment */ draw_linear_seg(vhead, - current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + last_drawn, prevp->pp_od / 2.0, prevp->pp_id / 2.0, curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); - VMOVE(current_point, curp->pp_coord); + VMOVE(last_drawn, curp->pp_coord); } else { + VJOIN1(bend_start, curp->pp_coord, dist_cur_to_bend_end, cur_to_prev); + VJOIN1(bend_end, curp->pp_coord, dist_cur_to_bend_end, cur_to_next); VUNITIZE(norm); + VCROSS(v1, cur_to_prev, norm); + VCROSS(v2, v1, norm); + VJOIN1(bend_center, bend_start, -curp->pp_bendradius, v1); /* draw linear segment to start of bend */ - VJOIN1(bend_start, curp->pp_coord, dist_to_bend, n1); draw_linear_seg(vhead, - current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + last_drawn, prevp->pp_od / 2.0, prevp->pp_id / 2.0, bend_start, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); - /* draw bend */ - VJOIN1(bend_end, curp->pp_coord, dist_to_bend, n2); - VCROSS(v1, n1, norm); - VCROSS(v2, v1, norm); - VJOIN1(bend_center, bend_start, -curp->pp_bendradius, v1); - draw_pipe_bend(vhead, bend_center, bend_end, curp->pp_bendradius, angle, v1, v2, norm, - curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2, ARC_SEGS); + /* draw circular segment to end of bend */ + draw_pipe_bend(vhead, bend_center, bend_end, curp->pp_bendradius, + supplementary_angle, v1, v2, norm, curp->pp_od / 2.0, + curp->pp_id / 2.0, f1, f2, ARC_SEGS); - VMOVE(current_point, bend_end); + VMOVE(last_drawn, bend_end); } } /* draw last segment */ draw_linear_seg(vhead, - current_point, prevp->pp_od / 2.0, prevp->pp_id / 2.0, + last_drawn, prevp->pp_od / 2.0, prevp->pp_id / 2.0, curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, f1, f2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2012-11-26 20:42:36
|
Revision: 53822 http://brlcad.svn.sourceforge.net/brlcad/?rev=53822&view=rev Author: n_reed Date: 2012-11-26 20:42:28 +0000 (Mon, 26 Nov 2012) Log Message: ----------- reduce some excessively long parameter lists with structs Modified Paths: -------------- brlcad/trunk/src/librt/primitives/pipe/pipe.c Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-26 20:01:36 UTC (rev 53821) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2012-11-26 20:42:28 UTC (rev 53822) @@ -98,7 +98,22 @@ fastf_t bend_bound_radius_sq; /* square of bounding sphere radius */ }; +/* two orthogonal unit vectors that define an orientation */ +struct pipe_orientation { + vect_t v1; + vect_t v2; +}; +/* A plotted circle defined by a center point, an orientation at that point, + * and a radius. + */ +struct pipe_circle { + point_t center; + fastf_t radius; + struct pipe_orientation orient; +}; + + #define PIPE_MM(_v) VMINMAX((*min), (*max), _v) #define ARC_SEGS 16 /* number of segments used to plot a circle */ @@ -1658,25 +1673,20 @@ } /** - * Draw a circle that has the given center and radius using the specified - * number of line segments. au and bu are expected to be orthogonal unit - * vectors in the plane of the circle. + * Draw a pipe circle using a given number of segments. */ static void draw_pipe_circle( struct bu_list *vhead, - fastf_t radius, - vect_t center, - vect_t au, - vect_t bu, - int seg_count) + struct pipe_circle circle, + int num_segments) { vect_t axis_a, axis_b; - VSCALE(axis_a, au, radius); - VSCALE(axis_b, bu, radius); + VSCALE(axis_a, circle.orient.v1, circle.radius); + VSCALE(axis_b, circle.orient.v2, circle.radius); - plot_ellipse(vhead, center, axis_a, axis_b, seg_count); + plot_ellipse(vhead, circle.center, axis_a, axis_b, num_segments); } /** @@ -1726,62 +1736,35 @@ } /** - * Draws straight lines between circles which lie in the plane of the - * orthogonal unit vectors v1 and v2. - * - * A first set of lines is drawn from the circle centered at p1 with radius - * or1, to the circle centered at p2 with radius or2. - * - * If ir1 and ir2 are positive, a second set of lines is drawn from the circle - * centered at p1 with radius ir1, to the circle centered at p2 with radius - * ir2. + * Draws the specified number of connecting lines between the start and end circles. */ HIDDEN void draw_linear_seg( struct bu_list *vhead, - point_t p1, fastf_t or1, fastf_t ir1, - point_t p2, fastf_t or2, fastf_t ir2, - vect_t v1, - vect_t v2) + struct pipe_circle start, + struct pipe_circle end, + int num_lines) { + int i; point_t pt; - int i, num_lines = 4; fastf_t radian, radian_step; - vect_t p1_axis_a, p1_axis_b, p2_axis_a, p2_axis_b; + vect_t start_a, start_b, end_a, end_b; BU_CK_LIST_HEAD(vhead); radian_step = bn_twopi / num_lines; - VSCALE(p1_axis_a, v1, or1); - VSCALE(p1_axis_b, v2, or1); - VSCALE(p2_axis_a, v1, or2); - VSCALE(p2_axis_b, v2, or2); + VSCALE(start_a, start.orient.v1, start.radius); + VSCALE(start_b, start.orient.v2, start.radius); + VSCALE(end_a, end.orient.v1, end.radius); + VSCALE(end_b, end.orient.v2, end.radius); - radian = 0; + radian = 0.0; for (i = 0; i < num_lines; ++i) { - ellipse_point_at_radian(pt, p1, p1_axis_a, p1_axis_b, radian); + ellipse_point_at_radian(pt, start.center, start_a, start_b, radian); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - ellipse_point_at_radian(pt, p2, p2_axis_a, p2_axis_b, radian); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); - radian += radian_step; - } - - if (ir1 <= 0.0 && ir2 <= 0.0) { - return; - } - - VSCALE(p1_axis_a, v1, ir1); - VSCALE(p1_axis_b, v2, ir1); - VSCALE(p2_axis_a, v1, ir2); - VSCALE(p2_axis_b, v2, ir2); - - radian = 0; - for (i = 0; i < num_lines; ++i) { - ellipse_point_at_radian(pt, p1, p1_axis_a, p1_axis_b, radian); - RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_MOVE); - ellipse_point_at_radian(pt, p2, p2_axis_a, p2_axis_b, radian); + ellipse_point_at_radian(pt, end.center, end_a, end_b, radian); RT_ADD_VLIST(vhead, pt, BN_VLIST_LINE_DRAW); radian += radian_step; @@ -1794,11 +1777,11 @@ const fastf_t *center, const fastf_t *end, const fastf_t radius, - const fastf_t angle, - const fastf_t *v1, const fastf_t *v2, - const fastf_t *norm, - const fastf_t or , const fastf_t ir, - fastf_t *f1, fastf_t *f2, + const fastf_t angle, /* supplementary_angle */ + const fastf_t *v1, const fastf_t *v2, /* bend circle plane */ + const fastf_t *norm, /* circle normal, perpendicular to v1 and v2 */ + const fastf_t or, const fastf_t ir, /* pipe inner and outer radius */ + fastf_t *f1, fastf_t *f2, /* pipe circle plane */ const int seg_count) { point_t tmp_center, tmp_start, tmp_end; @@ -1811,12 +1794,11 @@ BU_CK_LIST_HEAD(vhead); + /* determine the final plane of the pipe circle */ VREVERSE(tmp_norm, norm); bn_mat_arb_rot(mat, center, tmp_norm, angle); - MAT4X3VEC(tmp_vec, mat, f1); VMOVE(end_f1, tmp_vec); - MAT4X3VEC(tmp_vec, mat, f2); VMOVE(end_f2, tmp_vec); @@ -1902,12 +1884,13 @@ const struct bn_tol *UNUSED(tol), const struct rt_view_info *UNUSED(info)) { - fastf_t rad_between_segments, supplementary_angle, dist_cur_to_bend_end; struct rt_pipe_internal *pip; struct wdb_pipept *prevp, *curp, *nextp; + struct pipe_circle start_circle, end_circle; vect_t f1, f2, f3, v1, v2, norm; vect_t cur_to_prev, cur_to_next; point_t last_drawn, bend_center, bend_start, bend_end; + fastf_t rad_between_segments, supplementary_angle, dist_cur_to_bend_end; BU_CK_LIST_HEAD(vhead); RT_CK_DB_INTERNAL(ip); @@ -1926,16 +1909,27 @@ return 0; /* nothing to plot */ } +#define ORIENT_CIRCLES(_v1, _v2) \ + VMOVE(start_circle.orient.v1, _v1); \ + VMOVE(start_circle.orient.v2, _v2); \ + VMOVE(end_circle.orient.v1, _v1); \ + VMOVE(end_circle.orient.v2, _v2); + /* draw pipe start */ VSUB2(f3, prevp->pp_coord, curp->pp_coord); bn_vec_ortho(f1, f3); VCROSS(f2, f3, f1); VUNITIZE(f2); - draw_pipe_circle(vhead, prevp->pp_od / 2.0, prevp->pp_coord, f1, f2, ARC_SEGS); + ORIENT_CIRCLES(f1, f2); + VMOVE(start_circle.center, prevp->pp_coord); + start_circle.radius = prevp->pp_od / 2.0; + draw_pipe_circle(vhead, start_circle, ARC_SEGS); + if (prevp->pp_id > 0.0) { - draw_pipe_circle(vhead, prevp->pp_id / 2.0, prevp->pp_coord, f1, f2, ARC_SEGS); + start_circle.radius = prevp->pp_id / 2.0; + draw_pipe_circle(vhead, start_circle, ARC_SEGS); } VMOVE(last_drawn, prevp->pp_coord); @@ -1977,10 +1971,20 @@ || VNEAR_ZERO(norm, SQRT_SMALL_FASTF) || NEAR_ZERO(dist_cur_to_bend_end, SQRT_SMALL_FASTF)) { - draw_linear_seg(vhead, - last_drawn, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, - f1, f2); + ORIENT_CIRCLES(f1, f2); + VMOVE(start_circle.center, last_drawn); + VMOVE(end_circle.center, curp->pp_coord); + + start_circle.radius = prevp->pp_od / 2.0; + end_circle.radius = curp->pp_od / 2.0; + draw_linear_seg(vhead, start_circle, end_circle, 4); + + if (prevp->pp_id > 0.0 && curp->pp_id > 0.0) { + start_circle.radius = prevp->pp_id / 2.0; + end_circle.radius = curp->pp_id / 2.0; + draw_linear_seg(vhead, start_circle, end_circle, 4); + } + VMOVE(last_drawn, curp->pp_coord); } else { VJOIN1(bend_start, curp->pp_coord, dist_cur_to_bend_end, cur_to_prev); @@ -1991,11 +1995,20 @@ VJOIN1(bend_center, bend_start, -curp->pp_bendradius, v1); /* draw linear segment to start of bend */ - draw_linear_seg(vhead, - last_drawn, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - bend_start, curp->pp_od / 2.0, curp->pp_id / 2.0, - f1, f2); + ORIENT_CIRCLES(f1, f2); + VMOVE(start_circle.center, last_drawn); + VMOVE(end_circle.center, bend_start); + start_circle.radius = prevp->pp_od / 2.0; + end_circle.radius = curp->pp_od / 2.0; + draw_linear_seg(vhead, start_circle, end_circle, 4); + + if (prevp->pp_id > 0.0 && curp->pp_id > 0.0) { + start_circle.radius = prevp->pp_id / 2.0; + end_circle.radius = curp->pp_id / 2.0; + draw_linear_seg(vhead, start_circle, end_circle, 4); + } + /* draw circular segment to end of bend */ draw_pipe_bend(vhead, bend_center, bend_end, curp->pp_bendradius, supplementary_angle, v1, v2, norm, curp->pp_od / 2.0, @@ -2006,16 +2019,29 @@ } /* draw last segment */ - draw_linear_seg(vhead, - last_drawn, prevp->pp_od / 2.0, prevp->pp_id / 2.0, - curp->pp_coord, curp->pp_od / 2.0, curp->pp_id / 2.0, - f1, f2); + ORIENT_CIRCLES(f1, f2); + VMOVE(start_circle.center, last_drawn); + VMOVE(end_circle.center, curp->pp_coord); + start_circle.radius = prevp->pp_od / 2.0; + end_circle.radius = curp->pp_od / 2.0; + draw_linear_seg(vhead, start_circle, end_circle, 4); + + if (prevp->pp_id > 0.0 && curp->pp_id > 0.0) { + start_circle.radius = prevp->pp_id / 2.0; + end_circle.radius = curp->pp_id / 2.0; + draw_linear_seg(vhead, start_circle, end_circle, 4); + } + /* draw pipe end */ - draw_pipe_circle(vhead, curp->pp_od / 2.0, curp->pp_coord, f1, f2, ARC_SEGS); + VMOVE(end_circle.center, curp->pp_coord); + end_circle.radius = curp->pp_od / 2.0; + draw_pipe_circle(vhead, end_circle, ARC_SEGS); + if (curp->pp_id > 0.0) { - draw_pipe_circle(vhead, curp->pp_id / 2.0, curp->pp_coord, f1, f2, ARC_SEGS); + end_circle.radius = curp->pp_id / 2.0; + draw_pipe_circle(vhead, end_circle, ARC_SEGS); } return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |