Revision: 54234 http://brlcad.svn.sourceforge.net/brlcad/?rev=54234&view=rev Author: bob1961 Date: 2013-01-30 18:10:25 +0000 (Wed, 30 Jan 2013) Log Message: ----------- Added code for selecting arb edges (i.e. rt_arb_find_e_nearest_pt2()).
Modified Paths: -------------- brlcad/trunk/include/raytrace.h brlcad/trunk/src/librt/primitives/arb8/arb8.c Modified: brlcad/trunk/include/raytrace.h =================================================================== --- brlcad/trunk/include/raytrace.h 2013-01-30 16:38:04 UTC (rev 54233) +++ brlcad/trunk/include/raytrace.h 2013-01-30 18:10:25 UTC (rev 54234) @@ -5453,7 +5453,7 @@ struct db_traverse *dtp); */ -/* arb.c */ +/* arb8.c */ RT_EXPORT extern int rt_arb_get_cgtype(); /* needs rt_arb_internal for arg list */ RT_EXPORT extern int rt_arb_std_type(const struct rt_db_internal *ip, const struct bn_tol *tol); @@ -5486,6 +5486,7 @@ vect_t pos_model, plane_t planes[6], const struct bn_tol *tol); +RT_EXPORT extern int rt_arb_find_e_nearest_pt2(int *edge, int *vert1, int *vert2, const struct rt_db_internal *ip, const point_t pt2, const mat_t mat, fastf_t ptol); RT_EXPORT extern const int rt_arb_faces[5][24]; RT_EXPORT extern short earb8[12][18]; Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2013-01-30 16:38:04 UTC (rev 54233) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2013-01-30 18:10:25 UTC (rev 54234) @@ -153,7 +153,20 @@ { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; +short local_arb6_edge_vertex_mapping[10][2] = { + {0,1}, /* edge 12 */ + {1,2}, /* edge 23 */ + {2,3}, /* edge 34 */ + {0,3}, /* edge 14 */ + {0,4}, /* edge 15 */ + {1,4}, /* edge 25 */ + {2,7}, /* edge 36 */ + {3,7}, /* edge 46 */ + {4,4}, /* point 5 */ + {7,7}, /* point 6 */ +}; + /* rt_arb_get_cgtype(), rt_arb_std_type(), and rt_arb_centroid() * stolen from mged/arbs.c */ @@ -2340,6 +2353,174 @@ } +int +rt_arb_get_edge_list(const struct rt_db_internal *ip, short (*edge_list[])[2]) +{ + size_t edge_count=0; + int arb_type; + struct bn_tol tmp_tol; + struct rt_arb_internal *aip = (struct rt_arb_internal *)ip->idb_ptr; + + RT_ARB_CK_MAGIC(aip); + + /* set up tolerance for rt_arb_std_type */ + tmp_tol.magic = BN_TOL_MAGIC; + tmp_tol.dist = 0.0001; /* to get old behavior of rt_arb_std_type() */ + tmp_tol.dist_sq = tmp_tol.dist * tmp_tol.dist; + tmp_tol.perp = 1e-5; + tmp_tol.para = 1 - tmp_tol.perp; + + /* get number of vertices in arb_type */ + arb_type = rt_arb_std_type(ip, &tmp_tol); + + switch (arb_type) { + case ARB8: + edge_count = 12; + (*edge_list) = arb8_edge_vertex_mapping; + + break; + case ARB7: + edge_count = 12; + (*edge_list) = arb7_edge_vertex_mapping; + + break; + case ARB6: + edge_count = 10; + (*edge_list) = local_arb6_edge_vertex_mapping; + + break; + case ARB5: + edge_count = 9; + (*edge_list) = arb5_edge_vertex_mapping; + + break; + case ARB4: + edge_count = 5; + (*edge_list) = arb4_edge_vertex_mapping; + + break; + default: + return edge_count; + } + + return edge_count; +} + + +int +rt_arb_find_e_nearest_pt2(int *edge, + int *vert1, + int *vert2, + const struct rt_db_internal *ip, + const point_t pt2, + const mat_t mat, + const fastf_t ptol) +{ + int i; + fastf_t dist=MAX_FASTF, tmp_dist; + short (*edge_list)[2]; + int edge_count=0; + struct bn_tol tol; + struct rt_arb_internal *aip = (struct rt_arb_internal *)ip->idb_ptr; + + RT_ARB_CK_MAGIC(aip); + /* first build a list of edges */ + if ((edge_count = rt_arb_get_edge_list(ip, &edge_list)) == 0) + return -1; + + /* build a tolerance structure for the bn_dist routine */ + tol.magic = BN_TOL_MAGIC; + tol.dist = 0.0; + tol.dist_sq = 0.0; + tol.perp = 0.0; + tol.para = 1.0; + + /* now look for the closest edge */ + for (i = 0; i < edge_count; i++) { + point_t p1, p2, pca; + vect_t p1_to_pca, p1_to_p2; + int ret; + + MAT4X3PNT(p1, mat, aip->pt[edge_list[i][0]]); + p1[Z] = 0.0; + + if (edge_list[i][0] == edge_list[i][1]) { + tmp_dist = bn_dist_pt3_pt3(pt2, p1); + + if (tmp_dist < ptol) { + *vert1 = edge_list[i][0] + 1; + *vert2 = *vert1; + *edge = i + 1; + + return 0; + } + + ret = 4; + } else { + MAT4X3PNT(p2, mat, aip->pt[edge_list[i][1]]); + p2[Z] = 0.0; + ret = bn_dist_pt2_lseg2(&tmp_dist, pca, p1, p2, pt2, &tol); + } + + if (ret < 3 || tmp_dist < dist) { + switch (ret) { + case 0: + dist = 0.0; + if (tmp_dist < 0.5) { + *vert1 = edge_list[i][0] + 1; + *vert2 = edge_list[i][1] + 1; + } else { + *vert1 = edge_list[i][1] + 1; + *vert2 = edge_list[i][0] + 1; + } + *edge = i + 1; + break; + case 1: + dist = 0.0; + *vert1 = edge_list[i][0] + 1; + *vert2 = edge_list[i][1] + 1; + *edge = i + 1; + break; + case 2: + dist = 0.0; + *vert1 = edge_list[i][1] + 1; + *vert2 = edge_list[i][0] + 1; + *edge = i + 1; + break; + case 3: + dist = tmp_dist; + *vert1 = edge_list[i][0] + 1; + *vert2 = edge_list[i][1] + 1; + *edge = i + 1; + break; + case 4: + dist = tmp_dist; + *vert1 = edge_list[i][1] + 1; + *vert2 = edge_list[i][0] + 1; + *edge = i + 1; + break; + case 5: + dist = tmp_dist; + V2SUB2(p1_to_pca, pca, p1); + V2SUB2(p1_to_p2, p2, p1); + if (MAG2SQ(p1_to_pca) / MAG2SQ(p1_to_p2) < 0.25) { + *vert1 = edge_list[i][0] + 1; + *vert2 = edge_list[i][1] + 1; + } else { + *vert1 = edge_list[i][1] + 1; + *vert2 = edge_list[i][0] + 1; + } + *edge = i + 1; + break; + } + } + } + + return 0; +} + + + /** @} */ /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_jan _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits