旋转超立方体


27

介绍

超立方体/梯形函数是普通立方体的4维等效项。它是通过以下方法制成的:使用立方体网,将其扩展到第3维,然后使用第4维将其折叠成超立方体。基本上是一个立方体,每边都是一个立方体。

要创建超立方体,您需要16个4d向量(一个具有an x,a y,a z和一个w分量的向量)。这些向量如下:

A(0, 0, 0, 0); B(1, 0, 0, 0); C(1, 0, 1, 0); D(0, 0, 1, 0); E(0, 1, 0, 0); F(1, 1, 0, 0); G(1, 1, 1, 0); H(0, 1, 1, 0); 
I(0, 0, 0, 1); J(1, 0, 0, 1); K(1, 0, 1, 1); L(0, 0, 1, 1); M(0, 1, 0, 1); N(1, 1, 0, 1); O(1, 1, 1, 1); P(0, 1, 1, 1);

超立方体具有24个面。以下列表包含所有这些元素(每个组都标记一个四边形):

ABFE, CDHG, BCGF, DAEH, DCBA, FEHG
IJNM, KLPO, JKON, LIMP, LKJI, PMNO
ABJI, DCKL, BCKJ, DAIL, FEMN, GHPO, FGON, EHPM, EAIM, BFNJ, CGOK, HDLP

利用所有这些信息,从技术上来说,您在代码中拥有一个超级立方体。要旋转此平面,每个旋转平面需要6个不同的矩阵,YZ,XZ,XY,XW,YW和ZW平面需要一个矩阵。获得每个矩阵后,需要将多维数据集的顶点与它们相乘。

下图显示了每个矩阵的结构:

对于YZ平面上的旋转:

对于XZ平面上的旋转:

对于在XY平面上的旋转:

对于XW平面上的旋转:

对于YW平面上的旋转:

对于ZW平面上的旋转:

旋转按此顺序应用。

完成所有这些操作后,您将拥有一个旋转的超立方体。现在您需要绘制它。您应该结合使用正交投影和透视投影来发送(x, y, z, w)(2x/(2+z), 2y/(2+z))

输入项

您输入的是0(含)和360(含)之间的6个整数。这些代表在超立方体的不同旋转平面上的度数旋转。

输出量

您的输出应该是包含超立方体的单个图像。显示器可以是光栅图像,矢量图像或ASCII艺术作品。输出图像至少应为100 * 100像素,并且多维数据集至少需要占据屏幕的50%。允许使用任何默认的图像输出格式。

测试用例

0 0 0 0 0 0

0 0 0 0 0 30

30 0 0 0 0 30

0 0 0 30 30 30

45 45 45 0 0 0

45 45 45 45 45 45

在新标签页中打开图像,以查看完整尺寸的图像。

规则

  • 默认规则适用
  • 禁止出现标准漏洞
  • 以字节为单位的最短代码获胜

您为什么要取消其他职位?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ我张贴在聊天的最后一次审查
巴林特

7
正如我在沙箱中的两个不同场合所指出的,用于显示的投影的描述是不完整的,因为它假定要投影的对象是3维的,而实际上是4维的。
彼得·泰勒

2
@luserdroog我认为“ U”必须为“ N”。
烧杯

2
@Bálint感谢您的挑战,我很喜欢。希望我们会得到更多答案和不同的方法。:D
烧杯

Answers:


9

八度,474个 433 429字节

function H(a,b,c,d,e,f) C=@cosd;S=@sind;R=[1,0,0,0;0,C(e),0,-S(e);0,-S(e)*S(f),C(f),-C(e)*S(f);0,S(e)*C(f),S(f),C(e)*C(f)]*[C(c)*C(d),-S(c)*C(d),0,S(d);S(c),C(c),0,0;0,0,1,0;-C(c)*S(d),S(c)*S(d),0,C(d)]*[C(b),S(a)*S(b),C(a)*S(b),0;0,C(a),-S(a),0;-S(b),S(a)*C(b),C(a)*C(b),0;0,0,0,1]*(dec2bin(0:15)'-48.5);Z=R(3,:)+2;R=2*R./Z;Q=[1,2,10,12,11,9,10,14,16,12,4,8,16,15,11,3,7,15,13,9,1,5,13,14,6,8,7,5,6,2,4,3,1];plot(R(1,Q),R(2,Q));

旋转:

function H(a,b,c,d,e,f) 
C=@cosd;S=@sind;
R=[1,0,0,0;0,C(e),0,-S(e);0,-S(e)*S(f),C(f),-C(e)*S(f);0,S(e)*C(f),S(f),C(e)*C(f)]*
  [C(c)*C(d),-S(c)*C(d),0,S(d);S(c),C(c),0,0;0,0,1,0;-C(c)*S(d),S(c)*S(d),0,C(d)]*
  [C(b),S(a)*S(b),C(a)*S(b),0;0,C(a),-S(a),0;-S(b),S(a)*C(b),C(a)*C(b),0;0,0,0,1]*
  (dec2bin(0:15)'-48.5);
Z=R(3,:)+2;
R=2*R./Z;
Q=[1,2,10,12,11,9,10,14,16,12,4,8,16,15,11,3,7,15,13,9,1,5,13,14,6,8,7,5,6,2,4,3,1];
plot(R(1,Q),R(2,Q));

旋转矩阵仍然占用大量字节,但是欧拉循环的效果很好,将访问的顶点数从96120减少到33。

通过采用的4位二进制表示[0:15]并将msb视为x坐标,将lsb视为w坐标来生成顶点。

编辑:将所有旋转矩阵预乘是一个噩​​梦,这就是为什么我最初不使用它,而是将它们成对预乘以节省41个字节的原因。现在寻找最佳组合。:)将矩阵乘以三比根本没有预乘要差,因此我对成对方法感到满意。


输出:

H(0,0,0,0,0,0)

H(0,0,0,0,0,0)

H(0,0,0,0,0,30)

H(0,0,0,0,0,30)

H(30,0,0,0,0,30)

H(30,0,0,0,0,30)

H(0,0,0,30,30,30)

H(0,0,0,30,30,30)

H(45,45,45,0,0,0)

H(45,45,45,0,0,0)

H(45,45,45,45,45,45)

高(45,45,45,45,45,45)


编辑:我很愚蠢。到处都是相同的变量... [确定不想要完整的预乘矩阵吗?:) i.imgur.com/nkM6y6g.png]
algmyr

@algmyr是的,如果我没记错的话,完全相乘的矩阵大约是原来的两倍。
烧杯

这应该更像它,享受Maxima愚蠢的“简化”:i.imgur.com/klkXLPf.png
algmyr

为了弥补数学上的惨败,这是您的代码的更高级版本,为330字节:paste.ee/p/2GRyJ
algmyr

14

后记 1075 732 683 640 631 601 590 545 542 526 514 478 470

使用mat.ps

编辑:-343应用二进制编码的向量和欧拉回路被盗从其他答案中借来的。并应用了G库中的二进制令牌字符串。
编辑:-49重新定义sin cosneg缩短名称。
编辑:-43为序列定义了短名称0 0 0 1 1 0
编辑:-9 al(即aload)比短(")@。分解3调用idi(即idiv)以不做任何事情为代价1 idiv
编辑:-30应用了来自G的隐式定义块
编辑:-10还有一些三重使用的序列。
编辑:-45删除i j k l m n角度的变量,并始终将当前角度定义为,t并且角度函数使用(全局)值t变量。推迟执行旋转矩阵的代码描述,直到t准备好其值为止。
编辑:-3删除<16>$即。closepath。和一个空间。
编辑:-16从旋转矩阵(J K LM)的单位向量中分解出数组括号。重新申请下降momodsusub
编辑:-12插入项目绘图功能,并删除(现在为空)附带的字典。
编辑:-36将电路(即面部)编码为字符串。
编辑:-8删除顶点数组的定义V。而是放在堆栈上dup根据需要工作副本(一次,第一次,然后在循环结束时再次)。另外,将一些运算符从二进制令牌串转换回缩写名称,而BTS则不提供任何节省,因此(I)$现在也是如此fora(即forall)。if du可能是(T8)$,但是if du显然是更好的选择(这是高尔夫,本身不是迷惑)。另外,执行scale before translate,这样翻译后的坐标可以是34而不是300400

(mat.ps)run 3(G)run $
t sin
A neg
t cos
0 0
0 1
1 0
2 mu Z 2(!V)@
idi 2 mo .5 su
(>8)$
[F D]
[D E]
[E D]
[D F]

3 4 100(&>88)$(,)# div(<N)#[E 15{[I 1 H I 2 H I 4 H ex 8 H]}fo]E
5{ARGUMENTS 1(XK/)$/t ex d{{J[0 C B 0][0 A C 0]K}{[C 0 A 0]L[B 0
C 0]K}{[C B D][A C D]M K}{[C D A]L M[B D C]}{J[0 C 0 B]M[0 A 0
C]}{J L[D C B][D A C]}}(>K)$[(>?)$]transpose matmul}fo
du(019;:89=?;37?>:26><804<=576451320){48 su get al po{W
Z Y X}{(>3)$}fora X G Y G{li}(D)#{mov}if du}fora(HB)#

3 4100在第二块的第一行分别是表示中心-X,中心-y和尺度参数,在页上的图(中心坐标由缩放scale)。(300,400)大约是PS单位的美国Letter尺寸纸张(612,792)的中心。

如果您可以大致遵循此后记,则重要的奇异事物是隐式过程块和编码的运算符字符串。如下面工作文件中的注释所示,第一个块的每一行都由A,B,C等隐式命名。F E D会产生1 0 0 1 0 0。对于已编码的运算符字符串,无论是参数$ #还是@运算符调用序列,都可以使用字节从系统名称表PLRM 3ed附录F中选择运算符。这些功能及更多功能可用于带有G库的PostScript(现在也包括mat.ps函数)。

工作档案:

(mat.ps)run 3(G)run $
t sin %/A
A neg %/B
t cos %/C
0 0 %/D
0 1 %/E
1 0 %/F
2 mu Z 2(!V)@ %/G  %ad div %add div %108 1 54
idi 2 mo .5 su %idiv mod sub %/H %106 169 51
(>8)$ %/I %exch dup
[F D] %/J
[D E] %/K
[E D] %/L
[D F] %/M


3 4
100(&>88)$ %currentlinewidth exch dup dup %38
(,)#  %scale %139-95=44
div(<N)# %div setlinewidth %54 155-95=60 %translate %173-95=78
%/V
[E 15{[ I
    1 H I
    2 H I
    4 H ex
    8 H]}fo]

E 5{ARGUMENTS 1(XK/)$ %index get cvr %88 75 47
    /t ex d %exch def %62 51
    {{J[0 C B 0][0 A C 0]K} 
     {[C 0 A 0]L[B 0 C 0]K} 
     {[C B D][A C D]M K} 
     {[C D A]L M[B D C]}
     {J[0 C 0 B]M[0 A 0 C]}
     {J L[D C B][D A C]}}
    (>K)$ %exch get %62 75
    [
        (>?)$ %exch exec %62 63
    ]
    transpose matmul
}fo %for
du %dup
%d %def
%{transpose matmul}fora d

%[E 9 11 10 8 9 13 15 11 3 7 15 14 10 2 6 14 12 8 0 4 12 13 5 7 6 4 5 1 3 2 0]
%<0001090b0a08090d0f0b03070f0e0a02060e0c0800040c0d050706040501030200>
%          abcdef
%0123456789:;<=>?
(019;:89=?;37?>:26><804<=576451320)
{48 su get % 169 75 %V (>K)$ %sub %exch get

    al po %aload pop %2 117
    {W Z Y X}{(>3)$ %exch def
    }fora %forall %2 117  62 51 73
    X G
    Y G
    {li}(D)# %stopped
    {mov}
    if du%(T8)$ %if %84 du %dup 56
}
%<49a7a1>$ %forall stroke showpage %73 167-95=72 161-95=66
fora(HB)#

脱节,轻描淡写:

300 400 translate   %roughly center of letter paper
currentlinewidth
100 dup dup scale
div setlinewidth    %scale x100, reduce line-width/100
(mat.ps)run         %load matrix library
ARGUMENTS aload pop{f e d c b a}{exch cvr def}forall  %define args as 
                                 % a,b,etc and convert to real numbers
/m{2 mod .5 sub}def
/P{aload pop{w z y x}{exch def}forall   %P: [x y z w]  project-and-draw  -
    x 2 mul z 2 add div 
    y 2 mul z 2 add div 
    {lineto}stopped{moveto}if %catch(&handle!) nocurrentpoint error in lineto
}bind def
/V[0 1 15{    % generate vectors with a for-loop
    [ exch
        dup m
        1 index 2 idiv m
        2 index 4 idiv m
        4 3 roll 8 idiv m
    ]
}for]
[[[1 0 0 0][0 a cos a sin neg 0][0 a sin a cos 0][0 0 0 1]] 
     [[b cos 0 b sin 0][0 1 0 0][b sin neg 0 b cos 0][0 0 0 1]] 
     [[c cos c sin neg 0 0][c sin c cos 0 0][0 0 1 0][0 0 0 1]] 
     [[d cos 0 0 d sin][0 1 0 0][0 0 1 0][d sin neg 0 0 d cos]]
     [[1 0 0 0][0 e cos 0 e sin neg][0 0 1 0][0 e sin 0 e cos]]
     [[1 0 0 0][0 1 0 0][0 0 f cos f sin neg][0 0 f sin f cos]]]
{transpose matmul} forall def   % apply array of rotations and define

%Eulerian circuit (borrowed and adjusted for 0-based indexing)
[0 1 9 11 10 8 9 13 15 11 3 7 15 14 10 2 6 14 12 8 0 4 12 13 5 7 6 4 5 1 3 2 0]

% the main program!
% on the stack is the Eulerian circuit array
{
    V exch get  %lookup index in (sextuply-transformed) vertex array
    P           %call project-and-draw
} forall
closepath stroke %draw it, don't just think about it

showpage % gs's cmd-line-args option automatically sets -dBATCH,
    % so without a showpage, gs will immediately exit before you
    % can look at the picture :(

我的一些输出是问题示例的镜像。

对于gs -- hc.ps 0 0 0 0 0 0,我得到:
在此处输入图片说明

gs -- hc.ps 0 0 0 0 0 30
在此处输入图片说明

gs -- hc.ps 30 0 0 0 0 30
在此处输入图片说明

gs -- hc.ps 0 0 0 30 30 30
在此处输入图片说明

gs -- hc.ps 45 45 45 0 0 0
在此处输入图片说明

gs -- hc.ps 45 45 45 45 45 45
在此处输入图片说明

我刚用此程序制作的动画加成。此图像对应于旋转序列0 30 60 0 i i,其中i的范围是0到360 x 2。
在此处输入图片说明


2
哇。有关数学问题的PostScript答案。
TuxCrafting

@TùxCräftîñg只要您可以轻松地进行矩阵乘法,这个问题实际上就没有那么多数学了。自从阅读AK Dewdney的《扶手椅世界》以来,我一直想编写此程序。
luser droog

向G库添加了新功能。不能在此处使用,但允许此307字节版本
luser droog

8

C#+统一,1060个 845 835字节

C#≈Java

假设此函数位于上的脚本中MainCamera

编辑:
感谢@TuukkaX为节省19个字节的建议,使用欧拉循环保存了〜200个字节。

打高尔夫球:

void d(float[]r){transform.position=Vector3.back*2;GetComponent<Camera>().backgroundColor=Color.black;Vector4[]p=new Vector4[16];Matrix4x4[]m=new Matrix4x4[6];int i=0;for(;i<16;i++)p[i]=new Vector4(i%2,i/2%2,i/4%2,i/8%2)-new Vector4(.5f,.5f,.5f,.5f);int[,]X={{6,8,1,12,7,11},{5,0,0,0,5,10},{10,10,5,15,15,15}};for(i=0;i<6;i++){m[i]=Matrix4x4.identity;r[i]=Mathf.Deg2Rad*r[i];float c=Mathf.Cos(r[i]),s=Mathf.Sin(r[i]);m[i][X[1,i]]=c;m[i][X[2,i]]=c;m[i][X[0,i]]=s;m[i][X[0,i]%4*4+X[0,i]/4]=-s;}for(i=0;i<16;i++)foreach(Matrix4x4 x in m)p[i]=x*p[i];int[]F={0,1,9,11,10,8,9,13,15,11,3,7,15,14,10,2,6,14,12,8,0,4,12,13,5,7,6,4,5,1,3,2,0};LineRenderer l=new GameObject().AddComponent<LineRenderer>();l.SetVertexCount(33);l.material=new Material(Shader.Find("Sprites/Default"));l.SetWidth(.03f,.03f);for(i=0;i<33;i++)l.SetPosition(i,p[F[i]]);

换行符+缩进+全功能:

using UnityEngine;
using System.Collections;

public class h : MonoBehaviour {

    void d(float[]r)
    {
        transform.position=Vector3.back*2.5f;
        GetComponent<Camera>().backgroundColor=Color.black;
        Vector4[]p=new Vector4[16];
        Matrix4x4[]m=new Matrix4x4[6];
        int i=0;
        for(;i<16;i++)p[i]=new Vector4(i%2,i/2%2,i/4%2,i/8%2)-new Vector4(.5f,.5f,.5f,.5f);
        int[,]X={{6,8,1,12,7,11},{5,0,0,0,5,10},{10,10,5,15,15,15}};
        for (i=0;i<6;i++){
            m[i]=Matrix4x4.identity;
            r[i]=Mathf.Deg2Rad*r[i];
            float c=Mathf.Cos(r[i]);
            float s=Mathf.Sin(r[i]);
            m[i][X[1,i]]=c;
            m[i][X[2,i]]=c;
            m[i][X[0,i]]=s;
            m[i][X[0,i]%4*4+X[0,i]/4]=-s;
        }
        for (i=0;i<16;i++)foreach(Matrix4x4 x in m)p[i]=x*p[i];
        int[]F={0,1,9,11,10,8,9,13,15,11,3,7,15,14,10,2,6,14,12,8,0,4,12,13,5,7,6,4,5,1,3,2,0};
        LineRenderer l=new GameObject().AddComponent<LineRenderer>();
        l.SetVertexCount(33);
        l.material=new Material(Shader.Find("Sprites/Default"));
        l.SetWidth(.03f,.03f);
        for (i=0;i<33;i++)
            l.SetPosition(i,p[F[i]]);
        l.gameObject.tag = "Player";
    }
    public float[] input;
    void Start()
    {
        d(input);
    }
}

我无法找出用于构造旋转矩阵的简单公式,也无法找出要绘制的“面”,因此要花费大量字节来进行硬编码。我从@beaker借来了欧拉循环。另外,Unity内置函数非常冗长。

您可以在线验证所有测试用例。


这是我第一次在这里看到C#+ Unity答案。+1
DanTheMan '16

我认为每一个0.5f可以降低到.5f0.01f.01f。我还认为整数数组可以用逗号分隔,而不必int[]多次重复。
Yytsi'7

@Blue哦,你是对的!一段时间没有使用C#了,所以不确定最后一个技巧。
Yytsi'7

@TuukkaX忽略我以前的评论,我可以使用int[,]。不过还是谢谢你
2016年

您仍然有一个Vector4(0.5f,0.5f,0.5f,0.5f)可以减少到的Vector4(.5f,.5f,.5f,.5f)
Yytsi'8

6

Javascript ES6,584字节

f=(...R)=>(P=s=>[...s].map(i=>parseInt(i,16)),C=document.createElement`canvas`,X=C.getContext`2d`,X.translate((C.width=300)/2,(C.height=300)/2),X.lineWidth=0.01,X.scale(100,100),X.beginPath(),P("0267fd9804c8ab915dcefb37546ea2310").map((e,i)=>{[x,y,z]=P("084c2a6e195d3b7f").map(i=>[...(1e3+i.toString(2)).slice(-4)].map(i=>i-0.5)).map(e=>(R.map((R,i,_,M=Math,C=M.cos(r=R*M.PI/180),S=M.sin(r))=>((a,b,s=1)=>[e[a],e[b]]=[C*e[a]-s*S*e[b],s*S*e[a]+C*e[b]])(...[[1,2],[0,2,-1],[0,1],[0,3,-1],[1,3],[2,3]][i])),e))[e];[x,y]=[2*x/(2+z),2*y/(2+z)];i?X.lineTo(x,y):X.moveTo(x,y)}),X.stroke(),C)

“无高尔夫球”:

f=(...R)=>(                                                              // function that accepts rotations in the following form: f(a,b,c,d,e,f)
    P=s=>[...s].map(i=>parseInt(i,16)),                                  // function to convert strings to hex-arrays
    V=P("084c2a6e195d3b7f")                                              // vertices encoded as hex values ( [0,1,1,0] -> 6 )
        .map(i=>[...(1e3+i.toString(2)).slice(-4)].map(i=>i-0.5))        // convert hex values to vertices, center the hypercube
        .map(e=>(R.map((R,i,_,M=Math,C=M.cos(r=R*M.PI/180),S=M.sin(r))=> // convert angles to degrees, precalculate sin and cos values
        ((a,b,s=1)=>[e[a],e[b]]=[C*e[a]-s*S*e[b],s*S*e[a]+C*e[b]])       // apply matrix transforms to all vertices
        (...[[1,2],[0,2,-1],[0,1],[0,3,-1],[1,3],[2,3]][i])),e)),        // list of encoded matrix transforms
    C=document.createElement`canvas`,X=C.getContext`2d`,                 // create image to draw on
    X.translate((C.width=300)/2,(C.height=300)/2),                       // setup image dimensions, center transform
    X.lineWidth=0.01,X.scale(100,100),X.beginPath(),                     // setup line, scale the transform and begin drawing
    P("0267fd9804c8ab915dcefb37546ea2310").map((e,i)=>{                  // hypercube edge path indices encoded as hex values
        [x,y,z]=V[e];[x,y]=[2*x/(2+z),2*y/(2+z)];                        // project vertex
        i?X.lineTo(x,y):X.moveTo(x,y)}),X.stroke(),                      // draw vertex
    C)                                                                   // return image

实际观看(已修改以不断旋转):

with(document)with(Math)with(document.getElementById`canvas`)with(getContext`2d`){render=()=>{requestAnimationFrame(render);clearRect(0,0,width,height);save();K=performance.now();R=[K*0.01,K*0.02,K*0.03,K*0.04,K*0.05,K*0.06];X=s=>[...s].map(i=>parseInt(i,16));V=X("084c2a6e195d3b7f").map(i=>[...(1e3+i.toString(2)).slice(-4)].map(i=>i-0.5)).map(e=>(R.map((R,i,_,C=cos(r=R*PI/180),S=sin(r))=>((a,b,s=1)=>[e[a],e[b]]=[C*e[a]-s*S*e[b],s*S*e[a]+C*e[b]])(...[[1,2],[0,2,-1],[0,1],[0,3,-1],[1,3],[2,3]][i])),e));translate((width=300)/2,(height=300)/2);lineWidth=0.01;scale(100,100);beginPath();X("0267fd9804c8ab915dcefb37546ea2310").map((e,i)=>{[x,y,z]=V[e];[x,y]=[2*x/(2+z),2*y/(2+z)];i?lineTo(x,y):moveTo(x,y)});stroke();restore();};render();}
<html><body><canvas id="canvas"></canvas></body></html>

该函数返回一个HTML5 canvas对象,例如,您需要将其添加到页面中document.body.appendChild(f(0,0,0,0,0,0))

目前,旋转顺序不正确,我正在重新排序,但按原样,它可以正确旋转超立方体。


聪明,花了我一段时间才弄清楚您正在处理矩阵变换。:D另外,我无法使您的代码段正常工作……给了我一个无用的“脚本错误”。在第0行
烧杯

@beaker您正在使用什么浏览器?我已经在最新的Firefox上进行了测试。
D

我正在使用Safari 9.1.1。让我尝试另一种。
烧杯

1
是的,Chrome可以正常工作。
烧杯

1
Safari很烂。不要用它来检查是否有用。
帕特里克·罗伯茨

1

Mathematica,453 415字节*

通过使用欧拉环游并将其全部清除为单个语句而无需在变量中定义函数来缩短。由于某些原因,这会使代码变慢。我猜Mathematica不会重新存储函数,因为它们没有存储在变量中。

Graphics[Line[Table[{2#/(2+#3),2#2/(2+#3)}&@@Map[Dot@@Table[Table[If[n==m==#2||n==m==#,Cos[#3],If[n==#2&&m==#,If[#2==1&&(#==3||#==4),1,-1]Sin[#3],If[n==#&&m==#2,If[#2==1&&(#==3||#==4),-1,1]Sin[#3],If[n==m,1,0]]]],{n,4},{m,4}]&[k[[1]],k[[2]],a[[k[[3]]]]°],{k,{{4,3,6},{4,2,5},{4,1,4},{2,1,3},{3,1,2},{3,2,1}}}].#&,Tuples[{0,1},4]-.5,{1}][[i]],{i,{1,2,10,12,11,9,10,14,16,12,4,8,16,15,11,3,7,15,13,9,1,5,13,14,6,8,7,5,6,2,4,3,1}}]]]

*我正在计数,°并且==每个字节都是单个字节,因为它们在Mathematica中表示为单个字符。我认为这很公平,因为许多语言都使用奇怪的字符编码。

取消评论。输入在顶部硬编码为a={30,0,0,0,0,30};。我没有将其计入分数。


a = {45, 45, 45, 45, 45, 45};



(* #2,#-th rotation matrix as a funciton of #3 *)
(* Using the \
#-notation saved 6 bytes over the more common function definition \
notation*)
r = 
  Table[If[n == m == #2 || n == m == #, Cos[#3], 
     If[n == #2 && m == #, 
      If[#2 == 1 && (# == 3 || # == 4), 1, -1] Sin[#3], 
      If[n == # && m == #2, 
       If[#2 == 1 && (# == 3 || # == 4), -1, 1] Sin[#3], 
       If[n == m, 1, 0]]]], {n, 4}, {m, 4}] &;

(* Total rotation matrix. Need six of them. Function of the six \
angles to rotate.*)

u = Dot @@ 
     Table[r[k[[1]], 
       k[[2]], \[Degree]*
        a[[k[[3]]]]], {k, {{4, 3, 6}, {4, 2, 5}, {4, 1, 4}, {2, 1, 
         3}, {3, 1, 2}, {3, 2, 1}}}].# &;



(* List of all vertices of the hypercube *)
t = Tuples[{0, 1}, 4];
t -= .5;
v = Map[u, t, {1}];

(*projection*)
p = {2 #/(2 + #3), 2 #2/(2 + #3)} &;

(*Eulerian tour*)

l = Table[
   p @@ v[[i]], {i, {1, 2, 10, 12, 11, 9, 10, 14, 16, 12, 4, 8, 16, 
     15, 11, 3, 7, 15, 13, 9, 1, 5, 13, 14, 6, 8, 7, 5, 6, 2, 4, 3, 
     1}}];
Graphics[Line[l]]

0 0 0 0 0 30

0 0 0 30 30 30

在此处输入图片说明

405 10 -14 -8 -9 205

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.