Plankton

Plankton is a free and open library implementing the half-edge data structure for polygon meshes.

This way of storing the mesh connectivity information allows easier adjacency queries and supports mesh faces with any number of sides (Ngons), not just quads and triangles.

The plankton library is intended primarily to be referenced and used from scripts, but  basic GH components for conversion and topology extraction are provided, and more may be added at a future date.

Plankton is still very much a work in progress. This is a first release, and methods/features will change in future versions.

Currently most of the methods relate to extracting topology information from existing meshes, and converting between Rhino meshes and Plankton meshes, but the intent is to over time add more ways of actually modifying and building meshes.

Please share your thoughts and ideas in the forum...

download the latest release here:

https://github.com/meshmash/Plankton/releases/latest

This library is distributed under the terms of the GNU Lesser General Public License (LGPL).

(The source is available on GitHub here)

Copyright 2013 Daniel Piker and Will Pearson

For more on half-edges, see:

http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml

http://openmesh.org/Documentation/OpenMesh-2.0-Documentation/mesh_hds.html

http://www.graphics.rwth-aachen.de/media/papers/directed.pdf

Thanks to the people I have had many conversations about meshes with over the last few years that have really helped inspire and inform this work: including: Daniel Hambleton, John Harding, Kristoffer Josefsson, Harri Lewis, Giulio Piacentino, and especially Dave Stasiuk, who also shared code that helped get this working.

Internal data structure

Plankton 0.4.2. If I take any simple mesh object generated in grasshopper and convert it with the PMesh module, then try running the following python code, I get:


for v in range(pm.Vertices.Count):
    print (v, pm.Halfedges[pm.Vertices[v].OutgoingHalfedge].StartVertex)

(0, 0)
(1, 1)
(2, 2)
(3, 3)
(4, 4)

... etc

My understanding of the halfedge structure is that a vertex points to a halfedge, which points its other vertex (image linked). It seems these halfedges are pointing back to the vertices referencing them. What am I missing?

  • up

    Will Pearson

    Hi Cory, you're correct – in Plankton, for any given halfedge the StartVertex property gives the index of the vertex from which the halfedge originates. I don't recall the reasoning behind this decision, unfortunately. To traverse from one vertex to another, you can use pm.Halfedges(int).GetPairHalfedge(int) to get the halfedge pair and, subsequently, it's StartVertex. Of course you have no control over which outgoing halfedge is referenced by each vertex... In case it's useful, I made a web page a few years ago to describe the Plankton data structure: https://www.pearswj.co.uk/halfedge/

    4