Gwiazdy papierowe są ważną rzeczą w mojej rodzinie na święta, więc pomyślałem, że wirtualna będzie fajna.
Poniżej znajduje się obraz zwykłego dwunastościanu (z https://en.wikipedia.org/wiki/Dodecahedron , przypisanego autorowi wspomnianemu tam.)
Proces stelowania (wikipedia) po zastosowaniu do wielościanu obejmuje wydłużanie twarzy, aż przecinają inne twarze. W ten sposób zaczynając od zwykłego dwunastościanu, otrzymujemy następujące kształty:
Mały dwunastościan gwiaździsty, dwunastościan wielki i dwunastościan gwiaździsty
Zdjęcie z http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Są to trzy możliwe Stellacje dwunastościanu (Wolfram). Tworzą naturalną progresję od dwunastościanu do małego gwiaździstego dwunastościanu, wielkiego dwunastościanu i wielkiego dwunastościanu gwiaździstego, gdy rozszerzamy twarze coraz dalej.
Zadanie
Twój program lub funkcja powinna wyświetlać lub wyświetlać w pliku obrazu jedną z następujących wielościanów: Zwykły dwunastościan, Mały dwunastościan gwiaździsty, Wielki dwunastościan wielki lub Dwunastościan wielki .
Schemat kolorów powinien być taki jak na drugim obrazku powyżej. Każda z sześciu par przeciwległych twarzy będzie miała jeden z sześciu kolorów: czerwony, żółty, zielony, cyjan, niebieski i magenta. Możesz użyć domyślnych kolorów z tymi nazwami w swoim języku lub w dokumentacji lub użyć kolorów FF0000, FFFF00, 00FF00, 00FFFF, 0000FF i FF00FF (możesz je stonować, zmniejszając intensywność do minimum 75% w razie potrzeby, na przykład poprzez zmniejszenie F do C.)
Zauważ, że definiujemy „twarz” jako wszystkie obszary w tej samej płaszczyźnie. Zatem na zdjęciach powyżej przednia twarz jest żółta (a równoległa tylna twarz również byłaby żółta).
Tło powinno być czarne, szare lub białe. Krawędzie można pominąć, ale powinny być czarne, jeśli zostaną narysowane.
Zasady
Wyświetlany wielościan musi mieć szerokość od 500 do 1000 pikseli (szerokość jest definiowana jako maksymalna odległość między dowolnymi dwoma wyświetlanymi wierzchołkami).
Wyświetlany wielościan musi być rzutowany perspektywicznie (punkt widzenia co najmniej 5 szerokości od wielościanu) lub rzut ortograficzny (w rzeczywistości rzut perspektywiczny z punktem widzenia w nieskończoności).
Wielościan musi być możliwy do wyświetlenia pod dowolnym kątem. (Niedopuszczalne jest wybranie najłatwiejszego możliwego kąta i zrobienie zakodowanego kształtu 2D). Kąt może być określony przez użytkownika na jeden z następujących sposobów:
Wprowadzanie trzech kątów odpowiadających trzem obrotom, od standardowej wartości, lub jako parametry funkcji lub wiersza poleceń. Mogą to być albo kąty Eulera (gdzie pierwszy i ostatni obrót dotyczą tej samej osi) lub kąty Tait-Bryan (gdzie każdy obrót jest wokół osi x, y i z) https://en.wikipedia.org/ wiki / Euler_angles (najprościej mówiąc, wszystko idzie tak długo, jak długo każdy obrót dotyczy osi x, y lub z, a kolejne obroty dotyczą osi prostopadłych.)
Możliwość obracania wielościanu w krokach nie większych niż 10 stopni wokół osi xiy oraz odświeżania wyświetlacza dowolną liczbę razy (przy założeniu, że oś Z jest prostopadła do ekranu).
Wielościan musi być pełny, a nie szkieletowy.
Żadne wbudowane funkcje do rysowania wielościanów nie są dozwolone (patrzę na ciebie, Mathematica!)
Punktacja
To jest codegolf. Najkrótszy kod w bajtach wygrywa.
Bonusy
Pomnóż swój wynik przez 0,5, jeśli nie używasz wbudowanych narzędzi do rysowania 3D.
Pomnóż swój wynik przez 0,7, jeśli możesz wyświetlić wszystkie trzy stellacje dwunastościanu, wybierane przez użytkownika przez liczbę całkowitą 1-3 wprowadzoną ze standardowego wejścia lub przez funkcję lub parametr wiersza poleceń.
Jeśli wybierzesz oba bonusy, Twój wynik zostanie pomnożony przez 0,5 * 0,7 = 0,35
Przydatne informacje (źródła jak poniżej)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
Dwunastościan ma 20 wierzchołków. 8 z nich tworzy wierzchołki sześcianu o następujących współrzędnych kartezjańskich (x, y, z):
(± 1, ± 1, ± 1)
Pozostałe 12 to: phi to złoty podział
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
Wypukły kadłub małego gwiaździstego dwunastościanu i wielkiego dwunastościanu jest oczywiście regularnym dwunastościanem. Zewnętrzne wierzchołki opisują dwudziestościan.
Według Wikipedii 12 wierzchołków dwudziestościanu można opisać w podobny sposób, jak cykliczne permutacje (0, ± 1, ± φ). Zewnętrzne wierzchołki małego gwiaździstego dwunastościanu i wielkiego dwunastościanu (w tej samej skali co dwunastościan powyżej) tworzą większy dwudziestościan, w którym współrzędne wierzchołków są cyklicznymi permutacjami (0, ± φ ^ 2, ± φ).
Kąty między ścianami dla dwunastościanu i dwudziestościanu wynoszą odpowiednio 2 arctan (phi) i arccos (- (√5) / 3).
Aby uzyskać porady dotyczące obracania, zobacz https://en.wikipedia.org/wiki/Rotation_matrix
EDYCJA: Przez pomyłkę zezwoliłem na zwykły dwunastościan i nie mogę go teraz wycofać. Premia x0,7 za narysowanie wszystkich trzech gwiaździstych wielościanów pozostaje. W Nowy Rok wydam nagrodę w wysokości 100 za odpowiedź, która może wyświetlać większość czterech wielościanów, z najkrótszym kodem jako rozstrzygnięciem remisu.
Polyhedrondata
jest niedozwolony, ponieważ jest wyraźnie wbudowanym narzędziem do rysowania wielościanów. Jeśli twoja odpowiedź nie używa wbudowanych funkcji do rysowania wielościanów i jest zgodna z innymi zasadami, to jest do przyjęcia. Chodzi o to, że biorąc pod uwagę fakt, że musisz odpowiednio pokolorować twarze, i tak Polyhedrondata
byś cię nie oszczędził, więc w praktyce może to być nieco arbitralne ograniczenie. Zgadzam się do pewnego stopnia, ale jest to bardziej sprawiedliwe dla wszystkich, jeśli uniknę zmiany zasad po opublikowaniu.
dodecahedron
) Są niedozwolone. Niektóre języki mają możliwości budowania modeli 3D za pomocą poleceń takich jaktriangle[[a,b,c],[p,q,r],[x,y,z]]
. Języki te mają na ogół wbudowane funkcje obracania i wyświetlania modelu, automatycznie dbając o to, aby nie wyświetlać ukrytych twarzy itp. Takie rozwiązania są dozwolone, ale nie przyciągną premii. Celem premii jest umożliwienie konkurowania językom, które nie mają tych udogodnień, a także przyciągnięcie ciekawszych rozwiązań.