Open Search
    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