[brlcad-commits] SF.net SVN: brlcad:[55823] brlcad/trunk/src/libbrep
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <sta...@us...> - 2013-06-24 16:16:36
|
Revision: 55823 http://sourceforge.net/p/brlcad/code/55823 Author: starseeker Date: 2013-06-24 16:16:32 +0000 (Mon, 24 Jun 2013) Log Message: ----------- Pull the quad surface split out into its own function. Modified Paths: -------------- brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp brlcad/trunk/src/libbrep/libbrep_brep_tools.h brlcad/trunk/src/libbrep/opennurbs_ext.cpp Modified: brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp =================================================================== --- brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp 2013-06-24 15:38:39 UTC (rev 55822) +++ brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp 2013-06-24 16:16:32 UTC (rev 55823) @@ -26,6 +26,7 @@ #include <iostream> #include "opennurbs.h" +#include "bu.h" bool ON_NearZero(double val, double epsilon) { return (val > -epsilon) && (val < epsilon); @@ -259,7 +260,66 @@ return split; } +bool ON_Surface_Quad_Split( + const ON_Surface *surf, + const ON_Interval& u, + const ON_Interval& v, + double upt, + double vpt, + ON_Surface **q0, + ON_Surface **q1, + ON_Surface **q2, + ON_Surface **q3) +{ + bool split_success = true; + ON_Surface *north = NULL; + ON_Surface *south = NULL; + // upt and vpt must be within their respective domains + if (!u.Includes(upt, true) || !v.Includes(vpt, true)) return false; + + // All four output surfaces should be NULL - the point of this function is to create them + if ((*q0) || (*q1) || (*q2) || (*q3)) { + bu_log("ON_Surface_Quad_Split was supplied non-NULL surfaces as output targets: q0: %p, q1: %p, q2: %p, q3: %p\n", (*q0), (*q1), (*q2), (*q3)); + return false; + } + + // First, get the north and south pieces + split_success = surf->Split(1, vpt, south, north); + if (!split_success || !south || !north) { + delete south; + delete north; + return false; + } + + // Split the south pieces to get q0 and q1 + split_success = south->Split(0, upt, (*q0), (*q1)); + if (!split_success || !(*q0) || !(*q1)) { + delete south; + delete north; + if (*q0) delete (*q0); + if (*q1) delete (*q1); + return false; + } + + // Split the north pieces to get q2 and q3 + split_success = north->Split(0, upt, (*q3), (*q2)); + if (!split_success || !(*q3) || !(*q2)) { + delete south; + delete north; + if (*q0) delete (*q0); + if (*q1) delete (*q1); + if (*q2) delete (*q2); + if (*q3) delete (*q3); + return false; + } + + delete south; + delete north; + + return true; +} + // Local Variables: // tab-width: 8 // mode: C++ Modified: brlcad/trunk/src/libbrep/libbrep_brep_tools.h =================================================================== --- brlcad/trunk/src/libbrep/libbrep_brep_tools.h 2013-06-24 15:38:39 UTC (rev 55822) +++ brlcad/trunk/src/libbrep/libbrep_brep_tools.h 2013-06-24 16:16:32 UTC (rev 55823) @@ -213,6 +213,59 @@ ON_Surface **result ); +/** + \brief Create four sub-surfaces from a parent surface + + Create four NURBS surfaces that corresponds to subsets + of an input surface, as defined by UV intervals and a + point within the U and V intervals. + + \verbatim + *---------------------* + | | | + | q3 | q2 | + | | | + V |----------+----------| + | | | + | q0 | q1 | + | | | + *---------------------* + U + + + is the point (upt, vpt) that defines the quads + * points represent the mins and maxes of the U and V domains + + \endverbatim + + + @param srf parent ON_Surface + @param u U interval of parent surface + @param v V interval of parent surface + @param upt U interval point for quad definition + @param upt U interval point for quad definition + @param q0 surface calculated by split algorithm + @param q1 surface calculated by split algorithm + @param q2 surface calculated by split algorithm + @param q3 surface calculated by split algorithm + + @return @c true if surfaces are successfully created, @c false if one or more split + operations failed, the q* containers are not NULL, or the upt,vpt coordinates are + not contained within the UV interval. +*/ +NURBS_EXPORT +bool ON_Surface_Quad_Split( + const ON_Surface *srf, + const ON_Interval& u, + const ON_Interval& v, + double upt, + double vpt, + ON_Surface **q0, + ON_Surface **q1, + ON_Surface **q2, + ON_Surface **q3 + ); + + #endif /* __LIBBREP_BREP_TOOLS */ /** @} */ Modified: brlcad/trunk/src/libbrep/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/libbrep/opennurbs_ext.cpp 2013-06-24 15:38:39 UTC (rev 55822) +++ brlcad/trunk/src/libbrep/opennurbs_ext.cpp 2013-06-24 16:16:32 UTC (rev 55823) @@ -1013,63 +1013,24 @@ ON_Interval secondu(usplit, u.Max()); ON_Interval firstv(v.Min(), vsplit); ON_Interval secondv(vsplit, v.Max()); + ON_BoundingBox box = localsurf->BoundingBox(); - ON_Surface *north = NULL; - ON_Surface *south = NULL; ON_Surface *q2surf = NULL; ON_Surface *q3surf = NULL; ON_Surface *q1surf = NULL; ON_Surface *q0surf = NULL; - ON_BoundingBox box = localsurf->BoundingBox(); + bool split = ON_Surface_Quad_Split(localsurf, u, v, usplit, vsplit, &q0surf, &q1surf, &q2surf, &q3surf); - int dir = 1; - bool split = localsurf->Split(dir, localsurf->Domain(dir).Mid(), south, north); - /* FIXME: this needs to be handled more gracefully */ - if (!split || !south || !north) { - bu_log("DEBUG: Split failure (split:%d, surf1:%p, surf2:%p)\n", split, (void *)south, (void *)north); + if (!split) { delete parent; return NULL; } - - split = localsurf->Split(dir, vsplit, south, north); - - /* FIXME: this needs to be handled more gracefully */ - if (!split || !south || !north) { - bu_log("DEBUG: Split failure (split:%d, surf1:%p, surf2:%p)\n", split, (void *)south, (void *)north); - delete parent; - return NULL; - } - - south->ClearBoundingBox(); - north->ClearBoundingBox(); - - dir = 0; - split = south->Split(dir, usplit, q0surf, q1surf); - - /* FIXME: this needs to be handled more gracefully */ - if (!split || !q0surf || !q1surf) { - bu_log("DEBUG: Split failure (split:%d, surf1:%p, surf2:%p)\n", split, (void *)q0surf, (void *)q1surf); - delete parent; - return NULL; - } - - delete south; q0surf->ClearBoundingBox(); q1surf->ClearBoundingBox(); - split = north->Split(dir, usplit, q3surf, q2surf); - - /* FIXME: this needs to be handled more gracefully */ - if (!split || !q3surf || !q2surf) { - bu_log("DEBUG: Split failure (split:%d, surf1:%p, surf2:%p)\n", split, (void *)q3surf, (void *)q2surf); - delete parent; - return NULL; - } - - delete north; + q2surf->ClearBoundingBox(); q3surf->ClearBoundingBox(); - q2surf->ClearBoundingBox(); /********************************************************************* * In order to avoid fairly expensive re-calculation of 3d points at This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |