Putar hypercube

27

pengantar

Hypercube / tesseract adalah setara 4 dimensi dari kubus normal. Itu dibuat dengan mengambil jaring kubus, memperluasnya ke dimensi 3, lalu - menggunakan dimensi 4 - melipatnya menjadi hypercube. Ini pada dasarnya sebuah kubus, di mana setiap sisi adalah kubus.

Untuk membuat hypercube, Anda memerlukan 16 vektor 4d (vektor dengan komponen x, a y, a, zdan wkomponen). Vektor-vektor ini adalah sebagai berikut:

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

Hypercube memiliki 24 wajah. Daftar berikut berisi semuanya (setiap grup menandai kuad):

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

Dengan semua informasi ini, secara teknis Anda memiliki hypercube dalam kode. Untuk memutar ini, Anda membutuhkan 6 matriks yang berbeda untuk setiap bidang rotasi, satu untuk pesawat YZ, XZ, XY, XW, YW dan ZW. Setelah Anda memiliki setiap matriks, Anda perlu mengalikan simpul kubus dengan mereka.

Gambar-gambar berikut menunjukkan struktur setiap matriks:

Untuk rotasi pada bidang YZ:

Untuk rotasi pada bidang XZ:

Untuk rotasi pada bidang XY:

Untuk rotasi pada bidang XW:

Untuk rotasi pada pesawat YW:

Untuk rotasi pada bidang ZW:

Rotasi diterapkan dalam urutan ini.

Setelah semua ini, Anda memiliki hypercube yang diputar. Sekarang kamu harus menggambarnya. Anda harus menggunakan proyeksi orthogonal dikombinasikan dengan proyeksi perspektif untuk mengirim (x, y, z, w)ke (2x/(2+z), 2y/(2+z)).

Memasukkan

Input Anda adalah 6 bilangan bulat antara 0 (inklusif) dan 360 (eksklusif). Ini mewakili rotasi dalam derajat pada bidang rotasi yang berbeda dari hypercube.

Keluaran

Output Anda harus berupa gambar tunggal yang mengandung hypercube. Layar dapat berupa gambar raster, gambar vektor atau seni ASCII. Gambar output harus minimal 100 * 100 piksel, dan kubus perlu mengambil setidaknya 50% dari layar. Format output gambar apa pun diizinkan.

Uji kasus

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

Buka gambar di tab baru, untuk melihatnya dalam ukuran penuh.

Aturan

  • Aturan default berlaku
  • Celah standar dilarang
  • Kode terpendek dalam byte menang
Bálint
sumber
Mengapa Anda mengabaikan pos lainnya?
R
@ EᴀsᴛᴇʀʟʏIʀᴋ Saya memposting di obrolan untuk ulasan terakhir
Bálint
7
Seperti yang saya tunjukkan pada dua kesempatan terpisah di kotak pasir, deskripsi proyeksi untuk tampilan tidak lengkap karena mengasumsikan bahwa objek yang akan diproyeksikan adalah 3-dimensi sedangkan sebenarnya, jelas, 4-dimensi.
Peter Taylor
2
@luserdroog Saya pikir 'U' pasti 'N'.
Gelas
2
@ Bálint Terima kasih atas tantangannya, saya menikmatinya. Semoga kami akan mendapatkan lebih banyak jawaban dan pendekatan yang berbeda. : D
gelas kimia

Jawaban:

9

Oktaf, 474 433 429 byte

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

Diputar:

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

Matriks rotasi masih mengkonsumsi banyak byte, tetapi siklus Euler bekerja dengan cukup baik, mengurangi jumlah simpul yang dikunjungi dari 96 120 ke 33.

Vertikal dihasilkan dengan mengambil representasi biner 4-bit [0:15]dan menganggap msb sebagai koordinat x dan lsb koordinat w.

Sunting: Pra-mengalikan semua matriks rotasi adalah mimpi buruk, itulah sebabnya saya tidak menggunakannya pada awalnya, tetapi pra-mengalikannya secara berpasangan menghemat 41 byte. Sekarang untuk mencari kombinasi optimal. :) Mengalikan matriks dengan bertiga lebih buruk daripada tidak ada pra-perkalian sama sekali, jadi saya akan senang dengan pendekatan pasangan-bijaksana.


Keluaran:

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

H (0,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)

gelas kimia
sumber
Sunting: Saya bodoh. tertipu oleh variabel yang sama di mana-mana ... [Apakah Anda yakin tidak ingin matriks pra-dikalikan penuh? :) i.imgur.com/nkM6y6g.png]
algmyr
@ algmyr Ya, matriks dikalikan sepenuhnya keluar sekitar dua kali lebih lama, jika saya ingat dengan benar.
Gelas kimia
Ini seharusnya lebih seperti itu, nikmati "penyederhanaan" bodoh Maxima: i.imgur.com/klkXLPf.png
algmyr
Untuk menebus kegagalan dalam matematika, berikut adalah versi kode Anda yang lebih golf
algmyr
14

Nota bene 1075 732 683 640 631 601 590 545 542 526 514 478 470

Menggunakan mat.ps dan G .

Sunting: -343 Generasi vektor enkode biner terapan dan sirkuit Eulerdicuridipinjam dari jawaban lain. Dan menerapkan string biner-token dari perpustakaan G.
Sunting: -49 Redefined sin cosdan neguntuk nama yang lebih pendek.
Edit: -43 Nama pendek yang ditentukan untuk urutan 0 0 0 1 1 0.
Sunting: -9 al (mis. aload) Lebih pendek dari (")@. 3 panggilan ke idi(mis. idiv) Dengan biaya tidak melakukan apa-apa 1 idiv.
Edit: -30 Terapan implisit blok definisi dari G.
Edit: -10 Beberapa urutan yang lebih triply digunakan.
Sunting: -45 Hapus variabel i j k l m nuntuk sudut dan selalu mendefinisikan sudut saat ini sebagai tdan fungsi sudut menggunakan nilai (global)tvariabel. Tunda pelaksanaan kode-deskripsi matriks rotasi hingga tnilainya siap.
Sunting: -3 Hapus <16>$mis. closepath. Dan sebuah ruang.
Sunting: -16 Kurung array faktor-keluar dari vektor satuan dalam matriks rotasi ( J K Ldan M). Lamar kembali berlaku mountuk moddan suuntuk sub.
Edit: -12 In-line fungsi project-and-draw dan hapus (sekarang kosong) kamus terlampir.
Sunting: -36 Sandi sirkuit (mis. Wajah ) dalam sebuah string.
Sunting: -8 Hapus definisi array simpul V. Sebagai gantinya, tinggalkan di tumpukan dandupcopy pekerjaan sesuai kebutuhan (sekali, pertama, dan lagi di akhir loop). Juga, menerjemahkan beberapa operator dari binary-token-string kembali ke nama-nama singkat di mana BTS tidak memberikan penghematan, begitu (I)$juga sekarang fora(mis. forall). if dubisa jadi (T8)$, tetapi if dujelas merupakan pilihan yang lebih baik ( golf , bukan kebingungan ). Juga, lakukan scale sebelumnya translate , sehingga koordinat yang diterjemahkan dapat 3dan 4bukan 300dan 400.

(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)#

The 3 4dan 100di baris pertama dari blok kedua adalah parameter yang mewakili pusat-x, pusat-y dan skala, masing-masing, dari gambar pada halaman (koordinat pusat yang skala oleh scale). (300.400) kira-kira merupakan pusat kertas berukuran AS (612.792) di unit PS.

Jika Anda dapat secara kasar mengikuti postscript, hal-hal aneh yang penting adalah blok prosedur implisit dan string operator yang disandikan. Seperti yang ditunjukkan oleh komentar di workfile, di bawah ini, setiap baris blok pertama secara implisit dinamai oleh A, B, C, dll. Jadi, misalnya. F E Dakan menghasilkan 1 0 0 1 0 0. Untuk string operator yang disandikan, segala sesuatu yang merupakan argumen $ #atau @urutan dari panggilan operator, menggunakan byte untuk memilih operator dari tabel nama sistem, PLRM 3ed Lampiran F. Fitur-fitur ini dan lebih banyak lagi tersedia untuk PostScript dengan perpustakaan G ( sekarang termasuk fungsi mat.ps juga).

Workfile:

(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)#

Tidak dikomentari dan dengan ringan berkomentar:

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 :(

Beberapa hasil saya adalah contoh cermin dari contoh pertanyaan itu.

Untuk gs -- hc.ps 0 0 0 0 0 0, saya dapat:
masukkan deskripsi gambar di sini

gs -- hc.ps 0 0 0 0 0 30
masukkan deskripsi gambar di sini

gs -- hc.ps 30 0 0 0 0 30
masukkan deskripsi gambar di sini

gs -- hc.ps 0 0 0 30 30 30
masukkan deskripsi gambar di sini

gs -- hc.ps 45 45 45 0 0 0
masukkan deskripsi gambar di sini

gs -- hc.ps 45 45 45 45 45 45
masukkan deskripsi gambar di sini

Animasi bonus yang baru saja saya buat dengan program ini. Gambar ini sesuai dengan urutan rotasi 0 30 60 0 i i , di mana i berkisar dari 0 hingga 360 oleh 2.
masukkan deskripsi gambar di sini

luser droog
sumber
2
Wow. Jawaban PostScript untuk masalah matematika.
TuxCrafting
@ TùxCräftîñg Sebenarnya tidak ada banyak matematika dalam pertanyaan ini selama Anda dapat melakukan perkalian matriks dengan mudah. Dan saya ingin menulis program ini sejak membaca AK Dewdney's The Armchair Universe .
luser droog
Menambahkan fungsi baru ke pustaka G. Tidak dapat digunakan di sini, tetapi ini memungkinkan versi 307 byte ini .
luser droog
8

C # + Unity, 1060 845 835 byte

C # ≈ Java

Diasumsikan bahwa fungsi ini ada dalam naskah yang ditempatkan di MainCamera.

Sunting:
Terima kasih kepada @TuukkaX untuk saran untuk menyimpan 19 byte Disimpan ~ 200 byte menggunakan siklus Euler.

Golf:

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

Baris baru + lekukan + Cangkang penuh:

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

Saya tidak dapat menemukan rumus sederhana untuk membangun matriks rotasi atau "wajah" yang harus digambar, sehingga memerlukan banyak byte untuk hard-code. Saya meminjam siklus Euler dari @beaker. Juga, built-in Unity sangat verbose.

Anda dapat memverifikasi semua kasus uji online .

Biru
sumber
Ini adalah pertama kalinya saya melihat jawaban C # + Unity di sini. +1
DanTheMan
Saya pikir setiap 0.5fdapat dikurangi menjadi .5fdan 0.01fke .01f. Saya juga berpikir bahwa array integer dapat dipisahkan dengan koma alih-alih mengatakan int[]beberapa kali.
Yytsi
@ Blue Oh, kamu benar! Belum pernah menggunakan C # untuk sementara jadi saya tidak yakin dengan tip terakhir.
Yytsi
@TuukkaX Abaikan komentar saya sebelumnya, saya bisa menggunakan int[,]. Tetap terima kasih.
Biru
Anda masih memiliki Vector4(0.5f,0.5f,0.5f,0.5f)yang bisa direduksi menjadi Vector4(.5f,.5f,.5f,.5f).
Yytsi
6

Javascript ES6, 584 byte

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)

"Tidak Disatukan":

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

Lihat dalam aksi (dimodifikasi untuk terus berputar):

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>

Fungsi mengembalikan objek kanvas HTML5, Anda perlu menambahkannya ke halaman dengan melakukan document.body.appendChild(f(0,0,0,0,0,0))misalnya.

Saat ini, rotasi diterapkan rusak, saya sedang mengerjakan pemesanan ulang, tetapi seperti, itu memutar hypercube dengan benar.

Dendrobium
sumber
Pintar, butuh beberapa saat untuk mencari tahu apa yang Anda lakukan dengan transformasi matriks. : D Juga, saya tidak dapat membuat cuplikan kode Anda berfungsi ... ini memberi saya "Kesalahan Skrip" yang tidak membantu. dalam baris 0.
gelas kimia
@ speaker Apa browser yang Anda gunakan? Saya sudah mengujinya di Firefox terbaru.
Dendrobium
Saya di Safari 9.1.1. Biarkan saya mencoba yang lain.
Gelas kimia
1
Yap, Chrome bekerja dengan baik.
Gelas kimia
1
Safari itu omong kosong. Jangan menggunakannya untuk memeriksa apakah ada yang berhasil.
Patrick Roberts
1

Mathematica, 453 415 byte *

Dipersingkat dengan menggunakan tur Euler dan membersihkan semuanya menjadi satu pernyataan tanpa mendefinisikan fungsi dalam variabel. Ini membuat kode lebih lambat karena beberapa alasan. Saya menduga Mathematica mengevaluasi kembali fungsi beberapa kali sekarang karena mereka tidak disimpan dalam variabel.

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}}]]]

* Saya menghitung °dan== sebagai byte tunggal karena masing-masing direpresentasikan sebagai karakter tunggal dalam Mathematica. Saya pikir ini adil karena banyak bahasa menggunakan pengkodean karakter aneh.

Tidak dikoleksi dengan komentar. Masukan dikodekan di bagian atas sebagai a={30,0,0,0,0,30};. Saya tidak menghitungnya terhadap skor saya.


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

masukkan deskripsi gambar di sini

405 10 -14 -8 -9 205

masukkan deskripsi gambar di sini

dylnan
sumber