หมุนไฮเปอร์คิวบ์


27

บทนำ

hypercube / tesseract เทียบเท่ากับ 4 มิติของคิวบ์ปกติ มันทำโดยนำลูกบาศก์สุทธิขยายไปยังมิติที่ 3 จากนั้นใช้มิติที่ 4 พับลงในไฮเปอร์คิวบ์ มันคือลูกบาศก์โดยที่แต่ละด้านเป็นลูกบาศก์

ในการสร้างไฮเปอร์คิวบ์คุณต้องมี 16 เวกเตอร์ 4 มิติ (เวกเตอร์ที่มีxa y, a zและ a 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

ด้วยข้อมูลทั้งหมดนี้คุณมีเทคนิค hypercube ในรหัส ในการหมุนคุณต้องมีเมทริกซ์ที่แตกต่างกัน 6 ตัวสำหรับแต่ละระนาบการหมุนหนึ่งอันสำหรับเครื่องบิน YZ, XZ, XY, XW, YW และ ZW หลังจากที่คุณมีเมทริกซ์ทุกตัวคุณจะต้องคูณยอดของลูกบาศก์กับพวกเขา

ภาพต่อไปนี้แสดงโครงสร้างของแต่ละเมทริกซ์:

สำหรับการหมุนบนเครื่องบิน YZ:

สำหรับการหมุนบนระนาบ XZ:

สำหรับการหมุนบนระนาบ XY:

สำหรับการหมุนบนระนาบ XW:

สำหรับการหมุนบนระนาบ YW:

สำหรับการหมุนบนระนาบ ZW:

การหมุนจะถูกนำไปใช้ตามลำดับนี้

หลังจากทั้งหมดนี้คุณมี hypercube ที่หมุน ตอนนี้คุณต้องวาดมัน คุณควรใช้การฉายฉากร่วมกับการฉายมุมมองที่จะส่งไปยัง(x, y, z, w)(2x/(2+z), 2y/(2+z))

อินพุต

ข้อมูลของคุณคือ 6 จำนวนเต็มระหว่าง 0 (รวม) และ 360 (เฉพาะ) สิ่งเหล่านี้แสดงถึงการหมุนเป็นองศาในระนาบการหมุนที่แตกต่างกันของไฮเปอร์คิวบ์

เอาท์พุต

ผลลัพธ์ของคุณควรเป็นภาพเดียวที่มีไฮเปอร์คิวบ์ การแสดงผลอาจเป็นภาพแรสเตอร์หรือภาพเวกเตอร์หรือศิลปะ 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 มิติ
Peter Taylor

2
@luserdroog ฉันคิดว่า 'U' ต้องเป็น 'N'
บีกเกอร์

2
@ Bálintขอบคุณสำหรับความท้าทายฉันสนุกกับมัน หวังว่าเราจะได้รับคำตอบเพิ่มเติมและแนวทางที่แตกต่างกัน : D
บีกเกอร์

คำตอบ:


9

Octave, 474 433 429 bytes

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

เมทริกซ์การหมุนยังคงใช้จำนวนมากของไบต์ แต่วงจร Eulerian ทำงานได้ค่อนข้างดีลดจำนวนจุดยอดเยี่ยมจาก96 120 ลงเหลือ 33

จุดยอดถูกสร้างขึ้นโดยใช้การแทนค่าไบนารี่ 4 บิต[0:15]และพิจารณา msb เป็นพิกัด x และ lsb พิกัด w

แก้ไข: การคูณเมทริกซ์การหมุนล่วงหน้าทั้งหมดเป็นฝันร้ายซึ่งเป็นสาเหตุที่ฉันไม่ได้ใช้ในตอนแรก ตอนนี้เพื่อค้นหาชุดค่าผสมที่เหมาะสมที่สุด :) การคูณเมทริกซ์ด้วยสามนั้นแย่กว่าไม่มีการคูณล่วงหน้าเลยดังนั้นฉันจะมีความสุขกับวิธีการจับคู่ที่ชาญฉลาด


เอาท์พุท:

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 ใช่แล้วเมทริกซ์ที่คูณเต็มออกมาประมาณสองเท่าถ้าฉันจำได้อย่างถูกต้อง
บีกเกอร์

สิ่งนี้ควรจะเป็นมากกว่านี้เพลิดเพลินไปกับ "simplifications" ที่โง่ที่สุดของ 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และG

แก้ไข: -343การสร้างการเข้ารหัสแบบไบนารีของเวกเตอร์และวงจรออยเลอร์ขโมยยืมมาจากคำตอบอื่น ๆ และใช้สตริงไบนารีโทเค็นจากไลบรารี G
แก้ไข: -49นิยามใหม่sin cosและnegชื่อที่สั้นกว่า
แก้ไข: -430 0 0 1 1 0กำหนดชื่อที่สั้นสำหรับลำดับ
แก้ไข: -9 al (ie. 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 LและM) สมัครใหม่ลดลงmoสำหรับmodและสำหรับsu แก้ไข: -12ในบรรทัดฟังก์ชั่นโครงการและวาดและลบ (ตอนนี้ว่าง) พจนานุกรมล้อมรอบ แก้ไข: -36เข้ารหัสวงจร (เช่นใบหน้า ) ในสตริง แก้ไข: -8นิยามของจุดลบอาร์เรย์ ให้ทิ้งไว้บนสแต็กและsub


Vdupสำเนาทำงานได้ตามต้องการ (หนึ่งครั้งในตอนแรกและอีกครั้งในตอนท้ายของลูป) นอกจากนี้ยังมีการแปลผู้ประกอบการจำนวนน้อยจากไบนารี - โทเค็นสตริงกลับไปเป็นชื่อย่อที่ BTS ไม่ได้ประหยัดดังนั้น(I)$ตอนนี้fora(เช่นforall) if duอาจเป็น(T8)$แต่if duเป็นตัวเลือกที่ดีกว่าอย่างชัดเจน (มันเป็นกอล์ฟไม่ใช่การทำให้งงงวยต่อ se) นอกจากนี้ยังดำเนินการscale ก่อน translateดังนั้นพิกัดแปลสามารถ3และ4แทนและ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 4และ100ในบรรทัดแรกของบล็อกที่สองจะพารามิเตอร์ที่เป็นตัวแทนของศูนย์ x, ศูนย์-Y และขนาดตามลำดับของการวาดภาพบนหน้าเว็บ (พิกัดศูนย์จะมีการปรับขนาดโดยscale) (300,400) เป็นศูนย์กลางของกระดาษขนาดตัวอักษรสหรัฐอเมริกา (612,792) ในหน่วย PS

หากคุณสามารถติดตาม postscript ได้สิ่งที่แปลกประหลาดที่สำคัญคือบล็อกโพรซีเดอร์โดยนัยและสตริงตัวดำเนินการที่เข้ารหัส ดังที่แสดงโดยความคิดเห็นในเวิร์กไฟล์ด้านล่างแต่ละบรรทัดของบล็อกแรกนั้นมีชื่อโดยปริยายโดย A, B, C ฯลฯ ดังนั้นเช่น จะผลิตF E D 1 0 0 1 0 0สำหรับสตริงโอเปอเรเตอร์ที่เข้ารหัสสิ่งใด ๆ ที่เป็นข้อโต้แย้ง$ #หรือ@เป็นลำดับของการเรียกโอเปอเรเตอร์โดยใช้ไบต์เพื่อเลือกโอเปอเรเตอร์จากตารางชื่อระบบ PLRM 3ed ภาคผนวก F. ฟีเจอร์เหล่านี้และอื่น ๆ ตอนนี้รวมถึงฟังก์ชั่น mat.ps ด้วย)

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 และแสดงความคิดเห็นเบา ๆ :

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โดยที่ฉันอยู่ในช่วงตั้งแต่ 0 ถึง 360 คูณ 2
ป้อนคำอธิบายรูปภาพที่นี่


2
ว้าว. คำตอบ PostScript สำหรับปัญหาทางคณิตศาสตร์
TuxCrafting

@ TùxCräftîñgมีคณิตศาสตร์ไม่มากในคำถามนี้ตราบใดที่คุณสามารถทำการคูณเมทริกซ์ได้อย่างง่ายดาย และฉันอยากจะเขียนโปรแกรมนี้นับตั้งแต่อ่าน AK กดิวด์ของเก้าอี้จักรวาล
luser droog

เพิ่มฟังก์ชั่นใหม่ในห้องสมุด G ไม่สามารถใช้ที่นี่ แต่อนุญาตรุ่น 307 ไบต์นี้
luser droog

8

C # + Unity, 1060 845 835 ไบต์

C # ≈ Java

MainCameraสันนิษฐานว่าฟังก์ชั่นนี้อยู่ในสคริปต์ที่วางอยู่บน

แก้ไข:
ขอบคุณ @TuukkaX สำหรับคำแนะนำในการบันทึก 19 ไบต์บันทึกไว้ ~ 200 ไบต์โดยใช้วงจร Eulerian

แข็งแรงเล่นกอล์ฟ:

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

ฉันไม่สามารถหาสูตรง่าย ๆ สำหรับการสร้างเมทริกซ์การหมุนหรือ "ใบหน้า" ที่ต้องวาดดังนั้นค่าใช้จ่ายจำนวนมากจึงต้องใช้รหัสยาก ฉันยืมวงจร Eulerian จาก @beaker นอกจากนี้ Unity บิวด์อินยังมีความละเอียดมาก

คุณสามารถตรวจสอบกรณีทดสอบทั้งหมดออนไลน์


นี่เป็นครั้งแรกที่ฉันเห็นคำตอบ C # + Unity ที่นี่ +1
DanTheMan

ผมคิดว่าทุกคน0.5fสามารถลดลงได้.5fและจะ0.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

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)

"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

ดูการทำงาน (แก้ไขเพื่อหมุนอย่างต่อเนื่อง):

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

ฉันใช้ Safari 9.1.1 ให้ฉันลองอันอื่น
บีกเกอร์

1
ใช่ Chrome ทำงานได้ดี
บีกเกอร์

1
Safari เป็นเรื่องไร้สาระ อย่าใช้มันเพื่อตรวจสอบว่ามีบางสิ่งทำงานได้หรือไม่
Patrick Roberts

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

* ฉันนับ°และนับ==เป็นไบต์เดียวเนื่องจากมันถูกแทนด้วยอักขระเดียวใน 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

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.