非循环图3D Javascript

非循环图3D Javascript,javascript,algorithm,directed-acyclic-graphs,Javascript,Algorithm,Directed Acyclic Graphs,我正在寻找一种JS DAG算法,它可以从中心画出穿过一组堆叠立方体所有点的线,而不必经过同一个立方体两次。想象一个由64个立方体组成的4x4魔方:从中心点开始,在x、y或z方向上一次旋转一个立方体宽度,直到125个角被链接(每个面上有25个角) 我试着在纸上画了很多图表,但是如果不经过两次同样的图表,我就无法达到所有的要点。我不知道这是否可能。我想是的,但是怎么会呢 在由相邻正方形构成的平面图上,你只需从中心开始顺时针旋转,直到所有的角都连接起来,但如何在三维立方体中实现它 我之所以需要这样做

我正在寻找一种JS DAG算法,它可以从中心画出穿过一组堆叠立方体所有点的线,而不必经过同一个立方体两次。想象一个由64个立方体组成的4x4魔方:从中心点开始,在x、y或z方向上一次旋转一个立方体宽度,直到125个角被链接(每个面上有25个角)

我试着在纸上画了很多图表,但是如果不经过两次同样的图表,我就无法达到所有的要点。我不知道这是否可能。我想是的,但是怎么会呢

在由相邻正方形构成的平面图上,你只需从中心开始顺时针旋转,直到所有的角都连接起来,但如何在三维立方体中实现它

我之所以需要这样做,是因为我将对象(每个对象都有自己的ID)排列在一个虚拟立方体中,我需要逐个探索它们,直到达到某个值:计算结果定义了x、y、z的起点,算法在该点周围的3d中运行,以查找该值

另一种可能是从一个外角开始,到达另一个外角,但在这种情况下,我们只朝一个方向走,例如从起点到西北方向

我知道许多DAG算法可以通过最短路径从一个点到另一个点或从一个值到另一个值,但不是以循环3d方式。欢迎任何帮助:-)


编辑:快速而怪异的解决方案,但它有效:

<style>
  body { font: 100%/1.3 Arial; }
  section { width: 160px; margin-left: calc(50% - 80px); }
  div { position: relative; width: 160px; height: 160px; border:1px solid #aaa; margin: 10px 0; transform: skewY(-15deg) rotate(40deg) scaleY(0.7); }
  span { display: inline-block; width: 38px; height: 38px; border:1px solid #ccc; margin: 0; }
  ins { display: block; position: absolute; margin: -5px 0 0 -5px; width: 10px; height: 10px; background-color: #ccc; border-radius: 50%; }
</style>


<button onclick="start()">START</button>
<section id="cubes"></section>
然后按定义的顺序循环

function next(id,num,cycle){ 

    let o = id.split('-')
    let pos_x   = parseInt(o[1]); // 80
    let pos_y   = parseInt(o[2]); // 80
    let pos_z   = parseInt(o[3]); // face 2
    let goto;

    /*  num = how many spots explored on this face?
    *   num is 1 on start because the 1st one (central) is explored
    *   cycle = exploration: 1->around central [• on graph], 2->outer spots [+ on graph]
    *   cycle=1 : num value from 1 to 8 (central+7 •)
    *   cycle=2 : num value from 1 to 16 (16 +)
    */

    // looking for value 0/1
    let val;
    for(i=0; i<120; i++){
        if(ref[i][3] == 1) {
            val = 's-'+ref[i][1]+'-'+ref[i][2]+'-'+ref[i][0]; break;
        }
    }
    // stop when founded
    if(id==val) { $id(id).style.backgroundColor = "red"; }

    else {

    setTimeout(function(){  

        // turning around central spot on same face
        if (cycle == 1) { 
            let matrix = [ [],[1,0],[0,1],[-1,0],[-1,0],[0,-1],[0,-1],[1,0],[1,0] ];    
            if (num <= 8) { 
                goto = 's-'+( pos_x + (matrix[num][0]*40) )+'-'+( pos_y + (matrix[num][1]*40) )+'-'+pos_z;
                num++;
            }
            else { // explore other faces (up and down) 
                if( pos_z == 0 ) { goto = 's-'+80+'-'+80+'-'+4; }
                if( pos_z == 1 ) { cycle = 2; goto = 's-'+160+'-'+160+'-'+2; }      
                if( pos_z == 2 ) { goto = 's-'+80+'-'+80+'-'+3; }
                if( pos_z == 3 ) { goto = 's-'+80+'-'+80+'-'+1; }
                if( pos_z == 4 ) { cycle = 2; goto = 's-'+160+'-'+160+'-'+0; }
                num = 1;
            }
        }   

        // turning around face's outer spots
        else if (cycle == 2) {  
            if (num < 17){
                if (num <= 4) goto = 's-'+( pos_x - 40 )+'-'+pos_y+'-'+pos_z;
                if (num >4 && num <= 8) goto = 's-'+pos_x+'-'+( pos_y - 40 )+'-'+pos_z;
                if (num >8 && num <= 12) goto = 's-'+( pos_x + 40 )+'-'+pos_y+'-'+pos_z;
                if (num >12 && num <= 15) goto = 's-'+pos_x+'-'+( pos_y + 40 )+'-'+pos_z;
                num++;
            }
            if (num == 17){
                if( pos_z == 0 ) { goto = 's-'+160+'-'+160+'-'+4; }
                if( pos_z == 1 ) { cycle = 1; goto = 's-'+80+'-'+80+'-'+0; }
                if( pos_z == 2 ) { goto = 's-'+160+'-'+160+'-'+3; }
                if( pos_z == 3 ) { goto = 's-'+160+'-'+160+'-'+1; }
                num = 1;
            }
        }

        $id(id).style.backgroundColor = "#000";
        if($id(goto)) { 
            $id(goto).style.backgroundColor = "#999";
            next(goto,num,cycle);
        }

    },1); // 500 to quietly see how it works

    }
}
函数下一步(id,num,cycle){
设o=id.split('-')
设pos_x=parseInt(o[1]);//80
设pos_y=parseInt(o[2]);//80
设pos_z=parseInt(o[3]);//面2
让我们去吧;
/*num=此面部已探测到多少斑点?
*num在开始时为1,因为第一个(中心)已被探索
*循环=探索:1->围绕中心点[•在图上],2->外部点[+在图上]
*循环=1:数值从1到8(中央+7•)
*循环=2:数值从1到16(16+)
*/
//正在查找值0/1
让瓦尔;

对于(i=0;i<p>),我们将面视为水平面

。 底部是面0,上面是面4

  x-------x
 / face4 /
x-------x
x
x x-------x
x/ face0 /
x-------x 
我们(通过问题陈述)从立方体的中心开始:面2和面2的中心(C_2)

首先:通过C_2->C_3->C_4转到面4的中心:C_4

然后填充屋顶(逆时针方向)

脸4


|   |   |   |   |
---v------>--->--O_4--
|   |   |   |   |
从O_4到O_3,填充面3。我们在p_3停下来,因为C_3已经被访问过了


   |   |   |   |   |
---v---<---<---<---<---
   |   |   |   |   |
---v---v---<---<---^---
   |   |   |   |   |
---v---v--C_3--^---^---
   |   |   |   |   |
---v--->--P_3--^---^---
   |   |   |   |   |
--->--->--->---^--O_3--
   |   |   |   |   |

|   |   |   |   |
---v---简单:管理8个立方体(4+4)卷。我们总是在中心的1个长度处,转身

     6----5----4
    /         /
   7    2----3
  /     |   /
 8----9----10
        |  \
        |
    14---13----12
    /   |    \ /
  15    1    11
  /         
16---17----18
          \

    22---21----20
    /       \ /
  23    27    19
  /       \  
24---25----26
我现在正在尝试同样的方法来管理4x4x4版本,先以+1长度旋转中心,然后以+2…类似于:

          -------------------------
         /     /     /     /      /     
        -----73----72----71------
       /     /     /     /     / 
      -----74----69----70------
     /     /     /     /     / 
    -----75----76----77------
   /     /     /     /     / 
  -------------------------


          -------------------------
         /     /     /     /     /     
        -----23----22----21------
       /     /     /     /     / 
      -----24----19----20------
     /     /     /     /     / 
    -----25----26----27------
   /     /     /     /     / 
  -------------------------


         35----34----33----32-----31
         /     /     /     /     /     
       36-----5-----4-----3-----30
       /     /     /     /     / 
     37-----6-----1-----2-----29
     /     /     /     /     / 
   38-----7-----8-----9-----28
   /     /     /     /     / 
 39----40----41----42-----43


         52----51----50----49-----48
         /     /     /     /     /     
       53----14----13----12-----47
       /     /     /     /     / 
     54----15----10----11-----46
     /     /     /     /     / 
   55----16----17----18-----45
   /     /     /     /     / 
 56----57----58----59-----44

          -------------------------
         /     /     /     /     /     
        -----64----63----62------
       /     /     /     /     / 
      -----65----60----61------
     /     /     /     /     / 
    -----66----67----68------
   /     /     /     /     / 
  -------------------------

所有顶点都必须被访问,因此只有一次使用CONTAINT,即只有当顶点与当前顶点相邻时才能访问该顶点?…所有顶点都必须被访问:是的,直到我们没有找到预期值。一旦我们得到该值,它就会停止…因此只有一次:是的,如果可能,以避免浪费时间和精力…只有当它相邻时nt到当前的一个:不,我们不关心顺序,它可能是对角线上的下一个。你能填充一个面,然后转到上面的面吗?(这看起来很琐碎,但我没有看到任何约束阻止它在你的问题中陈述。)这就是我正在研究的:在一个4x4立方体体积中,我从中心开始,然后往上(z+1),然后向右(y+1)然后向左(x-1)旋转,直到到达面上的8个点。在最后一个点上,我沿对角线向下,从中心连接(x+1)上的点并旋转。这样,我添加了该级别的8个点(第9个点是起点)。然后以相同的对角线向下,并旋转最后一个面。完成后,我将27个点一个接一个地连接起来,但…我的27个点是最后一个面的中心。我现在可以向下连接上面的另一个面,但我的图形是垂直的…无法到达横向立方体。(抱歉,难以解释:-)很好,但我正在尝试另一种解决方案,因为您的解决方案从上到下探索点。这需要我们知道要管理的多维数据集的数量。我想我已经找到了一种方法来“扭转”起点,因此我可以将此起点放在构建中的任何位置,而不管虚拟多维数据集大小如何……我会尽快发布一个图;)我从中间,因为我认为这是一个约束,但如果你有一个4x4的基础,并希望无限堆叠4x4面上的Z轴,你可以应用相同的方法:填充面0,上一次访问顶点,并再次和在4x4x4的情况下:你认为18和19是相邻的吗?这是一个答案,还是你只是阐述你的问题?当然不是,这是一个在面之间跳跃的桥梁。我目前正在开发一个JS脚本来为一组5x5x5立方体的函数建模。我会尽快在这里发布;)然后请不要在回答部分发布它。这应该属于你们的问题。若这是一个解决方案,那个么它属于这里,而不属于你们的问题。顺便说一句,a的第4步和第5步lgorithm(如代码中的注释所示)建议从面1跳到面5(反之亦然)。是否存在只跳到相邻顶点的约束?

   |   |   |   |   |
---v---<---<---<---<---
   |   |   |   |   |
---v---v---<---<---^---
   |   |   |   |   |
---v---v--C_3--^---^---
   |   |   |   |   |
---v--->--P_3--^---^---
   |   |   |   |   |
--->--->--->---^--O_3--
   |   |   |   |   |

   |   |   |   |   |
---v---<---<---<---<---
   |   |   |   |   |
---v---v---<---<---^---
   |   |   |   |   |
---v---v--C_2--^---^---
   |   |   |   |   |
---v---v--P_2--^---^---
   |   |   |   |   |
--Q_2-->--->--->---^---
   |   |   |   |   |
     6----5----4
    /         /
   7    2----3
  /     |   /
 8----9----10
        |  \
        |
    14---13----12
    /   |    \ /
  15    1    11
  /         
16---17----18
          \

    22---21----20
    /       \ /
  23    27    19
  /       \  
24---25----26
          -------------------------
         /     /     /     /      /     
        -----73----72----71------
       /     /     /     /     / 
      -----74----69----70------
     /     /     /     /     / 
    -----75----76----77------
   /     /     /     /     / 
  -------------------------


          -------------------------
         /     /     /     /     /     
        -----23----22----21------
       /     /     /     /     / 
      -----24----19----20------
     /     /     /     /     / 
    -----25----26----27------
   /     /     /     /     / 
  -------------------------


         35----34----33----32-----31
         /     /     /     /     /     
       36-----5-----4-----3-----30
       /     /     /     /     / 
     37-----6-----1-----2-----29
     /     /     /     /     / 
   38-----7-----8-----9-----28
   /     /     /     /     / 
 39----40----41----42-----43


         52----51----50----49-----48
         /     /     /     /     /     
       53----14----13----12-----47
       /     /     /     /     / 
     54----15----10----11-----46
     /     /     /     /     / 
   55----16----17----18-----45
   /     /     /     /     / 
 56----57----58----59-----44

          -------------------------
         /     /     /     /     /     
        -----64----63----62------
       /     /     /     /     / 
      -----65----60----61------
     /     /     /     /     / 
    -----66----67----68------
   /     /     /     /     / 
  -------------------------