Zulip Chat Archive

Stream: sphere eversion

Topic: polyhedral sphere eversion


Mario Carneiro (Apr 30 2022 at 05:46):

Mario Carneiro said:

My understanding is that a fully computable version was considered "too trivial" / uninteresting and was rejected early on. Surely it is possible to just compute a concrete, say, piecewise linear eversion of an icosahedron or perhaps an even smaller triangulated mesh, and prove that no edges are inverted in the process. I would be interested to know how few vertices you can get away with here

I looked into this and found another nice video different from the one people usually link to: https://www.youtube.com/watch?v=cdMLLmlS4Dc Polyhedral eversion is mentioned briefly at 5:54

Mario Carneiro (Apr 30 2022 at 05:47):

Apparently the cuboctahedron (I think it is actually an icosahedron in the animation since it is triangulated and does not have flat quads) is the smallest polyhedron that can be everted. http://new.math.uiuc.edu/glsimEck/qbo5.html has an interactible JS animation of everting the cuboctahedron

Mario Carneiro (Apr 30 2022 at 06:02):

Here's a paper about it (in French) https://mathinfo.unistra.fr/websites/math-info/irem/Publications/L_Ouvert/n095/o_95_15-36.pdf

Mario Carneiro (Apr 30 2022 at 09:34):

I managed to get the whole animation down to a piecewise linear animation of the 12 vertices with only one intermediate step and all coordinates quantized to 2,1,0,1,2-2,-1,0,1,2 except for one 1/21/2. Here checkNondegenerate checks that none of the faces fold over each other or become singular. The shape at t = 1 is the cuboctahedron, and at t = 0 it is the midpoint shape, which has the property that rotating by 90 degrees turns it inside out. The animation patches this up with a rotation and then the reverse animation to get the full eversion.

faces = {
  {1, 2, 3}, {1, 4, 2}, {5, 6, 2}, {6, 7, 3}, {7, 8, 1},
  {8, 5, 4}, {1, 8, 4}, {2, 6, 3}, {1, 3, 7}, {2, 4, 5},
  {9, 8, 10}, {9, 11, 5}, {9, 12, 11}, {9, 10, 12}, {8, 9, 5},
  {5, 11, 6}, {6, 12, 7}, {7, 10, 8}, {12, 10, 7}, {12, 6, 11}};
points = {
  {0, {
    {2, 2, -1}, {-2, -2, -1}, {1, -2, 1}, {-1, 2, 1}, {1, -1, 1}, {-1, -1, 1},
    {-1, 1, 1}, {1, 1, 1}, {2, -2, -1}, {-2, -1, 1}, {2, 1, 1}, {-2, 2, -1}}},
  {1/2, {
    {1/2, 0, 0}, {-1/2, 0, 0}, {-1, -1, 0}, {1, 1, 0}, {1, 1, 1}, {-1, 0, 0},
    {-1, -1, 1}, {1, 0, 0}, {2, -2, -1}, {-2, -2, 1}, {2, 2, 1}, {-2, 2, -1}}},
  {1, {
    {-1, -1, 1}, {1, 1, 1}, {-1, 1, 1}, {1, -1, 1}, {2, 0, 0}, {0, 2, 0},
    {-2, 0, 0}, {0, -2, 0}, {1, -1, -1}, {-1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}}}
edges = (e |-> {e,
      Select[Complement[#, e] & /@ faces, Length@# == 1 &][[All,
        1]]}) /@ Union[Sort /@ Flatten[Subsets[#, {2}] & /@ faces, 1]];
ipoints =
  Table[Interpolation[
    Transpose[{points[[All, 1]], points[[All, 2, i, j]]}],
    InterpolationOrder -> 1], {i, 12}, {j, 3}];
vpoint[a_, t_] := Table[ipoints[[a, j]][t], {j, 3}]
getMat[t_, {{a_, b_}, {c_, d_}}] :=
 With[{v1 = vpoint[a, t], v2 = vpoint[b, t], v3 = vpoint[c, t],
   v4 = vpoint[d, t]},
  {v2 - v1, v3 - v1, v4 - v1}]
checkNondegenerate[t0_, t1_, e_] :=
 With[{m =
    Table[InterpolatingPolynomial[{{t0, getMat[t0, e][[i, j]]}, {t1,
        getMat[t1, e][[i, j]]}}, t], {i, 3}, {j, 3}]},
  Reduce[((Det@m == 0 &&
        Dot[Cross[Cross[m[[1]], m[[2]]], m[[1]]], m[[3]]] >= 0) ||
      Cross[m[[1]], m[[2]]] == {0, 0, 0} ||
      Cross[m[[1]], m[[3]]] == {0, 0, 0}) && t0 <= t <= t1, t]]
AllTrue[edges, ! (checkNondegenerate[0, 1/2, #] || checkNondegenerate[1/2, 1, #]) &]
Manipulate[
 Graphics3D[{Opacity[0.5],
   Polyhedron[
    Table[If[t >= 0, Table[ipoints[[i, j]][t], {j, 3}],
      RotationMatrix[\[Pi]/2, {0, 0, 1}] .
       Table[ipoints[[i, j]][-t], {j, 3}]], {i, 12}], faces]},
  Axes -> True, PlotRange -> {{-2, 2}, {-2, 2}, {-1, 1}},
  BoxRatios -> {1, 1, 1/Sqrt[2]}], {{t, 0}, -1, 1}]

Mario Carneiro (Apr 30 2022 at 09:34):

eversion.gif


Last updated: Dec 20 2023 at 11:08 UTC