Bir köprüyü döndür


27

Giriş

Bir hiper küp / tesseract normal bir küpün 4 boyutlu eşdeğeridir. Bir küp ağı alıp 3. boyuta genişletmek, sonra - 4. boy kullanmak - bir hiperküp içine katlamak suretiyle yapılır. Temel olarak her iki tarafın küp olduğu bir küp.

Bir hiper küp oluşturmak için 16 4d vektöre ihtiyacınız var ( xa y, a zve a wbileşenli bir vektör ). Bu vektörler aşağıdaki gibidir:

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

Hiper küpün 24 yüzü var. Aşağıdaki liste hepsini içerir (her grup bir dörtlü işaretler):

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

Tüm bu bilgilerle birlikte, teknik olarak kodda bir hiper küpünüz var. Bunu döndürmek için, her bir dönme düzlemi için 6 farklı matris gerekir, biri YZ, XZ, XY, XW, YW ve ZW düzlemleri için. Her matrisi aldıktan sonra, küpün köşelerini onlarla çarpmanız gerekir.

Aşağıdaki resimler her bir matrisin yapısını gösterir:

YZ düzlemindeki dönüş için:

XZ düzlemindeki dönüş için:

XY düzlemindeki dönüş için:

XW düzlemindeki dönüş için:

YW düzlemindeki dönüş için:

ZW düzlemindeki dönüş için:

Rotasyonlar bu sırayla uygulanır.

Bütün bunlardan sonra, döndürülmüş bir hiper küpünüz var. Şimdi çizmelisin. Göndermek (x, y, z, w)için perspektif projeksiyon ile birlikte ortogonal bir projeksiyon kullanmalısınız (2x/(2+z), 2y/(2+z)).

Giriş

Girişiniz 0 (yalnızca) ve 360 ​​(yalnızca) arasında 6 tamsayıdır. Bunlar, hiper küpün farklı dönme düzlemlerinde derece cinsinden dönmeleri temsil eder.

Çıktı

Çıktınız köprüyü içeren tek bir görüntü olmalıdır. Ekran, rasterleştirilmiş bir görüntü, bir vektör görüntüsü veya bir ASCII resmi olabilir. Çıktı görüntüsü en az 100 * 100 piksel olmalıdır ve küpün ekranın en az% 50'sini alması gerekir. Herhangi bir varsayılan görüntü çıkış formatına izin verilir.

Test durumları

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

Görüntüleri tam boyutlu görmek için yeni bir sekmede açın.

kurallar

  • Varsayılan kurallar geçerlidir
  • Standart boşluklar yasaktır
  • Bayt cinsinden en kısa kod kazanır

Diğer postayı neden bombaladın?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Son bir inceleme için sohbete gönderdim
Bálint

7
Sanal alanda iki ayrı olaya dikkat çektiğim gibi, gösterim için projeksiyonun tanımı eksiktir çünkü yansıtılacak nesnenin 3 boyutlu olduğunu varsayar, aslında 4 boyutlu olduğunu varsayar.
Peter Taylor,

2
@luserdroog 'U' 'N' olmalı bence.
kabı

2
@ Bálint Mücadele için teşekkürler, çok memnun oldum. Umarım daha fazla cevap ve farklı yaklaşımlar alırız. : D
kabı

Yanıtlar:


9

Octave, 474 433 429 bayt

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

Döndürülmüş:

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

Dönme matrisleri hala çok fazla bayt tüketir, ancak Eulerian döngüsü 96 120'den 33'e kadar olan köşelerin sayısını azaltarak oldukça iyi çalıştı .

Vertices, 4-bitlik ikili gösterimi [0:15]alarak ve msb'nin x-koordinatı ve lsb'nin w-koordinatı olduğu düşünülerek üretilir .

Düzenleme: Tüm dönme matrislerinin önceden çarpılması bir kabustu, bu yüzden başlangıçta kullanmamıştım, ancak bunları 41 bayt kaydedilen çiftler halinde önceden çarpmak. Şimdi optimum kombinasyonları aramak için. :) Matrisleri üçlü ile çarpmak, hiç ön çarpmadan çok daha kötüydü, bu yüzden eşli yaklaşımla mutlu olacağım.


Çıktı:

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)


Düzenleme: Ben aptalım. her yerde aynı değişkeni kandırdın ... [Tam çarpım matrisini istemediğinizden emin misiniz? :) i.imgur.com/nkM6y6g.png]
algmyr

@algmyr Evet, tam olarak çarpılan matris, doğru hatırlıyorsam iki kat fazla çıktı.
beher

Bu daha çok olmalı, Maxima'nın
algmyr

Matematikte perişan olmayı telafi etmek için, kodunuzun daha golf bir versiyonu, 330 bayt: paste.ee/p/2GRyJ
algmyr

14

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

Mat.ps ve G kullanır .

Düzenleme: -343 Uygulamalı ikili kodlama vektörleri üretimi ve Eulerian devreçalınandiğer cevaplardan ödünç alındı. Ve G kütüphanesinden ikili token-stringleri uyguladı.
Düzenleme: -49 Yeniden tanımlandı sin cosve negdaha kısa isimler için.
Düzenleme: -43 Diziler için tanımlanmış kısa isimler 0 0 0 1 1 0.
Düzenleme: -9 al (yani aload) daha kısa (")@. Faktörlü 3 , hiçbir şey yapmamak pahasına idi(yani idiv) çağırır 1 idiv.
Düzenleme: -30 G'nin uygulamalı örtük tanım bloğu .
Düzenleme: -10 Birkaç üçlü daha kullanılan diziler.
Düzenleme: -45i j k l m n Açıların değişkenlerini kaldırın ve her zaman geçerli açıyı tanımlayın tve açıların işlevleri (global) değerini kullanın.tdeğişken. Döndürme matrisinin kod tanımının, tdeğeri hazır oluncaya kadar yürütülmesini erteleyin .
Düzenleme: -3 Kaldır <16>$yani. closepath. Ve bir boşluk.
Düzenleme: -16 Dönme matrislerinde ( J K Lve M) birim vektörlerden faktörü belirleme dizisi parantezleri . Yeniden uygula düştü moiçin modve suiçin sub.
Düzenleme: -12 Proje ve çizim fonksiyonu satır içi ve (şimdi boş) çevreleyen sözlüğü kaldırın.
Düzenleme: -36 Bir dizedeki devreyi (yani yüzleri ) kodladı.
Düzenleme: -8 Köşe dizisinin tanımını kaldırın V. Bunun yerine, yığında bırakın vedupgerektiği gibi çalışan kopyalar (bir kez, ilk önce ve tekrar döngünün sonunda). Ayrıca, birkaç operatör ikili token dizgilerinden BTS'nin tasarruf sağlamadığı kısaltılmış isimlere geri döndü (I)$, şimdi fora(yani. forall). if duolabilir (T8)$, ama if duaçıkça daha iyi bir seçimdir ( golf , şaşırtma değil). Ayrıca gerçekleştirmek scale önce translate bu kadar çevrilmiş koordinatları olabilir 3ve 4yerine 300ve 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)#

3 4Ve 100ikinci bloğun başında, sayfa çizimin (merkez koordinatları ile ölçeklenerek, sırasıyla, orta-x, merkez-y ve ölçeği temsil eden parametreler scale). (300.400), kabaca ABD harf boyutlu kağıdın (612.792) PS birimlerindeki merkezidir.

Postcript'i kabaca takip edebiliyorsanız, önemli tuhaf şeyler örtük prosedür bloğu ve kodlanmış operatör dizeleridir. Çalışma dosyasındaki yorumlarla gösterildiği gibi, ilk bloğun her bir satırı örtük olarak A, B, C, vb. F E Düretecekti 1 0 0 1 0 0. Kodlanmış işleç dizgileri için, sistem adı tablosundan işleçleri seçmek için baytları kullanan PLRM 3ed Ek F argümanı olan $ #veya işleç dizisi olan herhangi bir şey @, PLR 3ed Ek F. şimdi de mat.ps işlevlerini içerir).

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

Ungolfed ve hafifçe yorum yaptı:

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

Çıktılarımdan bazıları, soru örneklerinin ayna görüntüleridir.

Çünkü gs -- hc.ps 0 0 0 0 0 0, alıyorum:
görüntü tanımını buraya girin

gs -- hc.ps 0 0 0 0 0 30
görüntü tanımını buraya girin

gs -- hc.ps 30 0 0 0 0 30
görüntü tanımını buraya girin

gs -- hc.ps 0 0 0 30 30 30
görüntü tanımını buraya girin

gs -- hc.ps 45 45 45 0 0 0
görüntü tanımını buraya girin

gs -- hc.ps 45 45 45 45 45 45
görüntü tanımını buraya girin

Bonus programı sadece bu programla yaptım. Bu görüntü , 0 ila 360 x 2 arasında değişen, 0 30 60 0 i i dönüş sırasına tekabül eder .
görüntü tanımını buraya girin


2
Vay. Matematiksel bir problem için PostScript cevap.
TuxCrafting

@ TùxCräftîñg Matris çarpımını kolayca yapabildiğiniz sürece, bu soruda aslında çok fazla matematik yok. AK Dewdney'nin The Armchair Universe'ı okuduğundan beri bu programı yazmak istedim .
luser droog

G kütüphanesine yeni fonksiyonlar eklendi. Burada kullanılamaz, ancak bu 307 bayt sürümüne izin verir .
kullanıcı lüzgâhı

8

C # + Birlik, 1060 845 835 bayt

C # ≈ Java

Bu işlevin yerleştirilmiş bir komut dosyasında olduğunu varsayar MainCamera.

Düzenleme:
Eulerian döngüsünü kullanarak 19 bayt Kaydedilen ~ 200 bayt tasarruf önerisi için @TuukkaX'a teşekkürler.

golfed:

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

Newlines + girinti + Tam kabuk:

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

Rotasyon matrislerini oluşturmak için basit bir formül ya da çizilecek olan "yüzleri" bulamadım, böylece kod için çok sayıda bayta mal oldu. Eulerian döngüsünü @beakerdan ödünç aldım. Ayrıca, Birlik yerleşikler son derece ayrıntılı.

Tüm test durumlarını çevrimiçi olarak doğrulayabilirsiniz .


İlk kez burada C # + Unity cevabı görüyorum. +1
DanTheMan

Her düşünüyorum 0.5findirgenebilir .5fve 0.01fiçin .01f. Ayrıca, tamsayı dizilerinin int[]birden çok kez söylemek yerine virgülle ayrılabileceğini düşünüyorum .
Yytsi

@Blue Oh, haklısın! Bir süredir C # kullanmıyorum, bu yüzden son ipucundan emin değildim.
Yytsi,

@TuukkaX Önceki yorumumu yoksay, kullanabilirim int[,]. Yine de teşekkürler.
Mavi,

Hala, Vector4(0.5f,0.5f,0.5f,0.5f)indirgenebilecek bir şeye sahipsin Vector4(.5f,.5f,.5f,.5f).
Yytsi

6

Javascript ES6, 584 bayt

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)

"Ungolfed":

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

Hareket halinde görün (sürekli döndürmek için değiştirildi):

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>

İşlev bir HTML5 canvas nesnesini döndürür, document.body.appendChild(f(0,0,0,0,0,0))örneğin bunu yaparak sayfaya eklemeniz gerekir .

Şu anda, rotasyonlar sıra dışı olarak uygulanıyor, yeniden sıralama üzerinde çalışıyorum, ancak olduğu gibi bir köprüyü doğru döndürüyor.


Zekice, matris dönüşümleriyle ne yaptığınızı anlamak biraz zaman aldı. : D Ayrıca, kod pasajınızın çalışmasını sağlayamıyorum ... bu bana yardımcı olmayan bir "Script hatası" veriyor. 0. satır
beher

@beaker Hangi tarayıcıyı kullanıyorsunuz? En son Firefox'ta test ettim.
Dendrobium

Safari 9.1.1'deyim. Başka bir tane deneyeyim.
kabı

1
Evet, Chrome gayet iyi çalışıyor.
kabı

1
Safari berbat. Bir şeyin çalışıp çalışmadığını kontrol etmek için kullanmayın.
Patrick Roberts

1

Mathematica, 453 415 bayt *

Eulerian turunu kullanarak kısaltılmış ve değişkenlerdeki işlevleri tanımlamaksızın hepsini tek bir ifadede temizlemiş. Bu, nedense kodu yavaşlatır. Tahmin ediyorum ki, Mathematica, bir değişkende saklanmadıkları için fonksiyonları birçok kez yeniden değerlendiriyor.

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

* Ben sayma duyuyorum °ve ==tek bayt olarak her onlar Mathematica tek karakter olarak temsil edilir beri. Bence birçok dil garip karakter kodlamaları kullandığı için bunun adil olduğunu düşünüyorum.

Yorumlarla Ungolfed. Giriş, üstte olduğu gibi kodlanmıştır a={30,0,0,0,0,30};. Bunu puanlarıma karşı saymadım.


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

görüntü tanımını buraya girin

405 10 -14 -8 -9 205

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.