Намалюйте простий кубик


10

У нас немає жодного виклику, як намалювати реальний тривимірний куб, тож ось це:

Виклик

Ваше завдання - намалювати повернутий кубик з перспективою. Це може бути в окремому вікні або як зображення.

Вхідні дані

Ваш вхід - 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). The. куб також повинен бути повністю видимим і займати не менше 50% рамки малювання. Камера повинна дивитися в позитивному напрямку z на куб.

Обертання куба застосовуються в порядку x-> y-> z.

Куб обертається навколо його центру, він не рухається.

Для проектування куба на 2d простір потрібно розділити координати x і y куба на відстань, паралельне осі z між точкою та камерою.

Правила

Бібліотеки візуалізації дозволені, але вершини повинні бути визначені в коді. Немає модельного класу 3d кубів.

Тестові справи

введіть тут опис зображення


1
Чи повинен це бути каркас?
Rɪᴋᴇʀ

Хочете включити алгоритм для балів?
Leaky Nun

3
У якому порядку / напрямі проводяться обертання? Звідки дивиться камера? Яку проекцію ми маємо використовувати?
flawr

6
Але, як я вже сказав, обертання не вийде. Як ви це визначили зараз, куб буде переміщений з поля зору, якщо, наприклад, повернути його навколо осі x. Будь ласка, використовуйте пісочницю .
flawr

6
@ EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. Ні , виклики повинні містити якомога більше матеріалів та інформації, необхідних для їх вирішення, включених до основної публікації . Мені не потрібно було йти на гуглінг чи у Вікіпедію лише для того, щоб почати розуміти.
кіт

Відповіді:


2

Взуття (Ruby) 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)}}

Дзвінок з командного рядка, наприклад shoes cube3d.rb 0 30 0

Ідея полягає в тому, щоб одночасно генерувати / обертати чотири вершини тетраедра в 3d. Потім, оскільки вони зменшуються до 2d, ми генеруємо чотири вершини зворотного тетраедра (загалом 8 вершин - куби.) Це дає 4 пари вершин, що відповідають 4 діагоналям тіла. Нарешті 2d вершини з'єднані лініями: кожна вершина вихідного тетраедра повинна бути з'єднана з кожною вершиною зворотного тетраедра, що утворює 12 ребер і 4 діагоналі тіла куба. Впорядкування забезпечує діагоналі корпусу не нанесеними.

Вихід тестових випадків

Зауважте, що, щоб відповідати останнім двом тестовим випадкам, обертання навколо осі z відбувається за годинниковою стрілкою від POV переглядача. Це, здається, суперечить специфікації. Напрямок обертання можна змінити, змінивши *i**c->/i**c

введіть тут опис зображення

неозорий

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

Зауважте, що з історичних причин у рядку 9 застосовується коефіцієнт масштабу 90 (вибраний таким же, як 90 градусів у лінії 2 для гольфу), але врешті-решт, переваги в гольфі в використанні саме цього значення не було, тому він став довільний вибір.


3

HTML / CSS / JS, 739 байт, ймовірно, не конкуруючий

Але я просто хотів показати 3D-перетворення CSS.


Це насправді виглядає досить акуратно. Я раніше зазнавав перетворень CSS3, але у мене виникли проблеми.
Балінт

Вам здається, що обертання в неправильному порядку. Це повинно бути x, то y, то z. Ви маєте z тоді y, то x. @ Bálint може підтвердити.
Рівень р. Св.

@LevelRiverSt Коли я писав це, я не знав, яким має бути порядок, і я не міг опрацювати це з тестових випадків, тому дякую за оновлення. Я також перевернув напрямок обертання X, тому тепер я співпадаю з усіма тестовими випадками.
Ніл

Ви все ще можете надати кількість байтів? Навіть якщо відповіді не є змагальними, вони завжди повинні мати кількість байтів
Downgoat

@Downgoat Гольфірований чи невольф?
Ніл

0

Клен, 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
Так, для використання POV-проміння це чудова програма. На жаль, тепер правила стверджують, що жоден 3d куб клас не може бути використаний.
милі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.