Revision: 54288
          http://brlcad.svn.sourceforge.net/brlcad/?rev=54288&view=rev
Author:   bob1961
Date:     2013-02-01 20:20:41 +0000 (Fri, 01 Feb 2013)
Log Message:
-----------
Added rt_arb_check_points (used by rt_arb_calc_points and rt_arb_edit to 
prevent zero length edges).

Modified Paths:
--------------
    brlcad/trunk/include/raytrace.h
    brlcad/trunk/src/libged/move_arb_face.c
    brlcad/trunk/src/librt/primitives/arb8/arb8.c

Modified: brlcad/trunk/include/raytrace.h
===================================================================
--- brlcad/trunk/include/raytrace.h     2013-02-01 18:43:02 UTC (rev 54287)
+++ brlcad/trunk/include/raytrace.h     2013-02-01 20:20:41 UTC (rev 54288)
@@ -5460,6 +5460,9 @@
 RT_EXPORT extern void rt_arb_centroid(point_t                       *cent,
                                      const struct rt_db_internal   *ip);
 RT_EXPORT extern int rt_arb_calc_points();             /* needs wdb.h for arg 
list */
+RT_EXPORT extern int rt_arb_check_points(struct rt_arb_internal *arb,
+                                        int cgtype,
+                                        const struct bn_tol *tol);
 RT_EXPORT extern int rt_arb_3face_intersect(point_t                    point,
                                            const plane_t               
planes[6],
                                            int                 type,           
/* 4..8 */

Modified: brlcad/trunk/src/libged/move_arb_face.c
===================================================================
--- brlcad/trunk/src/libged/move_arb_face.c     2013-02-01 18:43:02 UTC (rev 
54287)
+++ brlcad/trunk/src/libged/move_arb_face.c     2013-02-01 20:20:41 UTC (rev 
54288)
@@ -72,6 +72,7 @@
     struct rt_db_internal intern;
     struct rt_arb_internal *arb;
     fastf_t planes[7][4];              /* ARBs defining plane equations */
+    fastf_t save_tol_dist;
     int arb_type;
     int face;
     int rflag = 0;
@@ -213,7 +214,14 @@
     planes[face][3] = VDOT(&planes[face][0], pt);
 
     /* calculate new points for the arb */
-    (void)rt_arb_calc_points(arb, arb_type, planes, &gedp->ged_wdbp->wdb_tol);
+    save_tol_dist = gedp->ged_wdbp->wdb_tol.dist;
+    gedp->ged_wdbp->wdb_tol.dist = gedp->ged_wdbp->wdb_tol.dist * 2;
+    if (rt_arb_calc_points(arb, arb_type, planes, &gedp->ged_wdbp->wdb_tol) < 
0) {
+       gedp->ged_wdbp->wdb_tol.dist = save_tol_dist;
+       rt_db_free_internal(&intern);
+       return GED_ERROR;
+    }
+    gedp->ged_wdbp->wdb_tol.dist = save_tol_dist;
 
     {
        int i;

Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c
===================================================================
--- brlcad/trunk/src/librt/primitives/arb8/arb8.c       2013-02-01 18:43:02 UTC 
(rev 54287)
+++ brlcad/trunk/src/librt/primitives/arb8/arb8.c       2013-02-01 20:20:41 UTC 
(rev 54288)
@@ -166,7 +166,16 @@
     {7,7},     /* point 6 */
 };
 
+short local_arb4_edge_vertex_mapping[6][2] = {
+    {0,1},     /* edge 12 */
+    {1,2},     /* edge 23 */
+    {2,0},     /* edge 31 */
+    {0,3},     /* edge 14 */
+    {1,3},     /* edge 24 */
+    {2,3},     /* edge 34 */
+};
 
+
 /* rt_arb_get_cgtype(), rt_arb_std_type(), and rt_arb_centroid()
  * stolen from mged/arbs.c */
 
@@ -1873,7 +1882,7 @@
  * This is an analog of rt_arb_calc_planes().
  */
 int
-rt_arb_calc_points(struct rt_arb_internal *arb, int cgtype, const plane_t 
planes[6], const struct bn_tol *UNUSED(tol))
+rt_arb_calc_points(struct rt_arb_internal *arb, int cgtype, const plane_t 
planes[6], const struct bn_tol *tol)
 {
     int i;
     point_t pt[8];
@@ -1888,14 +1897,70 @@
        }
     }
 
-    /* Move new points to arb */
+    /* Move new points to arb tol->dist))*/
     for (i=0; i<8; i++) {
        VMOVE(arb->pt[i], pt[i]);
     }
+
+    if (rt_arb_check_points(arb, cgtype, tol) < 0)
+       return -1;
+
     return 0;                                  /* success */
 }
 
 
+int
+rt_arb_check_points(struct rt_arb_internal *arb, int cgtype, const struct 
bn_tol *tol)
+{
+    register int i;
+
+    switch (cgtype) {
+        case ARB8:
+           for (i=0; i<12; ++i) {
+               if (VNEAR_EQUAL(arb->pt[arb8_edge_vertex_mapping[i][0]],
+                               arb->pt[arb8_edge_vertex_mapping[i][1]],
+                               tol->dist))
+                   return -1;
+           }
+           break;
+        case ARB7:
+           for (i=0; i<11; ++i) {
+               if (VNEAR_EQUAL(arb->pt[arb7_edge_vertex_mapping[i][0]],
+                               arb->pt[arb7_edge_vertex_mapping[i][1]],
+                               tol->dist))
+                   return -1;
+           }
+           break;
+        case ARB6:
+           for (i=0; i<8; ++i) {
+               if (VNEAR_EQUAL(arb->pt[local_arb6_edge_vertex_mapping[i][0]],
+                               arb->pt[local_arb6_edge_vertex_mapping[i][1]],
+                               tol->dist))
+                   return -1;
+           }
+           break;
+        case ARB5:
+           for (i=0; i<8; ++i) {
+               if (VNEAR_EQUAL(arb->pt[arb5_edge_vertex_mapping[i][0]],
+                               arb->pt[arb5_edge_vertex_mapping[i][1]],
+                               tol->dist))
+                   return -1;
+           }
+           break;
+        case ARB4:
+           for (i=0; i<6; ++i) {
+               if (VNEAR_EQUAL(arb->pt[local_arb4_edge_vertex_mapping[i][0]],
+                               arb->pt[local_arb4_edge_vertex_mapping[i][1]],
+                               tol->dist))
+                   return -1;
+           }
+           break;
+    }
+
+    return 0;
+}
+
+
 /* planes to define ARB vertices */
 static const int rt_arb_planes[5][24] = {
     {0, 1, 3, 0, 1, 2, 0, 2, 3, 0, 1, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3},  
/* ARB4 */
@@ -2279,6 +2344,9 @@
                    break;
     }
 
+    if (rt_arb_check_points(arb, arb_type, tol) < 0)
+       goto err;
+
     return 0;          /* OK */
 
  err:

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

Reply via email to