In[]:=
sortvertices[coords_,normal_,face_]:=With[{proj=DeleteCases[Orthogonalize[Join[{normal},N@IdentityMatrix[3]]],{0.,0.,0.}][[2;;3]]},SortBy[face,ArcTan@@(proj.coords[[#]])&]];
In[]:=
​​iDual[coords_?MatrixQ,faces:{{__Integer}..}]:=With[{nvertices=Max@faces,nfaces=Length@faces},With[{mat=SparseArray@Flatten@Table[{v,f}1,{f,nfaces},{v,faces[[f]]}],dualcoords=Mean[coords[[#]]]&/@faces},With[{dualfaces=mat["AdjacencyLists"]},Graphics3D@GraphicsComplex[dualcoords,Polygon[Table[sortvertices[dualcoords,coords[[v]],dualfaces[[v]]],{v,Length@dualfaces}]]]]]];
In[]:=
​​(*user-levelfunctions*)​​dual[polyhedron:Graphics3D@GraphicsComplex[coords_,Polygon[faces_]]]:=iDual[coords,faces];
In[]:=
dual[polyhedron_?MeshRegionQ/;RegionDimension[polyhedron]2&&RegionEmbeddingDimension[polyhedron]3]:=iDual[MeshCoordinates[polyhedron],MeshCells[polyhedron,2]/.PolygonSequence];
In[]:=
dual[polyhedron_?BoundaryMeshRegionQ/;RegionDimension[polyhedron]3]:=iDual[MeshCoordinates[polyhedron],MeshCells[polyhedron,2]/.PolygonSequence];
In[]:=
dual@DiscretizeRegion[Sphere[],MaxCellMeasure.02]/.GraphicsComplex[pts_,stuff___]GraphicsComplex[(Normalize/@pts).DiagonalMatrix[{1,2,3}],stuff]
Out[]=
In[]:=
BoundaryDiscretizeRegion[Ellipsoid[{0,0,0},{1,2,3}],MaxCellMeasure{"Area"0.03}]
Out[]=
In[]:=
MeshConnectivityGraph[%]
Out[]=
In[]:=
GraphPlot3D[%,GraphLayout"SpringElectricalEmbedding",VertexCoordinatesAutomatic]
Out[]=