Skip to main content

graphics3d - Strange behavior of `BoundaryMeshRegion`


BoundaryMeshRegion is new function of version 10. I am not familiar with the function. I want to decide whether a point is inside or outside in the Boundary using RegionMember. This code is not able to work. why is it?


BoundaryMeshRegion[{{4, 4, 4}, {4, 4, 6}, {4, 6, 4}, {4, 6, 6}, {6, 4,
4}, {6, 4, 6}, {6, 6, 4}, {6, 6, 6}},
Polygon[{{2, 3, 1}, {6, 8, 7}, {2, 5, 6}, {1, 7, 5}, {4, 7, 8}, {2,
6, 4}, {2, 3, 4}, {6, 5, 7}, {1, 2, 5}, {1, 3, 7}, {3, 4, 7}, {8,
4, 6}}]]



BoundaryMeshRegion[{{4, 4, 4}, {4, 4, 6}, {4, 6, 4}, {4, 6, 6}, {6, 4, 4}, {6, 4, 6}, {6, 6, 4}, {6, 6, 6}}, Polygon[{{2, 3, 1}, {6, 8, 7}, {2, 5, 6}, {1, 7, 5}, {4, 7, 8}, {2, 6, 4}, {2, 3, 4}, {6, 5, 7}, {1, 2, 5}, {1, 3, 7}, {3, 4, 7}, {8, 4, 6}}]]



But this is able to work. What is different.


BoundaryMeshRegion[{{4, 4, 4}, {4, 4, 6}, {4, 6, 4}, {4, 6, 6}, {6, 4,
4}, {6, 4, 6}, {6, 6, 4}, {6, 6, 6}},
Polygon[{(*{2,3,1},{6,8,
7},*){2, 5, 6}, {1, 7, 5}, {4, 7, 8}, {2, 6, 4}, {2, 3, 4}, {6, 5,
7}, {1, 2, 5}, {1, 3, 7}, {3, 4, 7}, {8, 4, 6}}]]



Blockquote



Are these bugs too?


Case 1


Graphics3D[{Opacity[0.5], tmp, Opacity[1], Red, PointSize[0.05], 
Point[{2, 0, 0}]}, Boxed -> False]


Blockquote




tmp = RevolutionPlot3D[{2 + Cos[t], Sin[t]}, {t, 0, 2 Pi},
PlotPoints -> 2]; tmp =
GraphicsComplex[tmp[[1, 1]], tmp[[1, 2, 1, 1, 5, 1]]];
r1 = BoundaryDiscretizeGraphics@tmp


Blockquote



RegionQ[r1]



True



RegionMember[r1, {2, 0, 0}]


False



Case 2


BoundaryDiscretizeGraphics[

GraphicsComplex[{{4, 4, 4}, {4, 4, 6}, {4, 6, 4}, {4, 6, 6}, {6, 4,
4}, {6, 4, 6}, {6, 6, 4}, {6, 6, 6}},
Polygon[{(*{2,3,1},{6,8,
7},*){2, 5, 6}, {1, 7, 5}, {4, 7, 8}, {2, 6, 4}, {2, 3, 4}, {6, 5,
7}, {1, 2, 5}, {1, 3, 7}, {3, 4, 7}, {8, 4, 6}}]]]


Blockquote




Answer




This is a bug, I think, and I filed it as such: The second region should not evaluate to a RegionQ BoundaryMeshRegion. A BoundaryMeshRegion is valid if it contains a closed surface. The subtle point about BoundaryMeshRegion is that this closed surface is a (sparse) representation of the entire region the surface encloses. Why the first one does not work, I must admit, I do not know. At least it's not obvious to me.


You can use:


bmr = BoundaryMeshRegion[{{4, 4, 4}, {4, 4, 6}, {4, 6, 6}, {4, 6, 
4}, {6, 4, 4}, {6, 4, 6}, {6, 6, 6}, {6, 6, 4}},
Polygon[{{1, 2, 3, 4}, {1, 2, 6, 5}, {2, 3, 7, 6}, {3, 4, 8,
7}, {4, 1, 5, 8}, {5, 6, 7, 8}}]];
rmf = RegionMember[bmr]

To generate the RegionMemberFunction. I just perturbed the coordinates a bit. You could try to replace the quadrilaterals with triangles and see if that works.


Comments