ConvexHull Manual

About

The maxon::ConvexHullInterface allows to compute a convex polygon hull that encapsulates a given set of points in 3D space.

ConvexHullInterface

The maxon::ConvexHullInterface class provides only one function that can either accept a maxon::ConvexHullData argument or several arrays:

The maxon::ConvexHullData structure contains these members:

// This example creates a convex polygon hull around the given array of points.
// The created polygon data is copied to a PolygonObject.
// create ConvexHullRef
const maxon::ConvexHullRef convexHull = maxon::ConvexHullRef::Create() iferr_return;
// compute convex hull from the given array of points
maxon::ConvexHullData hullData;
const maxon::Float res = convexHull.ComputeConvexHull(points, 0.0, 0.0, hullData) iferr_return;
if (res < 0)
return maxon::OK;
// create the PolygonObject
const Int32 polyCount = (Int32)hullData.faces.GetCount();
const Int32 vertexCount = (Int32)hullData.vertices.GetCount();
PolygonObject* const polyObject = PolygonObject::Alloc(vertexCount, polyCount);
if (polyObject == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
// set polygons
CPolygon* const polygons = polyObject->GetPolygonW();
Int32 polyCounter = 0;
const maxon::ConvEdge* lastEdge;
// loop over all faces
for (Int32 faceIndex = 0; faceIndex < polyCount; faceIndex++)
{
const maxon::ConvEdge* currentEdge = &hullData.edges[hullData.faces[faceIndex]];
lastEdge = currentEdge;
const Int firstPoint = lastEdge->_start;
// loop over all edges
for (currentEdge = &hullData.edges[lastEdge->_nextEdgeOfFace];
&hullData.edges[currentEdge->_nextEdgeOfFace] != &hullData.edges[hullData.faces[faceIndex]];
currentEdge = &hullData.edges[currentEdge->_nextEdgeOfFace])
{
polygons[polyCounter] = CPolygon((Int32)firstPoint, (Int32)currentEdge->_start, (Int32)currentEdge->_end);
polyCounter++;
lastEdge = currentEdge;
}
}
// set point positions
Vector* const polyPoints = polyObject->GetPointW();
for (Int32 pointIndex = 0; pointIndex < vertexCount; pointIndex++)
polyPoints[pointIndex] = hullData.vertices[pointIndex];
// insert polygon object into the scene
polyObject->Message(MSG_UPDATE);
doc->InsertObject(polyObject, nullptr, nullptr);
Definition: c4d_baseobject.h:1631
Py_UCS4 * res
Definition: unicodeobject.h:1113
for(i=0;i< length;i++)
Definition: unicodeobject.h:61
OK
Ok.
Definition: ge_prepass.h:0
maxon::Int32 Int32
Definition: ge_sys_math.h:60
maxon::Float Float
Definition: ge_sys_math.h:66
maxon::Int Int
Definition: ge_sys_math.h:64
static auto Create(ARGS &&... args)
Definition: apibase.h:2773
#define MSG_UPDATE
Must be sent if the bounding box has to be recalculated. (Otherwise use MSG_CHANGE....
Definition: c4d_baselist.h:358
Int GetCount(const ITERABLE &iterable)
Definition: collection.h:37
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:67
The maxon namespace contains all declarations of the MAXON API.
Definition: autoweight.h:14
const char * doc
Definition: pyerrors.h:226
#define iferr_return
Definition: resultbase.h:1519
Represents a polygon that can be either a triangle or a quadrangle.
Definition: c4d_baseobject.h:44
Definition: convexhull.h:15
Int _nextEdgeOfFace
Definition: convexhull.h:21
Int _end
Definition: convexhull.h:20
Int _start
Definition: convexhull.h:19

Further Reading