列出四面体的所有有趣部分

时间:2010-09-20 05:42:08

标签: algorithm wolfram-mathematica geometry

答复更新,12/22 : 使用Peter Shor的observation,在立方体的不同部分和对象的排列之间存在同态,通过将一组立方体对称性表示为SymmetricGroup [8]的子组并使用GroupElements / Permute,找到质心来列出所有这些排列,找到质心使用Mathematica的SAT求解器进行赋值,选择具有不同奇异值的点集,更少的细节和给出的完整代码here

问题

一个有趣的2D剖面是一个穿过常规3D simplex中心的平面和另外两个点,每个点都是一些非空顶点子集的质心。它由两个顶点子集定义。例如{{1},{1,2}}给出一个由3个点定义的平面 - 四面体的中心,第一个顶点,以及第一个和第二个顶点的平均值。

一组有趣的部分是一个集合,其中没有两个部分在顶点重新标记下定义相同的平面。例如,设置{{{1},{2}},{{3},{4}}}并不有趣。有没有一种有效的方法来找到一组有趣的部分?我需要的东西可以推广到7D单形3D截面的类似问题,并在一夜之间完成。

我的尝试方法如下。一个问题是,如果你忽略几何,一些等效的部分将被保留,所以我得到10个部分而不是3.更大的问题是我使用蛮力并且它肯定不会扩展和(需要10 ^ 17比较7D单纯形

http://yaroslavvb.com/upload/simplex-sections.png

以下是生成上述图片的Mathematica代码。

entropy[vec_] := Total[Table[p Log[p], {p, vec}]];
hadamard = KroneckerProduct @@ Table[{{1, 1}, {1, -1}}, {2}];
(* rows of hadamard matrix give simplex vertex coordinates *)

vertices = hadamard;
invHad = Inverse[hadamard];
m = {m1, m2, m3, m4};
vs = Range[4];

(* take a set of vertex averages, generate all combinations arising \
from labeling of vertices *)
vertexPermutations[set_] := (
   newSets = set /. Thread[vs -> #] & /@ Permutations[vs];
   Map[Sort, newSets, {2}]
   );
(* anchors used to define a section plane *)

sectionAnchors = Subsets[{1, 2, 3, 4}, {1, 3}];
(* all sets of anchor combinations with centroid anchor always \
included *)
anchorSets = Subsets[sectionAnchors, {2}];
anchorSets = Prepend[#, {1, 2, 3, 4}] & /@ anchorSets;
anchorSets = Map[Sort, anchorSets, {2}];
setEquivalent[set1_, set2_] := MemberQ[vertexPermutations[set1], set2];
equivalenceMatrix = 
  Table[Boole[setEquivalent[set1, set2]], {set1, anchorSets}, {set2, 
    anchorSets}];
Needs["GraphUtilities`"];
(* Representatives of "vertex-relabeling" equivalence classes of \
ancher sets *)
reps = First /@ StrongComponents[equivalenceMatrix];

average[verts_] := Total[vertices[[#]] & /@ verts]/Length[verts];
makeSection2D[vars_, {p0_, p1_, p2_}] := Module[{},
   v1 = p1 - p0 // Normalize;
   v2 = p2 - p0;
   v2 = v2 - (v1.v2) v1 // Normalize;
   Thread[vars -> (p0 + v1 x + v2 y)]
   ];

plotSection2D[f_, pointset_] := (
   simplex = 
    Graphics3D[{Yellow, Opacity[.2], 
      GraphicsComplex[Transpose@Rest@hadamard, 
       Polygon[Subsets[{1, 2, 3, 4}, {3}]]]}];
   anchors = average /@ pointset;
   section = makeSection2D[m, anchors];
   rf = Function @@ ({{x, y, z, u, v}, 
       And @@ Thread[invHad.{1, x, y, z} > 0]});
   mf = Function @@ {{p1, p2, p3, x, y}, f[invHad.m /. section]};
   sectionPlot = 
    ParametricPlot3D @@ {Rest[m] /. section, {x, -3, 3}, {y, -3, 3}, 
      RegionFunction -> rf, MeshFunctions -> {mf}};
   anchorPlot = Graphics3D[Sphere[Rest[#], .05] & /@ anchors];
   Show[simplex, sectionPlot, anchorPlot]
   );
plots = Table[
   plotSection2D[entropy, anchorSets[[rep]]], {rep, reps}];
GraphicsGrid[Partition[plots, 3]]

1 个答案:

答案 0 :(得分:4)

正确的编程解决方案是:

  • 观察中心是否采用投射对 - 因此识别并仅保留在该组中心的一个或另一个半球形覆盖物中的一半中心。对是相互补充的。一个示例规则:所有包含顶点1的子集和包含顶点2的子集,包含顶点2的子集,以及包含顶点3的那些子集,依次递归保持边界一半与最小索引相邻顶点。
  • 观察对于每个子复形,子复形与顶点1相邻或距离单一距离1。 (原因:四面体中的每个新顶点都附加到四面体的每个先前顶点 - 因此每个子复形都要么入射到顶点1,要么顶点1连接到单纯形中的每个顶点。)因此每个顶点只有两个一种subsimplex(相对于指定的顶点)。 (我们可以用决定只保留每个投影对的较小成员来替换这个观察,但是标记顶点的规则更复杂。)
  • 在顶点标签的排列下,四面体是完全对称的。因此,任何“有趣的部分”等同于仅包含顶点的前导部分的另一部分 - 即可以在某些n的顶点Range [1,n]中识别。

  • 收集上述内容后,我们发现从一个有趣的部分到一组图表有一个偏见。对于每个图,我们必须枚举一致的顶点成员资格(稍后描述)。除了一个顶点,图的顶点成对出现

    • 该对包含给定基数的所有中心(给定维度的所有子单元)。
    • 该对中的一个成员包含入射在顶点1上的中心。
    • 该对中的另一个成员包含未在顶点1上发生入射的中心。
    • 特殊顶点是包含所有顶点的中心或其投影对(“空心”)。
    • 如果图形包含一对中的任何成员,则它必须(至少)包含包含1个中心的成员(或者可以重新标记顶点以实现此目的)。
  • 图表的边缘是加权的。权重是两个中心共享的顶点数。基于每个端部的中心的基数并且基于两个顶点是第一个成员,第二个成员还是每个顶点之一,对权重有限制。 (例如,“其中一个”不能共享顶点1。)
  • 图形是顶点集上的完整子图,包含特殊顶点。例如,对于四面体,图形是上面标识的顶点集合上的K_ {3},其中一个顶点是特殊顶点并且具有边缘权重。
  • 剖面图是在每条边的末端将标签一致地应用到中心的图(即,一致地标记为尊重由边的权重指示的共享顶点的数量,并且一组图顶点中的每个子集包含顶点1)。因此,给定图表可以表示多个部分(通过不同的标签)。 (没有那么多的选择,就好像它会在一秒钟内有意义。)
  • 如果由其中心坐标构成的矩阵具有零行列式,则该部分不感兴趣。

在三维的情况下,有四个顶点,我们得到以下几组(我们使用短投影对,因为在这个例子中有足够的可见性,不需要更简单的顶点标签拒绝规则):
0:{1,2,3,4}的投射对 1:{1}
1':{2},{3},{4}
2:{1,2},{1,3},{1,4}
2':投射对2(如此省略)
3:投射对1'(如此省略)
3':投影对为1(如此省略)

标签限制:
{0→X,X}
{0→X”,X}
{1-> 1,1} - 不允许:中心不包括两次 {1→1' ,0}
{1→2,1}
{2→2,1}
这些图顶点不可能有其他权重。

图表是0上的K_ {3}事件,以下图表在图表选择规则中存活:
A:{0-> 1,1},{0-> 1',1},{1-> 1',0}
B:{0-> 2,2},{0-> 2,2},{2-> 2,1}

A只有一个标签:{1},{2},{}并且是您的三角形有趣集合。这个标签没有零决定因素 B只有一个标签:{1,2},{1,3},{}并且是你方形的有趣集合。这个标签没有零决定因素。

转换为代码留给读者一个练习(因为我必须离开工作)。