Revision: 64353
          http://sourceforge.net/p/brlcad/code/64353
Author:   starseeker
Date:     2015-03-09 21:29:01 +0000 (Mon, 09 Mar 2015)
Log Message:
-----------
Break top/bottom sorting out into a function.

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/shape_recognition.h
    brlcad/trunk/src/libbrep/shape_recognition_cone.cpp
    brlcad/trunk/src/libbrep/shape_recognition_cylinder.cpp
    brlcad/trunk/src/libbrep/shape_recognition_util.cpp

Modified: brlcad/trunk/src/libbrep/shape_recognition.h
===================================================================
--- brlcad/trunk/src/libbrep/shape_recognition.h        2015-03-09 19:53:54 UTC 
(rev 64352)
+++ brlcad/trunk/src/libbrep/shape_recognition.h        2015-03-09 21:29:01 UTC 
(rev 64353)
@@ -158,10 +158,9 @@
 void map_to_array(int **array, int *array_cnt, std::map<int,int> *map);
 void array_to_map(std::map<int,int> *map, int *array, int array_cnt);
 
-int
-subbrep_find_corners(struct subbrep_object_data *data, int 
**corner_verts_array, ON_Plane *pcyl);
+int subbrep_find_corners(struct subbrep_object_data *data, int 
**corner_verts_array, ON_Plane *pcyl);
+int subbrep_top_bottom_pnts(struct subbrep_object_data *data, std::set<int> 
*corner_verts, ON_Plane *top_plane, ON_Plane *bottom_plane, 
ON_SimpleArray<const ON_BrepVertex *> *top_pnts, ON_SimpleArray<const 
ON_BrepVertex *> *bottom_pnts);
 
-
 #endif /* SHAPE_RECOGNITION_H */
 
 // Local Variables:

Modified: brlcad/trunk/src/libbrep/shape_recognition_cone.cpp
===================================================================
--- brlcad/trunk/src/libbrep/shape_recognition_cone.cpp 2015-03-09 19:53:54 UTC 
(rev 64352)
+++ brlcad/trunk/src/libbrep/shape_recognition_cone.cpp 2015-03-09 21:29:01 UTC 
(rev 64353)
@@ -271,8 +271,6 @@
         BU_GET(obj, struct csg_object_params);
 
        int negative = negative_cone(data, *conic_surfaces.begin(), cone_tol);
-       bu_log("conic negative: %d\n", negative);
-       bu_log("parent boolean: %c\n", data->parent->params->bool_op);
 
        if (data->parent->params->bool_op == '-') negative = -1 * negative;
 
@@ -336,7 +334,6 @@
                    data->params->bool_op = 'u';
                    break;
                default:
-                   std::cout << "Could not determine cone status???????\n";
                    data->params->bool_op = 'u';
                    break;
            }
@@ -355,8 +352,6 @@
            // Have corners, need arb
            data->type = COMB;
            int negative = negative_cone(data, *conic_surfaces.begin(), 
cone_tol);
-           bu_log("conic negative: %d\n", negative);
-           bu_log("parent boolean: %c\n", data->parent->params->bool_op);
 
            if (data->parent->params->bool_op == '-') negative = -1 * negative;
 
@@ -380,6 +375,8 @@
            bu_vls_sprintf(cone_obj->key, "%s", key.c_str());
            cone_obj->type = CONE;
 
+           // cone - positive object in this sub-comb
+           cone_obj->params->bool_op = 'u';
            cone_obj->params->origin[0] = base.x;
            cone_obj->params->origin[1] = base.y;
            cone_obj->params->origin[2] = base.z;
@@ -391,6 +388,8 @@
            cone_obj->params->height = 
set1_c.Center().DistanceTo(set2_c.Center());
 
            bu_ptbl_ins(data->children, (long *)cone_obj);
+
+
        }
     }
     return 0;

Modified: brlcad/trunk/src/libbrep/shape_recognition_cylinder.cpp
===================================================================
--- brlcad/trunk/src/libbrep/shape_recognition_cylinder.cpp     2015-03-09 
19:53:54 UTC (rev 64352)
+++ brlcad/trunk/src/libbrep/shape_recognition_cylinder.cpp     2015-03-09 
21:29:01 UTC (rev 64353)
@@ -576,25 +576,14 @@
 
 
            // First, find the two points closest to the set1_c and set2_c 
planes
-           double offset = 0.0;
-           std::set<int>::iterator s_it;
-           ON_SimpleArray<const ON_BrepVertex *> corner_pnts(4);
            ON_SimpleArray<const ON_BrepVertex *> bottom_pnts(2);
            ON_SimpleArray<const ON_BrepVertex *> top_pnts(2);
-           for (s_it = corner_verts.begin(); s_it != corner_verts.end(); 
s_it++) {
-               ON_3dPoint p = data->brep->m_V[*s_it].Point();
-               corner_pnts.Append(&(data->brep->m_V[*s_it]));
-               double d = set1_c.Plane().DistanceTo(p);
-               if (d > offset) offset = d;
+           ON_Plane b_plane = set1_c.Plane();
+           ON_Plane t_plane = set2_c.Plane();
+           if (subbrep_top_bottom_pnts(data, &corner_verts, &t_plane, 
&b_plane, &top_pnts, &bottom_pnts)) {
+               std::cout << "Point top/bottom sorting failed\n";
+               return 0;
            }
-           for (int p = 0; p < corner_pnts.Count(); p++) {
-               double poffset = 
set1_c.Plane().DistanceTo(corner_pnts[p]->Point());
-               if (!NEAR_ZERO(poffset - offset, 0.01) && poffset < offset) {
-                   bottom_pnts.Append(corner_pnts[p]);
-               } else {
-                   top_pnts.Append(corner_pnts[p]);
-               }
-           }
 
            // Second, select a point from an arc edge not on the subtraction
            // plane, construct a vector from the circle center to that point,

Modified: brlcad/trunk/src/libbrep/shape_recognition_util.cpp
===================================================================
--- brlcad/trunk/src/libbrep/shape_recognition_util.cpp 2015-03-09 19:53:54 UTC 
(rev 64352)
+++ brlcad/trunk/src/libbrep/shape_recognition_util.cpp 2015-03-09 21:29:01 UTC 
(rev 64353)
@@ -575,6 +575,43 @@
     return verts_cnt;
 }
 
+/* Return 1 if determination fails, else return 0 and top_pnts and bottom_pnts 
*/
+int
+subbrep_top_bottom_pnts(struct subbrep_object_data *data, std::set<int> 
*corner_verts, ON_Plane *top_plane, ON_Plane *bottom_plane, 
ON_SimpleArray<const ON_BrepVertex *> *top_pnts, ON_SimpleArray<const 
ON_BrepVertex *> *bottom_pnts)
+{
+    double offset = 0.0;
+    double pdist = INT_MAX;
+    ON_SimpleArray<const ON_BrepVertex *> corner_pnts(4);
+    std::set<int>::iterator s_it;
+    /* Get a sense of how far off the planes the vertices are, and how
+     * far it is from one plane to the other */
+    for (s_it = corner_verts->begin(); s_it != corner_verts->end(); s_it++) {
+       ON_3dPoint p = data->brep->m_V[*s_it].Point();
+       corner_pnts.Append(&(data->brep->m_V[*s_it]));
+       double d1 = fabs(bottom_plane->DistanceTo(p));
+       double d2 = fabs(top_plane->DistanceTo(p));
+       double d = (d1 > d2) ? d2 : d1;
+       if (d > offset) offset = d;
+       double dp = (d1 > d2) ? d1 : d2;
+       if (dp < pdist) pdist = dp;
+    }
+    for (int p = 0; p < corner_pnts.Count(); p++) {
+       double poffset1 = bottom_plane->DistanceTo(corner_pnts[p]->Point());
+       double poffset2 = top_plane->DistanceTo(corner_pnts[p]->Point());
+       int identified = 0;
+       if (NEAR_ZERO(poffset1, 0.01 * pdist + offset)) {
+           bottom_pnts->Append(corner_pnts[p]);
+           identified = 1;
+       }
+       if (NEAR_ZERO(poffset2, 0.01 * pdist + offset)) {
+           top_pnts->Append(corner_pnts[p]);
+           identified = 1;
+       }
+       if (!identified) return 1;
+    }
+    return 0;
+}
+
 // Local Variables:
 // tab-width: 8
 // mode: C++

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to