nmg_fcut.c File Reference

#include "common.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "machine.h"
#include "vmath.h"
#include "nmg.h"
#include "raytrace.h"

Include dependency graph for nmg_fcut.c:

Go to the source code of this file.

Data Structures

struct  nmg_ray_state
struct  loop_cuts
struct  nmg_vu_stuff
struct  nmg_loop_stuff
struct  state_transitions

Defines

#define PLOT_BOTH_FACES   1
#define NMG_STATE_ERROR   0
#define NMG_STATE_OUT   1
#define NMG_STATE_ON_L   2
#define NMG_STATE_ON_R   3
#define NMG_STATE_ON_B   4
#define NMG_STATE_ON_N   5
#define NMG_STATE_IN   6
#define NMG_E_ASSESSMENT_LEFT   0
#define NMG_E_ASSESSMENT_RIGHT   1
#define NMG_E_ASSESSMENT_ON_FORW   2
#define NMG_E_ASSESSMENT_ON_REV   3
#define NMG_E_ASSESSMENT_ERROR   4
#define NMG_V_ASSESSMENT_LONE   16
#define NMG_V_ASSESSMENT_ERROR   17
#define NMG_V_COMB(_p, _n)   (((_p)<<2)|(_n))
#define NMG_V_ASSESSMENT_PREV(_a)   (((_a)>>2)&3)
#define NMG_V_ASSESSMENT_NEXT(_a)   ((_a)&3)
#define NMG_LEFT_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_LEFT)
#define NMG_LEFT_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_RIGHT)
#define NMG_LEFT_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_ON_FORW)
#define NMG_LEFT_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_ON_REV)
#define NMG_RIGHT_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_LEFT)
#define NMG_RIGHT_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_RIGHT)
#define NMG_RIGHT_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_ON_FORW)
#define NMG_RIGHT_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_ON_REV)
#define NMG_ON_FORW_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_LEFT)
#define NMG_ON_FORW_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_RIGHT)
#define NMG_ON_FORW_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_ON_FORW)
#define NMG_ON_FORW_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_ON_REV)
#define NMG_ON_REV_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_LEFT)
#define NMG_ON_REV_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_RIGHT)
#define NMG_ON_REV_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_ON_FORW)
#define NMG_ON_REV_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_ON_REV)
#define NMG_LONE   NMG_V_ASSESSMENT_LONE
#define NMG_ACTION_ERROR   0
#define NMG_ACTION_NONE   1
#define NMG_ACTION_NONE_OPTIM   2
#define NMG_ACTION_VFY_EXT   3
#define NMG_ACTION_VFY_MULTI   4
#define NMG_ACTION_LONE_V_ESPLIT   5
#define NMG_ACTION_LONE_V_JAUNT   6
#define NMG_ACTION_CUTJOIN   7
#define NMG_RAYSTATE_MAGIC   0x54322345
#define NMG_CK_RAYSTATE(_p)   NMG_CKMAG(_p, NMG_RAYSTATE_MAGIC, "nmg_ray_state")
#define RADIAN_TWEEK   1.0e-14
#define WEDGE_LEFT   0
#define WEDGE_CROSS   1
#define WEDGE_RIGHT   2
#define WEDGE_ON   3
#define WEDGECLASS2STR(_cl)   nmg_wedgeclass_string[(_cl)]
#define WEDGE2_TO_STRING(_class2)   (nmg_wedge2_string[(_class2)+2])
#define WEDGE2_OVERLAP   -2
#define WEDGE2_NO_OVERLAP   -1
#define WEDGE2_AB_IN_CD   0
#define WEDGE2_CD_IN_AB   1
#define WEDGE2_IDENTICAL   2
#define WEDGE2_TOUCH_AT_BC   3
#define WEDGE2_TOUCH_AT_DA   4
#define WEDGE_ANG_TOL   0.001
#define ANG_SMASH(_a)
#define A_LT_B   {ret = -1; goto out;}
#define AB_EQUAL   {ret = 0; goto out;}
#define A_GT_B   {ret = 1; goto out;}
#define VAVERAGE(a, b, c)

Functions

int nmg_face_state_transition (struct nmg_ray_state *rs, int pos, int multi, int other_rs_state)
int nmg_ck_vu_ptbl (struct bu_ptbl *p, struct faceuse *fu)
double nmg_vu_angle_measure (struct vertexuse *vu, fastf_t *x_dir, fastf_t *y_dir, int assessment, int in)
int nmg_is_v_on_rs_list (const struct nmg_ray_state *rs, const struct vertex *v)
int nmg_assess_eu (struct edgeuse *eu, int forw, struct nmg_ray_state *rs, int pos)
int nmg_assess_vu (struct nmg_ray_state *rs, int pos)
void nmg_pr_vu_stuff (const struct nmg_vu_stuff *vs)
int nmg_wedge_class (int ass, double a, double b)
int nmg_face_coincident_vu_sort (struct nmg_ray_state *rs, int start, int end)
void nmg_sanitize_fu (struct faceuse *fu)
void nmg_face_rs_init (struct nmg_ray_state *rs, struct bu_ptbl *b, struct faceuse *fu1, struct faceuse *fu2, fastf_t *pt, fastf_t *dir, struct edge_g_lseg *eg, const struct bn_tol *tol)
HIDDEN int nmg_face_next_vu_interval (struct nmg_ray_state *rs, int cur, fastf_t *mag, int other_rs_state)
void nmg_edge_geom_isect_line (struct edgeuse *eu, struct nmg_ray_state *rs, const char *reason)
HIDDEN void nmg_fcut_face (struct nmg_ray_state *rs)
HIDDEN void nmg_face_combine_jra (struct nmg_ray_state *rs1, fastf_t *mag1, struct nmg_ray_state *rs2, fastf_t *mag2)
HIDDEN void nmg_face_combineX (struct nmg_ray_state *rs1, fastf_t *mag1, struct nmg_ray_state *rs2, fastf_t *mag2)
void nmg_unlist_v (struct bu_ptbl *b, fastf_t *mag, struct vertex *v)
int nmg_onon_fix (struct nmg_ray_state *rs, struct bu_ptbl *b, struct bu_ptbl *ob, fastf_t *mag, fastf_t *omag)
edge_g_lsegnmg_face_cutjoin (struct bu_ptbl *b1, struct bu_ptbl *b2, fastf_t *mag1, fastf_t *mag2, struct faceuse *fu1, struct faceuse *fu2, fastf_t *pt, fastf_t *dir, struct edge_g_lseg *eg, const struct bn_tol *tol)
void nmg_fcut_face_2d (struct bu_ptbl *vu_list, fastf_t *mag, struct faceuse *fu1, struct faceuse *fu2, struct bn_tol *tol)
int nmg_insert_vu_if_on_edge (struct vertexuse *vu1, struct vertexuse *vu2, struct edgeuse *new_eu, struct bn_tol *tol)


Detailed Description

After two faces have been intersected, cut or join loops crossed by the line of intersection. (Formerly nmg_comb.c)

The main external routine here is nmg_face_cutjoin().

The line of intersection ("ray") will divide the face into two sets of loops. No one loop may cross the ray after this routine is finished. (Current optimization may remove this property).

Intersection points of significance to the other face but not yet part of the current face's geometry are denoted by a vu on the ray list, which points to a loop of a single vertex. These points need to be incorporated into the final face.

Authors - Michael John Muuss Lee A. Butler

Source - The U. S. Army Research Laboratory Aberdeen Proving Ground, Maryland 21005-5068 USA

Definition in file nmg_fcut.c.


Define Documentation

#define PLOT_BOTH_FACES   1
 

Definition at line 1 of file nmg_fcut.c.

#define NMG_STATE_ERROR   0
 

Definition at line 51 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_STATE_OUT   1
 

Definition at line 52 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_STATE_ON_L   2
 

Definition at line 53 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_STATE_ON_R   3
 

Definition at line 54 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_STATE_ON_B   4
 

Definition at line 55 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_STATE_ON_N   5
 

Definition at line 56 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_STATE_IN   6
 

Definition at line 57 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_E_ASSESSMENT_LEFT   0
 

Definition at line 69 of file nmg_fcut.c.

Referenced by nmg_face_coincident_vu_sort(), and nmg_vu_angle_measure().

#define NMG_E_ASSESSMENT_RIGHT   1
 

Definition at line 70 of file nmg_fcut.c.

Referenced by nmg_vu_angle_measure().

#define NMG_E_ASSESSMENT_ON_FORW   2
 

Definition at line 71 of file nmg_fcut.c.

Referenced by nmg_assess_eu(), nmg_face_coincident_vu_sort(), nmg_face_state_transition(), nmg_vu_angle_measure(), and nmg_wedge_class().

#define NMG_E_ASSESSMENT_ON_REV   3
 

Definition at line 72 of file nmg_fcut.c.

Referenced by nmg_assess_eu(), nmg_face_coincident_vu_sort(), nmg_face_state_transition(), nmg_vu_angle_measure(), and nmg_wedge_class().

#define NMG_E_ASSESSMENT_ERROR   4
 

Definition at line 73 of file nmg_fcut.c.

#define NMG_V_ASSESSMENT_LONE   16
 

Definition at line 75 of file nmg_fcut.c.

Referenced by nmg_assess_vu().

#define NMG_V_ASSESSMENT_ERROR   17
 

Definition at line 76 of file nmg_fcut.c.

Referenced by nmg_assess_vu().

#define NMG_V_COMB _p,
_n   )     (((_p)<<2)|(_n))
 

Definition at line 77 of file nmg_fcut.c.

Referenced by nmg_assess_vu(), nmg_face_coincident_vu_sort(), and nmg_wedge_class().

#define NMG_V_ASSESSMENT_PREV _a   )     (((_a)>>2)&3)
 

Definition at line 80 of file nmg_fcut.c.

Referenced by nmg_face_state_transition(), and nmg_vu_angle_measure().

#define NMG_V_ASSESSMENT_NEXT _a   )     ((_a)&3)
 

Definition at line 81 of file nmg_fcut.c.

Referenced by nmg_face_state_transition(), and nmg_vu_angle_measure().

#define NMG_LEFT_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_LEFT)
 

Definition at line 117 of file nmg_fcut.c.

#define NMG_LEFT_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_RIGHT)
 

Definition at line 118 of file nmg_fcut.c.

#define NMG_LEFT_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_ON_FORW)
 

Definition at line 119 of file nmg_fcut.c.

#define NMG_LEFT_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_LEFT,NMG_E_ASSESSMENT_ON_REV)
 

Definition at line 120 of file nmg_fcut.c.

#define NMG_RIGHT_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_LEFT)
 

Definition at line 121 of file nmg_fcut.c.

#define NMG_RIGHT_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_RIGHT)
 

Definition at line 122 of file nmg_fcut.c.

#define NMG_RIGHT_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_ON_FORW)
 

Definition at line 123 of file nmg_fcut.c.

#define NMG_RIGHT_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_RIGHT,NMG_E_ASSESSMENT_ON_REV)
 

Definition at line 124 of file nmg_fcut.c.

#define NMG_ON_FORW_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_LEFT)
 

Definition at line 125 of file nmg_fcut.c.

#define NMG_ON_FORW_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_RIGHT)
 

Definition at line 126 of file nmg_fcut.c.

#define NMG_ON_FORW_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_ON_FORW)
 

Definition at line 127 of file nmg_fcut.c.

#define NMG_ON_FORW_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_ON_FORW,NMG_E_ASSESSMENT_ON_REV)
 

Definition at line 128 of file nmg_fcut.c.

Referenced by nmg_assess_vu().

#define NMG_ON_REV_LEFT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_LEFT)
 

Definition at line 129 of file nmg_fcut.c.

#define NMG_ON_REV_RIGHT   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_RIGHT)
 

Definition at line 130 of file nmg_fcut.c.

#define NMG_ON_REV_ON_FORW   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_ON_FORW)
 

Definition at line 131 of file nmg_fcut.c.

Referenced by nmg_assess_vu().

#define NMG_ON_REV_ON_REV   NMG_V_COMB(NMG_E_ASSESSMENT_ON_REV,NMG_E_ASSESSMENT_ON_REV)
 

Definition at line 132 of file nmg_fcut.c.

#define NMG_LONE   NMG_V_ASSESSMENT_LONE
 

Definition at line 133 of file nmg_fcut.c.

#define NMG_ACTION_ERROR   0
 

Definition at line 147 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_ACTION_NONE   1
 

Definition at line 148 of file nmg_fcut.c.

#define NMG_ACTION_NONE_OPTIM   2
 

Definition at line 149 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_ACTION_VFY_EXT   3
 

Definition at line 150 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_ACTION_VFY_MULTI   4
 

Definition at line 151 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_ACTION_LONE_V_ESPLIT   5
 

Definition at line 152 of file nmg_fcut.c.

#define NMG_ACTION_LONE_V_JAUNT   6
 

Definition at line 153 of file nmg_fcut.c.

#define NMG_ACTION_CUTJOIN   7
 

Definition at line 154 of file nmg_fcut.c.

Referenced by nmg_face_state_transition().

#define NMG_RAYSTATE_MAGIC   0x54322345
 

Definition at line 186 of file nmg_fcut.c.

Referenced by nmg_face_rs_init().

#define NMG_CK_RAYSTATE _p   )     NMG_CKMAG(_p, NMG_RAYSTATE_MAGIC, "nmg_ray_state")
 

Definition at line 187 of file nmg_fcut.c.

Referenced by nmg_assess_eu(), nmg_assess_vu(), nmg_edge_geom_isect_line(), nmg_face_coincident_vu_sort(), nmg_face_combineX(), nmg_face_next_vu_interval(), nmg_face_state_transition(), nmg_fcut_face(), and nmg_onon_fix().

#define RADIAN_TWEEK   1.0e-14
 

Referenced by nmg_vu_angle_measure().

#define WEDGE_LEFT   0
 

Definition at line 821 of file nmg_fcut.c.

Referenced by nmg_face_coincident_vu_sort(), and nmg_wedge_class().

#define WEDGE_CROSS   1
 

Definition at line 822 of file nmg_fcut.c.

Referenced by nmg_wedge_class().

#define WEDGE_RIGHT   2
 

Definition at line 823 of file nmg_fcut.c.

Referenced by nmg_wedge_class().

#define WEDGE_ON   3
 

Definition at line 824 of file nmg_fcut.c.

Referenced by nmg_wedge_class().

#define WEDGECLASS2STR _cl   )     nmg_wedgeclass_string[(_cl)]
 

Definition at line 825 of file nmg_fcut.c.

Referenced by nmg_face_coincident_vu_sort(), nmg_pr_vu_stuff(), and nmg_wedge_class().

#define WEDGE2_TO_STRING _class2   )     (nmg_wedge2_string[(_class2)+2])
 

Definition at line 949 of file nmg_fcut.c.

#define WEDGE2_OVERLAP   -2
 

Definition at line 951 of file nmg_fcut.c.

#define WEDGE2_NO_OVERLAP   -1
 

Definition at line 952 of file nmg_fcut.c.

#define WEDGE2_AB_IN_CD   0
 

Definition at line 953 of file nmg_fcut.c.

#define WEDGE2_CD_IN_AB   1
 

Definition at line 954 of file nmg_fcut.c.

#define WEDGE2_IDENTICAL   2
 

Definition at line 955 of file nmg_fcut.c.

#define WEDGE2_TOUCH_AT_BC   3
 

Definition at line 956 of file nmg_fcut.c.

#define WEDGE2_TOUCH_AT_DA   4
 

Definition at line 957 of file nmg_fcut.c.

#define WEDGE_ANG_TOL   0.001
 

#define ANG_SMASH _a   ) 
 

Value:

{\
        if( _a <= WEDGE_ANG_TOL )  _a = 0; \
        else if( NEAR_ZERO( _a - 180, WEDGE_ANG_TOL ) )  _a = 180; \
        else if( _a >= 360 - WEDGE_ANG_TOL )  _a = 360; }

#define A_LT_B   {ret = -1; goto out;}
 

N M G _ F A C E _ V U _ C O M P A R E

Support routine for nmg_face_coincident_vu_sort(), via qsort().

It is important to note that an edge on the LEFT side of the ray will have a "lo" angle which is numerically LARGER than the "hi" angle. However, all are measured in the usual units: 0 = ON_REV, 90 = RIGHT, 180 = ON_FORW, 270 = LEFT.

Returns - -1 when A < B 0 when A == B +1 when A > B

Definition at line 1315 of file nmg_fcut.c.

#define AB_EQUAL   {ret = 0; goto out;}
 

Definition at line 1316 of file nmg_fcut.c.

#define A_GT_B   {ret = 1; goto out;}
 

Definition at line 1317 of file nmg_fcut.c.

#define VAVERAGE a,
b,
 ) 
 

Value:

{ \
        (a)[X] = ((b)[X] + (c)[X]) * 0.5;\
        (a)[Y] = ((b)[Y] + (c)[Y]) * 0.5;\
        (a)[Z] = ((b)[Z] + (c)[Z]) * 0.5;\
        }

Definition at line 2142 of file nmg_fcut.c.


Function Documentation

int nmg_face_state_transition struct nmg_ray_state rs,
int  pos,
int  multi,
int  other_rs_state
 

N M G _ F A C E _ S T A T E _ T R A N S I T I O N

Given current (old) state, assess the current vertexuse, and pull the appropriate action and new state from the tables. Then perform the indicated action.

The real work happens in the nmg_assess_vu() and in the tables.

Explicit Returns - Nothing useful yet.

Implicit Returns - Modifications to the NMG shell being operated on. Updated state etc. in nmg_ray_state structure.

Definition at line 3963 of file nmg_fcut.c.

References state_transitions::action, state_transitions::assessment, BN_CK_TOL, bu_identify_magic(), BU_LIST_PNEXT_CIRC, BU_LIST_PPREV_CIRC, bu_log(), bu_vls_addr(), bu_vls_init(), bu_vls_printf(), DEBUG_PLOTEM, DEBUG_VERIFY, nmg_ray_state::eg_p, vertexuse::eu_p, edgeuse::eumate_p, nmg_ray_state::fu1, nmg_ray_state::fu2, shell::fu_hd, loopuse::fu_p, edgeuse::g, edgeuse::l, loopuse::l_p, nmg_ray_state::last_action, nmg_ray_state::left, edgeuse::lseg_p, vertexuse::lu_p, loopuse::lumate_p, vertexuse::magic_p, state_transitions::new_state, NMG_ACTION_CUTJOIN, NMG_ACTION_ERROR, NMG_ACTION_NONE_OPTIM, NMG_ACTION_VFY_EXT, NMG_ACTION_VFY_MULTI, nmg_assess_eu(), nmg_assess_vu(), NMG_CK_EDGE_G_LSEG, NMG_CK_EDGEUSE, NMG_CK_FACEUSE, NMG_CK_LOOPUSE, NMG_CK_RAYSTATE, NMG_CK_VERTEXUSE, nmg_cut_loop(), NMG_E_ASSESSMENT_ON_FORW, NMG_E_ASSESSMENT_ON_REV, nmg_ebreaker(), nmg_edge_geom_isect_line(), NMG_EDGEUSE_MAGIC, nmg_find_eu_of_vu(), nmg_find_lu_of_vu(), nmg_find_model(), nmg_findeu(), nmg_fu_touchingloops(), nmg_join_2loops(), nmg_join_2singvu_loops(), nmg_join_singvu_loop(), nmg_klu(), nmg_loop_g(), nmg_loop_is_a_crack(), NMG_LOOPUSE_MAGIC, nmg_lu_reorient(), nmg_orientation(), nmg_pl_comb_fu(), nmg_pl_m(), nmg_plot_lu_ray(), nmg_pr_eu_endpoints(), nmg_pr_fu(), nmg_pr_lu(), nmg_pr_lu_briefly(), nmg_pr_vu(), nmg_pr_vu_briefly(), nmg_radial_join_eu(), nmg_set_lu_orientation(), nmg_split_lu_at_vu(), nmg_stash_model_to_file(), NMG_STATE_ERROR, NMG_STATE_IN, NMG_STATE_ON_B, NMG_STATE_ON_L, NMG_STATE_ON_N, NMG_STATE_ON_R, NMG_STATE_OUT, NMG_V_ASSESSMENT_NEXT, NMG_V_ASSESSMENT_PREV, nmg_vfu(), NULL, nmg_ray_state::nvu, loopuse::orientation, OT_BOOLPLACE, OT_SAME, OT_UNSPEC, rt_bomb(), RT_G_DEBUG, faceuse::s_p, nmg_ray_state::state, nmg_ray_state::tol, vertexuse::up, loopuse::up, vertexuse::v_p, nmg_ray_state::vu, and edgeuse::vu_p.

Referenced by nmg_face_next_vu_interval().

Here is the call graph for this function:

double nmg_vu_angle_measure struct vertexuse vu,
fastf_t x_dir,
fastf_t y_dir,
int  assessment,
int  in
 

N M G _ V U _ A N G L E _ M E A S U R E

Given a vertexuse from a loop which lies in a plane, compute the vector 'vec' from the previous vertex to this one. Using two perpendicular vectors (x_dir and y_dir) which both lie in the plane of the loop, return the angle (in radians) of 'vec' from x_dir, going CCW around the perpendicular x_dir CROSS y_dir.

x_dir is -ray_dir y_dir points right.

Returns - vec == x_dir returns 0, vec == y_dir returns pi/2, vec == -x_dir returns pi, vec == -y_dir returns 3*pi/2. 0.0 if unable to compute 'vec'

Definition at line 412 of file nmg_fcut.c.

References bn_angle_measure(), bn_pi, bn_radtodeg, bn_twopi, BU_LIST_PNEXT_CIRC, BU_LIST_PPREV_CIRC, bu_log(), vertex_g::coord, DEBUG_VU_SORT, vertexuse::magic_p, NMG_CK_LOOPUSE, NMG_CK_VERTEXUSE, NMG_E_ASSESSMENT_LEFT, NMG_E_ASSESSMENT_ON_FORW, NMG_E_ASSESSMENT_ON_REV, NMG_E_ASSESSMENT_RIGHT, nmg_find_eu_with_vu_in_lu(), nmg_find_lu_of_vu(), NMG_LOOPUSE_MAGIC, NMG_V_ASSESSMENT_NEXT, NMG_V_ASSESSMENT_PREV, RADIAN_TWEEK, vertexuse::up, V3ARGS, vertexuse::v_p, vertex::vg_p, VSUB2, and edgeuse::vu_p.

Here is the call graph for this function:

int nmg_is_v_on_rs_list const struct nmg_ray_state rs,
const struct vertex v
 

N M G _ I S _ V _ O N _ R S _ L I S T

Definition at line 526 of file nmg_fcut.c.

References NMG_CK_VERTEX, nmg_ray_state::nvu, vertexuse::v_p, and nmg_ray_state::vu.

Referenced by nmg_assess_eu().

int nmg_assess_eu struct edgeuse eu,
int  forw,
struct nmg_ray_state rs,
int  pos
 

N M G _ A S S E S S _ E U

The current vertex (eu->vu_p) is on the line of intersection. Assess the indicated edge, to see if it lies on the line of intersection, or departs towards the left or right.

There is no need to look more than one edge forward or backward. Even if there are edges which loop around to the same vertex (with a different vertexuse), that (0-length) edge is ON the ray.

Definition at line 550 of file nmg_fcut.c.

References BN_CK_TOL, BU_LIST_PNEXT_CIRC, BU_LIST_PPREV_CIRC, bu_log(), vertex_g::coord, DEBUG_FCUT, nmg_ray_state::dir, bn_tol::dist_sq, edgeuse::g, edgeuse::lseg_p, MAGSQ, NMG_CK_EDGEUSE, NMG_CK_RAYSTATE, NMG_CK_VERTEX, NMG_E_ASSESSMENT_ON_FORW, NMG_E_ASSESSMENT_ON_REV, nmg_is_v_on_rs_list(), nmg_pr_eu(), nmg_pr_vu_briefly(), NULL, rt_bomb(), SMALL_FASTF, start, nmg_ray_state::tol, vertexuse::v_p, VDOT, vertex::vg_p, VSUB2, nmg_ray_state::vu, and edgeuse::vu_p.

Referenced by nmg_assess_vu(), nmg_face_state_transition(), and nmg_onon_fix().

Here is the call graph for this function:

int nmg_assess_vu struct nmg_ray_state rs,
int  pos
 

N M G _ A S S E S S _ V U

Definition at line 733 of file nmg_fcut.c.

References bn_dist_line3_pt3(), BU_LIST_PNEXT_CIRC, BU_LIST_PPREV_CIRC, bu_log(), vertex_g::coord, DEBUG_FCUT, nmg_ray_state::dir, bn_tol::dist, vertexuse::eu_p, vertexuse::magic_p, nmg_assess_eu(), nmg_break_long_edges(), NMG_CK_RAYSTATE, NMG_CK_VERTEXUSE, nmg_find_eu_with_vu_in_lu(), nmg_find_lu_of_vu(), nmg_find_s_of_eu(), NMG_LOOPUSE_MAGIC, NMG_ON_FORW_ON_REV, NMG_ON_REV_ON_FORW, NMG_V_ASSESSMENT_ERROR, NMG_V_ASSESSMENT_LONE, NMG_V_COMB, nmg_ray_state::pt, rt_bomb(), nmg_ray_state::tol, vertexuse::up, vertexuse::v_p, vertex::vg_p, VPRINT, nmg_ray_state::vu, and edgeuse::vu_p.

Referenced by nmg_face_coincident_vu_sort(), and nmg_face_state_transition().

Here is the call graph for this function:

void nmg_pr_vu_stuff const struct nmg_vu_stuff vs  ) 
 

N M G _ P R _ V U _ S T U F F

Definition at line 838 of file nmg_fcut.c.

References bu_log(), nmg_vu_stuff::hi_ang, nmg_vu_stuff::in_vu_angle, nmg_vu_stuff::lo_ang, nmg_vu_stuff::loop_index, nmg_vu_stuff::lsp, nmg_vu_stuff::min_vu_dot, nmg_vu_stuff::out_vu_angle, nmg_vu_stuff::seq, nmg_vu_stuff::vu, nmg_vu_stuff::wedge_class, and WEDGECLASS2STR.

Here is the call graph for this function:

int nmg_face_coincident_vu_sort struct nmg_ray_state rs,
int  start,
int  end
 

N M G _ F A C E _ C O I N C I D E N T _ V U _ S O R T

Given co-incident vertexuses (same distance along the ray), sort them into the "proper" order for driving the state machine.

Definition at line 1702 of file nmg_fcut.c.

References nmg_ray_state::ang_x_dir, nmg_ray_state::ang_y_dir, bn_radtodeg, bu_log(), bu_malloc(), nmg_vu_stuff::hi_ang, nmg_vu_stuff::in_vu_angle, loopuse::l, nmg_vu_stuff::lo_ang, nmg_loop_stuff::lu, vertexuse::magic_p, nmg_assess_vu(), NMG_CK_LOOPUSE, NMG_CK_RAYSTATE, NMG_E_ASSESSMENT_LEFT, NMG_E_ASSESSMENT_ON_FORW, NMG_E_ASSESSMENT_ON_REV, nmg_find_lu_of_vu(), NMG_LOOPUSE_MAGIC, NMG_V_COMB, nmg_vu_angle_measure(), nmg_wedge_class(), OT_BOOLPLACE, nmg_vu_stuff::out_vu_angle, rt_bomb(), nmg_vu_stuff::seq, top(), vertexuse::up, vertexuse::v_p, nmg_vu_stuff::vu, nmg_ray_state::vu, nmg_vu_stuff::wedge_class, WEDGE_LEFT, and WEDGECLASS2STR.

Here is the call graph for this function:

void nmg_face_rs_init struct nmg_ray_state rs,
struct bu_ptbl b,
struct faceuse fu1,
struct faceuse fu2,
fastf_t pt,
fastf_t dir,
struct edge_g_lseg eg,
const struct bn_tol tol
 

N M G _ F A C E _ R S _ I N I T

Set up nmg_ray_state structure. "left" is a vector that lies in the plane of the face which contains the loops being operated on. It points in the direction "left" of the ray, such that the first OT_SAME loop in the first OT_SAME fact that it crosses will cross the ray in a left-to-right manner consistent with the CCW loop rule. There are some special conditions placed on the "dir" argument to make this happen; see the comments in nmg_inter.c for details, or Mike's notes "The 'Left' Vector Choice" dated 27-Aug-93, page 1.

Definition at line 1957 of file nmg_fcut.c.

References BN_CK_TOL, BU_CK_PTBL, BU_LIST_FIRST, BU_LIST_FIRST_MAGIC, BU_LIST_FOR, BU_LIST_PNEXT_CIRC, bu_log(), BU_PTBL_END, BU_PTBL_GET, bu_ptbl::buffer, bzero, vertex_g::coord, DEBUG_FCUT, loopuse::down_hd, bu_ptbl::end, HPRINT, faceuse::lu_hd, MAGNITUDE, NMG_CK_EDGE_G_LSEG, NMG_CK_FACEUSE, NMG_GET_FU_PLANE, nmg_orientation(), nmg_pr_eu_briefly(), nmg_pr_vu_briefly(), NMG_RAYSTATE_MAGIC, NMG_VERTEXUSE_MAGIC, faceuse::orientation, OT_OPPOSITE, OT_SAME, rt_bomb(), faceuse::s_p, V3ARGS, vertexuse::v_p, VCROSS, VDIVIDE_TOL, vertex::vg_p, VMOVE, VPRINT, VREVERSE, VSUB2, edgeuse::vu_p, and VUNITIZE.

Referenced by nmg_fcut_face_2d().

Here is the call graph for this function:

HIDDEN int nmg_face_next_vu_interval struct nmg_ray_state rs,
int  cur,
fastf_t mag,
int  other_rs_state
 

N M G _ F A C E _ N E X T _ V U _ I N T E R V A L

Handle the extent of coincident vertexuses at this distance. ptbl_vsort() will have forced all the distances to be exactly equal if they are within tolerance of each other.

Two cases: lone vertexuse, and range of vertexuses.

Return value is where next interval starts.

Definition at line 2068 of file nmg_fcut.c.

References BN_CK_TOL, bu_log(), DEBUG_FCUT, nmg_ray_state::eg_p, nmg_ray_state::fu1, nmg_ray_state::fu2, nmg_2face_plot(), NMG_CK_EDGE_G_LSEG, NMG_CK_RAYSTATE, nmg_face_plot(), nmg_face_state_transition(), nmg_ray_state::nvu, nmg_ray_state::tol, vertexuse::v_p, and nmg_ray_state::vu.

Referenced by nmg_face_combineX().

Here is the call graph for this function:

void nmg_edge_geom_isect_line struct edgeuse eu,
struct nmg_ray_state rs,
const char *  reason
 

N M G _ E D G E _ G E O M _ I S E C T _ L I N E

Force the geometry structure for a given edge to be that of the intersection line between the two faces.

Note that sometimes a vertex can appear to lie on more than one line. It is important to refer to geometry here, to make sure that the edgeuse is not mistakenly fused to the wrong edge geometry.

XXX This has the byproduct that not all edgeuses "on" the line XXX of intersection will share rs->eg_p.

See the comments in nmg_radial_join_eu() for the rationale.

Definition at line 2163 of file nmg_fcut.c.

References bu_log(), nmg_ray_state::dir, edge_g_lseg::e_dir, edge_g_lseg::e_pt, nmg_ray_state::eg_p, edgeuse::g, edgeuse::lseg_p, edgeuse::magic_p, NMG_CK_EDGE_G_LSEG, NMG_CK_EDGEUSE, NMG_CK_RAYSTATE, nmg_edge_g(), nmg_jeg(), nmg_use_edge_g(), nmg_ray_state::pt, and VMOVE.

Referenced by nmg_face_state_transition().

Here is the call graph for this function:

HIDDEN void nmg_fcut_face struct nmg_ray_state rs  ) 
 

Definition at line 2797 of file nmg_fcut.c.

References BN_CK_TOL, bu_log(), nmg_ray_state::eg_p, nmg_ray_state::fu1, nmg_ray_state::fu2, nmg_2face_plot(), NMG_CK_EDGE_G_LSEG, NMG_CK_RAYSTATE, nmg_face_plot(), nmg_find_lu_of_vu(), nmg_pr_fu_briefly(), NULL, nmg_ray_state::nvu, nmg_ray_state::tol, vertexuse::v_p, and nmg_ray_state::vu.

Referenced by nmg_face_combine_jra(), and nmg_fcut_face_2d().

Here is the call graph for this function:

HIDDEN void nmg_face_combine_jra struct nmg_ray_state rs1,
fastf_t mag1,
struct nmg_ray_state rs2,
fastf_t mag2
 

Definition at line 3196 of file nmg_fcut.c.

References nmg_fcut_face().

Here is the call graph for this function:

HIDDEN void nmg_face_combineX struct nmg_ray_state rs1,
fastf_t mag1,
struct nmg_ray_state rs2,
fastf_t mag2
 

N M G _ F A C E _ C O M B I N E

collapse loops,vertices within face fu1 (relative to fu2)

Definition at line 3210 of file nmg_fcut.c.

References BN_CK_TOL, bu_log(), nmg_ray_state::eg_p, nmg_ray_state::fu1, nmg_ray_state::fu2, nmg_2face_plot(), NMG_CK_EDGE_G_LSEG, NMG_CK_RAYSTATE, nmg_face_next_vu_interval(), nmg_face_plot(), nmg_ray_state::nvu, nmg_ray_state::state, and nmg_ray_state::tol.

Here is the call graph for this function:

int nmg_onon_fix struct nmg_ray_state rs,
struct bu_ptbl b,
struct bu_ptbl ob,
fastf_t mag,
fastf_t omag
 

N M G _ O N O N _ F I X

An attempt to fix the condition: nmg_assess_eu(): ON vertexuse in middle of edge?

Note that the vertexuse being zapped may have a lower subscript.

Must be called after vu list has been sorted.

Definition at line 3363 of file nmg_fcut.c.

References BU_CK_PTBL, bu_log(), BU_PTBL_END, BU_PTBL_GET, vertexuse::eu_p, vertexuse::magic_p, nmg_assess_eu(), NMG_CK_RAYSTATE, NMG_CK_VERTEX, NMG_CK_VERTEXUSE, NMG_LOOPUSE_MAGIC, nmg_unlist_v(), vertexuse::up, and vertexuse::v_p.

Here is the call graph for this function:

struct edge_g_lseg* nmg_face_cutjoin struct bu_ptbl b1,
struct bu_ptbl b2,
fastf_t mag1,
fastf_t mag2,
struct faceuse fu1,
struct faceuse fu2,
fastf_t pt,
fastf_t dir,
struct edge_g_lseg eg,
const struct bn_tol tol
 

N M G _ F A C E _ C U T J O I N

The main face cut handler. Called from nmg_inter.c by nmg_isect_2faces().

A wrapper for nmg_face_combine, for now.

The two vertexuse lists may be of different lengths, because one may have multiple uses of a vertex, while the other has only a single use of that same vertex.

Definition at line 3550 of file nmg_fcut.c.

References BN_CK_TOL, bu_log(), bu_ptbl::buffer, bn_tol::dist, bu_ptbl::end, nmg_ray_state::fu1, nmg_ray_state::fu2, NMG_CK_FACEUSE, nmg_pr_vu_briefly(), nmg_ray_state::tol, and top().

Here is the call graph for this function:


Generated on Mon Sep 18 01:25:07 2006 for BRL-CAD by  doxygen 1.4.6