วาดลูกบาศก์ง่ายๆ


10

เราไม่ได้มีความท้าทายเดียวเกี่ยวกับการวาดลูกบาศก์ 3 มิติที่แท้จริงดังนั้นที่นี่จะไป:

ท้าทาย

งานของคุณคือการวาดลูกบาศก์หมุนด้วยมุมมอง สามารถอยู่ในหน้าต่างแยกต่างหากหรือเป็นภาพ

อินพุต

ข้อมูลที่คุณป้อนเป็นตัวเลข 3 หมายเลขที่แยกกันระหว่าง 0 ถึง 359.99 ... สิ่งเหล่านี้แสดงถึงการหมุนรอบแกน x, y และ z ในหน่วยองศา

0 0 0
30 0 40
95 320 12

เอาท์พุต

คุณสามารถแสดงในหน้าต่างแยกต่างหากหรือบันทึกรูปภาพ คุณสามารถใช้การแสดงผลทุกประเภท (แบบเวกเตอร์, แบบแรสเตอร์, ฯลฯ )

แก้ไข: อนุญาตให้ใช้ ASCII ได้เช่นกันเพื่ออนุญาตให้ใช้ภาษาการเล่นกอล์ฟที่มีเอาต์พุตแบบข้อความเท่านั้น

เอาต์พุตสำหรับกราฟิกแรสเตอร์หรือ ASCII ต้องมีอย่างน้อย 50 * 50 (พิกเซลสำหรับการแรสเตอร์และอักขระสำหรับ ASCII)

ข้อมูลเพิ่มเติม

แกน z บวกชี้ออกจากหน้าต่างแกน x เป็นแนวนอนและแกน y เป็นแนวตั้ง โดยทั่วไปมาตรฐาน OpenGL

การหมุนเป็นทวนเข็มนาฬิกาถ้าคุณดูลูกบาศก์ในทิศทางลบของแกนที่เฉพาะเจาะจงเช่นมองลงไปที่แกน y

กล้องควรอยู่บนแกน z ในระยะทางที่เหมาะสมจากลูกบาศก์ในทิศทางลบ z ก้อนควรอยู่ที่ (0; 0; 0) คิวบ์ยังต้องสามารถมองเห็นได้อย่างสมบูรณ์และใช้เวลาอย่างน้อย 50% ของกรอบรูปวาด กล้องควรมองในทิศทางบวกซีที่ลูกบาศก์

การหมุนของคิวบ์ถูกนำไปใช้ในลำดับ x-> y-> z

ลูกบาศก์หมุนรอบจุดศูนย์กลางมันไม่เคลื่อนที่

ในการฉายภาพลูกบาศก์ในพื้นที่ 2 มิติคุณต้องแบ่งพิกัด x และ y ของลูกบาศก์ด้วยระยะทางขนานกับแกน z ระหว่างจุดและกล้อง

กฎระเบียบ

อนุญาตให้แสดงไลบรารีได้ แต่ต้องกำหนดจุดยอดในรหัส ไม่มีคลาสโมเดล cube สามมิติ

กรณีทดสอบ

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


1
มันต้องเป็นโครงร่างไหม?
Rɪᴋᴇʀ

สนใจที่จะรวมอัลกอริทึมสำหรับคะแนนหรือไม่
Leun Nun

3
คำสั่ง / ทิศทางใดที่การหมุนเกิดขึ้น? กล้องมองจากที่ไหน เราต้องใช้การฉายภาพชนิดใด
ข้อบกพร่อง

6
แต่อย่างที่ฉันพูดการหมุนจะไม่ได้ผล ตามที่คุณกำหนดไว้ในตอนนี้คิวบ์จะถูกย้ายออกจากมุมมองหากเช่นหมุนรอบแกน x โปรดใช้Sandbox
ข้อบกพร่อง

6
@ EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. ไม่มีความท้าทายควรมีเท่าของวัสดุและข้อมูลที่จำเป็นในการแก้พวกเขาเป็นไปได้รวมอยู่ในเนื้อหาของโพสต์ ฉันไม่ควรต้องไปที่ Google หรือวิกิพีเดียเพื่อเริ่มทำความเข้าใจ
แมว

คำตอบ:


2

รองเท้า (ทับทิม) 235 231

ทุกสิ่งที่คำนวณจากศูนย์

Shoes.app{p,a,b,c=ARGV.map{|j|j.to_f/90}
k=1+i="i".to_c
p=(0..3).map{|j|y,z=(k*i**(j+a)).rect
x,z=(((-1)**j+z*i)*i**b).rect
q=(x+y*i)*i**c
[90*(k+q/(z-4)),90*(k+q/(4+z))]}
4.upto(15){|j|line *(p[j%4][0].rect+p[(j+j/4)%4][1].rect)}}

โทรจาก commandline เช่น shoes cube3d.rb 0 30 0

แนวคิดคือการสร้าง / หมุนสี่จุดยอดของจัตุรมุขในเวลาเดียวกันพร้อมกัน จากนั้นเมื่อค่าเหล่านี้ลดลงเป็น 2d เราจะสร้างสี่จุดยอดของจัตุรมุขแบบกลับด้าน (รวม 8 จุดยอดเป็นแบบสี่เหลี่ยมจัตุรัส) ทำให้จุดยอด 4 คู่ตรงกับตัวเรือน 4 ตัว ในที่สุดจุดยอด 2d นั้นเชื่อมต่อกันด้วยเส้น: แต่ละจุดยอดของจัตุรมุขเดิมจะต้องเชื่อมต่อกับจุดยอดของจัตุรมุขแบบผกผันในแต่ละรูปนั้นมีขอบ 12 และ 4 เส้นทแยงมุมของลูกบาศก์ การสั่งซื้อทำให้มั่นใจได้ว่าจะไม่ได้วางแผนเส้นทแยงมุมของร่างกาย

กรณีทดสอบการส่งออก

โปรดทราบว่าเพื่อให้สอดคล้องกับกรณีทดสอบสองครั้งล่าสุดการหมุนรอบแกน z นั้นตามเข็มนาฬิกาจากมุมมอง POV เรื่องนี้ดูเหมือนจะขัดแย้งกับสเป็คอย่างไรก็ตาม ทิศทางการหมุนสามารถกลับด้านได้โดยการแก้ไข*i**c ->/i**c

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

ungolfed

Shoes.app{
  p,a,b,c=ARGV.map{|j|j.to_f/90}   #Throw away first argument (script name) and translate next three to fractions of a right angle.
  k=1+i="i".to_c                   #set up constants i=sqrt(-1) and k=1+i

  p=(0..3).map{|j|                 #build an array p of 4 elements (each element wil be a 2-element array containing the ends of a body diagonal in complex number format)
    y,z=(k*i**(j+a)).rect          #generate 4 sides of square: 1+i,i-1,-1-i,-i+1, rotate about x axis by a, and store in y and z as reals 
    x,z=(((-1)**j+z*i)*i**b).rect  #generate x axis displacements 1,-1,1,-1, rotate x and z about y axis by b, store in x and z as reals
    q=(x+y*i)*i**c                 #rotate x and y about z axis, store result in q as complex number
  [90*(k+q/(z-4)),90*(k+q/(4+z))]} #generate "far" vertex q/(4+z) and "near" vertex q/-(4-z) opposite ends of body diagonal in 2d format.

  4.upto(15){|j|                   #iterate through 12 edges, use rect and + to convert the two complex numbers into a 4 element array for line method
    line *(p[j%4][0].rect+         #cycle through 4 vertices of the "normal" tetrahedron
     p[(j+j/4)%4][1].rect)         #draw to three vertices of the "inverted" tetrahedron. j/4=1,2,3, never 0
  }                                #so the three edges are drawn but the body diagonal is not.
}

โปรดทราบว่าด้วยเหตุผลทางประวัติศาสตร์เราใช้อัตราส่วนขนาด 90 ในบรรทัดที่ 9 (เลือกให้เหมือนกับ 90 องศาในบรรทัดที่ 2 สำหรับการเล่นกอล์ฟ) แต่ท้ายที่สุดไม่มีข้อได้เปรียบของการเล่นกอล์ฟในการใช้ค่านี้ดังนั้นจึงกลายเป็น ทางเลือกโดยพลการ


3

HTML / CSS / JS ขนาด 739 อาจไม่ใช่การแข่งขัน

แต่ฉันแค่อยากอวดการแปลง CSS 3D


นี่มันดูเรียบร้อยดีจริงๆ ฉันเคยมีประสบการณ์การแปลง CSS3 มาก่อน แต่ฉันมีปัญหากับมัน
Bálint

คุณดูเหมือนจะมีการหมุนผิดลำดับ มันควรเป็น x จากนั้น y จากนั้น z คุณมี z แล้ว y แล้ว x @ Bálintอาจยืนยัน
เลเวลริเวอร์เซนต์

@ LevelRiverSt เมื่อฉันเขียนสิ่งนี้ฉันไม่ทราบว่าควรจะสั่งซื้ออะไรและฉันไม่สามารถทำมันออกมาจากกรณีทดสอบได้ดังนั้นขอขอบคุณสำหรับการอัปเดตฉัน ฉันได้พลิกทิศทางของการหมุน X ด้วยดังนั้นตอนนี้ฉันจึงจับคู่ทุกกรณีการทดสอบ
Neil

คุณยังคงสามารถนับจำนวนไบต์ได้หรือไม่? แม้ว่าคำตอบจะไม่เป็นการแข่งขัน แต่ก็ควรนับจำนวนไบต์ด้วยเสมอ
Downgoat

@Downgoat เล่นกอล์ฟหรือไม่ได้เล่นกอล์ฟหรือไม่?
Neil

0

Maple, 130 +14 (กำลังดำเนินการ)

with(plots):f:=(X,Y,Z)->plot3d(0,x=0..1,y=0..1,style=contour,tickmarks=[0,0,0],labels=["","",""],axes=boxed,orientation=[Z,-X,Y]);

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

ฟังก์ชันนี้จะแปลงค่าฟังก์ชันคงที่ภายในกล่องจากนั้นใช้ตัวเลือกการพล็อตเพื่อซ่อนเครื่องหมายติ๊กป้ายกำกับและฟังก์ชัน การเพิ่มprojection=.5ตัวเลือกต่าง ๆ จะทำให้กล้องเข้าใกล้ยิ่งขึ้นทำให้สามารถรับชมมุมมองได้
ฉันเขียนสิ่งนี้ก่อนที่รายละเอียดจะได้รับการสรุปและลำดับการหมุนx, y', z''แทนx, y, zแทนจนกว่าฉันจะแก้ไขมุมนี่เป็นวิธีแก้ปัญหาอื่น

POV-Ray, 182

#include"a.txt"
#include"shapes.inc"
camera{location 9*z look_at 0}
light_source{9*z color 1}
object{Wire_Box(<-2,-2,-2>,<2,2,2>,.01,0)texture{pigment{color rgb 1}}rotate<R.x,-R.y,-R.z>}

อ่านอินพุตผ่านa.txtไฟล์ซึ่งควรมี
#declare R=<xx,yy,zz>;
เมื่อxx,yy,zzเป็นมุมการหมุน

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


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