How to test for congruent surfaces?

I have a single parent surface with n multisurface children that we can assume were created manually in rhino with a boolean from the parent, meaning they have a subsurface that’s congruent with the parent.

How do I test to find out which surfaces in the children are the surfaces that are congruent with the parent?

I want this to be flexible without too many restrictions on the geometry of the children, meaning I don’t want to manually go through the list of child surfaces to find the offending surface… I need some way to check each child surface against the parent OR some other logic that achieves the same result.

The goal is to get an exposed surface area output of the combined assembly of parent and children. Or in other words, total surface area less 2x the childrens congruent faces area.

I can’t just manually delete or not include the congruent faces because I need individual volumes of the parent and children.


If the children are in contact with the parent, as in the upper set, you could get the world coordinates of a point on a child surface and see if that point is also on the parent surface. If they are detached then life gets hard…


Given any collection of items (Closed curves [real time], Breps [slow] or Meshes [faster]) this is a classic CCX clustering task in 2 phases:

  1. Phase one: the classic part … get the clusters based on ccx events. The output is connectivity trees (indices of related items sampled in a given cluster branch). Obviously if the items are strictly spheres then you test center to center distance instead of CCX (about 100+ times faster).
  2. Phase two: use a double loop and further elaborate on the items per cluster provited that there’s some explicit rule around (say: if 2 yield a ccx then difference the bigger from the smaller etc etc [or use some other rule]).The output would be a 2 dimension connectivity tree where the first dimension is the cluster in question and the second the index of the parent item (branch items are the portions [as defined by the rule] of the items involved ).

Notify if you want a C# solution on that.

Appreciate the replies. I am thinking now I should try a simpler hacky way using something like normal direction. Make some assumptions that the incongruent surfaces will be pointing away from the parent and the shared face will be pointing towards.

The approach that I described is very simple (but only if you are familiar with coding).

Given the opportunity here’s some visual clues:

With a random (jittered) order collection of objects this is what we call flat hard clustering (Rule used: Ccx events). The clusters Tree samples the indices of the items making the cluster islands. The ccx tree tells you what interacts (according the Rule) with what. The ccx is made at the clustering Method saving several milliseconds (never ask the same question twice).

Given a List of Breps … the {0;0} in the ccx tree means cluster 0 and item with index 0 (the red one) that interacts (according the Rule) with items with indices 30, 56 (the yellows). Item 30 interacts with 0 and item 56 interacts with 0 as well. So the ccx must be a 2 dimension connectivity tree.

Using a Difference all from all Rule (in Phase 2) this is what you get on a per cluster and object basis (obviously one can use any other rule):

Inside some other cluster:

NOTE: R is a surface modeler meaning that is pathetic with regard elapsed time in any opp related with “solids”. A thread safe // approach can better things up to a point.