nmwsharp / geometry-central

Applied 3D geometry in C++, with a focus on surface meshes.
https://geometry-central.net
MIT License
1.1k stars 150 forks source link

Question: Per Element Indices #194

Open afabri opened 1 month ago

afabri commented 1 month ago

On the page on Elements you write "The routines in this section are valid only when the mesh is compressed"

I guess you mean that the indices are no longer a contiguous sequence. So if I have a large enough std::vector V can I still use the index of a vertex for storing something in V?

Which leads me to the next question: Do you offer a function to get the largest index of vertices, regardless of being marked as removed or not.

nmwsharp commented 1 month ago

Yes exactly! (And this is how the container types like VertexData<> are implemented under the hood, lazily resizing only occasionally as a mesh is updated).

Do you offer a function to get the largest index of vertices, regardless of being marked as removed or not.

There are these functions, which give an upper bound: https://github.com/nmwsharp/geometry-central/blob/master/include/geometrycentral/surface/surface_mesh.h#L203-L209 (they are used to set the size of the VertexData<> etc containers). The increase in powers-of-2, so they might be a bit larger than the largest index.

I believe the actual largest index comes from these internal members https://github.com/nmwsharp/geometry-central/blob/master/include/geometrycentral/surface/surface_mesh.h#L306-L323 . I don't believe there are any public-facing functions to access these, but I suppose it could be reasonable to expose them since we expose the raw element indices already. Let me know if that would be useful to you!

afabri commented 1 month ago

I am interested in a function of SurfaceMesh that returns vHalfedgeArr.size(). And the same for the other elements. Concerning the doubling, that is the capacity, not the size, right? I mean, in your code, you call reserve() and not resize() to allocate more memory for vertices.

afabri commented 1 month ago

It corresponds also to MeshDate<>::size(),

nmwsharp commented 1 month ago

I created a PR here that exposes these functions, let me know if I missed anything! https://github.com/nmwsharp/geometry-central/pull/196

nmwsharp commented 1 month ago

And regarding the reserve/resize, I believe it is a resize? Here, right? https://github.com/nmwsharp/geometry-central/blob/master/src/surface/surface_mesh.cpp#L1609

(I haven't thought much about this implementation in the last couple years, so I am paging it back into memory)

afabri commented 1 month ago

A resize() makes that size() then returns that value. With reserve() the size changes when later you call push_back().

nmwsharp commented 1 month ago

I'm familiar with the difference, I was just responding to this comment

in your code, you call reserve() and not resize()

pointing out that at least in the linked location, it is indeed a resize() :smiley: But maybe you were referring to somewhere else.

And FYI I have merged that PR above exposing the max-index getters for SurfaceMesh. Note that for corners they behave slightly differently than might be expected, I also added a note about the differences with corner indexing to the docs.