하이퍼 큐브 회전


27

소개

하이퍼 큐브 / 테 서랙 트는 일반 큐브의 4 차원에 해당합니다. 큐브 그물을 가져 와서 3 차원으로 확장 한 다음 4 차원을 사용하여 하이퍼 큐브로 접습니다. 기본적으로 큐브이며 각면이 큐브입니다.

하이퍼 큐브를 만들려면 16 개 4D 벡터 (AN와 벡터 필요로 x하는 y하는 zw구성 요소). 이 벡터는 다음과 같습니다.

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ʀᴋ 내가 마지막 검토를 위해 대화에 게시했습니다
Bálint

7
샌드 박스에서 두 번의 별도의 경우에 지적한 바와 같이, 디스플레이를위한 프로젝션의 설명은 투영 될 객체가 3 차원이지만 실제로는 4 차원이라고 가정하기 때문에 불완전합니다.
피터 테일러

2
@luserdroog 'U'는 'N'이어야한다고 생각합니다.
비커

2
@Balint 도전 해 주셔서 감사합니다. 더 많은 답변과 다른 접근 방식을 원할 것입니다. : D
비커

답변:


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));

회전 행렬은 여전히 바이트를 많이 소비하지만, 오일러 사이클에서 방문 정점의 수 감소, 아주 잘 일 96 33-120 다운.

정점은 [0:15]msb 의 4 비트 이진 표현을 취하여 msb를 x 좌표로, lsb를 w 좌표로 간주하여 생성됩니다 .

편집 : 모든 회전 행렬을 미리 곱하면 악몽이되었으므로 처음에는 사용하지 않았지만 쌍으로 미리 곱하면 41 바이트가 절약되었습니다. 이제 최적의 조합을 찾으십시오. :) 행렬에 3을 곱하면 사전 곱셈이 전혀없는 것보다 나쁘므로 페어 단위 접근 방식에 만족할 것입니다.


산출:

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)

H (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.psG를 사용합니다 .

편집 : -343 벡터 및 Eulerian 회로의 적용 이진 인코딩 생성훔친다른 답변에서 빌 렸습니다. 그리고 G 라이브러리에서 이진 토큰 문자열을 적용했습니다.
편집 : -49 재정의 sin cos하고 neg짧은 이름이다.
편집 : -43 시퀀스의 짧은 이름 정의 0 0 0 1 1 0.
편집 : 9 al (즉 aload) 가보다 짧습니다 (")@. 아무것도하지 않는 비용으로 3 번의 호출을 고려했습니다 idi(예 :) . 편집 : -30 G에서 적용되는 암시 적 정의 블록 . 편집 : -10 더 많이 사용되는 몇 가지 시퀀스. 편집 : -45 각도에 대한 변수 를 제거 하고 항상 현재 각도를 정의하고 각도의 함수는 (전역) 값을 사용합니다idiv1 idiv


i j k l m ntt변하기 쉬운. 될 때까지 회전 행렬의 코드 설명 실행을 연기 . 대신, 스택에두고t가치가 준비되었습니다.
편집 :-3 제거 <16>$. closepath. 그리고 공간.
편집 : -16 회전 행렬 ( J K LM) 의 단위 벡터에서 배열 괄호를 인수 분해 합니다. 재 신청 감소 mo를 위해 modsu위해 sub.
편집 : -12 프로젝트 및 그리기 기능을 인라인하고 둘러싸는 사전을 제거하십시오 (현재 비어 있음).
편집 : -36 회로 (즉, )를 문자열로 인코딩했습니다 .
편집 : -8 정점 배열의 정의 제거Vdup필요에 따라 작업 사본 (한 번에, 처음에 다시 루프 끝에서). 또한 바이너리 토큰 문자열에서 BTS가 절약하지 않은 약식 이름으로 몇 가지 연산자를 변환 했으므로 (I)$이제 fora(예 :)입니다 forall. if du일 수 (T8)$는 있지만 if du분명히 더 나은 선택입니다 ( 난독 화가 아닌 골프 ). 또한, 수행 전에 너무 좌표 변환 될 수 있으며, 그리고 대신 과 .scale translate34300400

(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제 2 블록의 첫 번째 라인은 페이지의 도면 (중심 좌표에 의해 스케일링되고, 각각 X 중심, Y 중심 및 크기를 나타내는 파라미터이다 scale). (300,400)은 대략 PS 단위의 미국 레터 크기 용지 (612,792)의 중심입니다.

포스트 스크립트를 대략적으로 따를 수있는 경우 중요한 기괴한 사항은 암시 적 프로 시저 블록 과 인코딩 된 연산자 문자열입니다. 아래의 작업 파일에 주석으로 표시된 것처럼 첫 번째 블록의 각 줄은 암시 적으로 A, B, C 등으로 이름이 지정됩니다. F E D생산 1 0 0 1 0 0합니다. 인코딩 된 연산자 문자열에 인수 아무것도를 위해 $ #또는 @시스템 이름 테이블에서 연산자를 선택 바이트를 사용하여, 운영자 호출 순서입니다, PLRM 부록 F.에게 이러한 기능을 3ED 더는 G 라이브러리 포스트 스크립트 (사용할 수 있습니다 이제 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의 The Armchair Universe를 읽은 이래로이 프로그램을 작성하고 싶었습니다 .
luser droog 2016 년

G 라이브러리에 새로운 기능이 추가되었습니다. 여기서는 사용할 수 없지만이 307 바이트 버전을 허용합니다 .
luser droog 2016 년

8

C # + 유니티, 1060 845 835 바이트

C # ≈ 자바

이 함수가에 배치 된 스크립트에 있다고 가정합니다 MainCamera.

편집 :
19 바이트 절약 제안 Eulerian 사이클을 사용하여 ~ 200 바이트 절약 제안 @TuukkaX 덕분에.

골프 :

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에서 Eulerian주기를 빌 렸습니다. 또한 Unity 내장 기능은 매우 장황합니다.

모든 테스트 사례를 온라인으로 확인할 수 있습니다 .


이것이 C # + Unity 답변을 처음 본 것입니다. +1
DanTheMan 2016 년

나는 모든 생각 0.5f을 줄일 수 .5f0.01f.01f. 또한 정수 배열은 int[]여러 번 말하는 대신 쉼표로 구분할 수 있다고 생각합니다 .
Yytsi

@Blue 아, 맞아요! 한동안 C #을 사용하지 않았으므로 마지막 팁을 확신하지 못했습니다.
Yytsi

@TuukkaX 이전 의견을 무시하고 사용할 수 있습니다 int[,]. 여전히 감사합니다.
Blue

당신은 여전히 Vector4(0.5f,0.5f,0.5f,0.5f)로 줄일 수 있는 것을 가지고 있습니다 Vector4(.5f,.5f,.5f,.5f).
Yytsi

6

자바 스크립트 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 캔버스 객체를 반환하므로 document.body.appendChild(f(0,0,0,0,0,0))예를 들어 페이지에 추가해야합니다 .

현재 회전은 순서가 잘못 적용되어 재정렬 작업을하고 있지만 하이퍼 큐브를 올바르게 회전시킵니다.


영리한, 매트릭스 변환으로 무엇을하고 있는지 알아내는 데 시간이 걸렸습니다. : D 또한, 코드 스 니펫이 작동하지 않아 도움이되지 않는 "스크립트 오류"가 발생합니다. 0 호선에.
비커

@beaker 어떤 브라우저를 사용하고 있습니까? 최신 Firefox에서 테스트했습니다.
Dendrobium 2016 년

Safari 9.1.1을 사용하고 있습니다. 다른 것을 시도하겠습니다.
비커

1
그래, 크롬은 잘 작동합니다.
비커

1
사파리는 쓰레기입니다. 작동하는지 확인하기 위해 사용하지 마십시오.
패트릭 로버츠

1

Mathematica, 453 415 바이트 *

Eulerian 둘러보기를 사용하여 변수의 함수를 정의하지 않고 단일 명령문으로 정리하여 단축합니다. 어떤 이유로 코드가 느려집니다. 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}}]]]

* 나는 계산입니다 °==단일 바이트로 각 그들은 티카에서 단일 문자로 표현되기 때문에. 많은 언어가 이상한 문자 인코딩을 사용하기 때문에 이것이 공정하다고 생각합니다.

댓글이 포함되어 있습니다. 입력은 상단에 하드 코딩되어 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

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.