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.
źródło
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ń.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 takPolyhedrondata
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.Odpowiedzi:
Python 2.7, 949 bajtów
Oto rozwiązanie dla zwykłego dwunastościanu wykreślonego przy użyciu matplotlib. Nieprzetworzony zarys kodu niepoznanego (nie pokazanego tutaj) został przedstawiony poniżej:
źródło
Rubinowy, 784 bajtów * 0,5 * 0,7 = 274,4
Moja własna odpowiedź, dlatego nie kwalifikuje się do mojej nagrody.
Kwalifikuje się zarówno do premii wbudowanej innej niż 3D, jak i premii za losowanie wszystkich gwiazd.
Wprowadź jako parametry funkcji
Liczba całkowita 0..3 odpowiadająca dwunastościanowi regularnemu, dwunastościanowi gwiaździstemu, dwunastościanowi gwiaździstemu
Tablica trzech liczb całkowitych odpowiadających kątom stopni dla obrotu wokół osi x, y i x (ponownie) (właściwe kąty Eulera, umożliwiające osiągnięcie dowolnego obrotu).
Wydrukuj plik,
p.svg
który można wyświetlić w przeglądarce internetowej.Wyjaśnienie
tablice x, y, z na dole kodu zawierają współrzędne zewnętrznych punktów jednej powierzchni małego gwiaździstego dwunastościanu. Można to zapisać w dwudziestościanie, którego 12 wierzchołków jest określonych przez cykliczne permutacje (+/- 377, +/- 233, +/- 0). Zauważ, że 377 i 233 są kolejnymi liczbami Fibonacciego, a zatem 377/233 jest doskonałym przybliżeniem złotego stosunku.
dodatkowa tablica w zawiera współrzędne x pomnożone przez -1, co odpowiada odbiciu w płaszczyźnie x. Funkcja f jest wywoływana 6 razy, raz dla każdego koloru, z różnymi cyklicznymi permutacjami x, y, z oraz w, y, z.
Trzy obroty są przekazywane jako parametry w n []. aby użyć grzechu i cos w Ruby, trzeba to zrobić
include Math
. aby tego uniknąć, cosinus i sinus kąta uzyskuje się, podnosząc pierwiastek kwadratowy z -1"i"
do potęgi (kąt w stopniach / 90). Rzeczywiste i urojone części tej liczby są przechowywane w k (cosinus) i l ( sinus)Przed obrotem wymieniane są wartości xiy. Następnie do wartości y i z stosuje się mnożenie macierzy, aby uzyskać obrót wokół osi x. Wymiana wartości umożliwia wykonanie trzech obrotów w pętli.
Do tej pory mamy tylko jeden pierścień punktów. Aby uzyskać resztę, musimy znaleźć środek pięciokąta / gwiazdy. Odbywa się to poprzez znalezienie średniej współrzędnych 5 wierzchołków, które są przechowywane w p, q, r.
Jak wspomniano wcześniej, wykonywane jest tylko jedno wywołanie funkcji na kolor. Testowany jest znak r (średnia współrzędnych z, a zatem współrzędnych twarzy). Jeśli jest pozytywna, twarz jest twarzą przednią i dlatego jest widoczna. Jeśli jest ujemny, twarz jest tylną. Jest niewidoczny i nie mamy wywołania funkcji dla przeciwnej twarzy. Dlatego wszystkie trzy współrzędne muszą zostać odwrócone. Znak r jest przechowywany w e, aby to ułatwić.
Twarz jest zbudowana z 5 trójkątów, których wierzchołki są liniowymi kombinacjami zewnętrznych wierzchołków małego gwiaździstego dwunastościanu i środka twarzy. W przypadku małego gwiaździstego dwunastościanu dla wierzchołków trójkątów ustawiamy a = 1 ib = 0 (wkład 1 z x, y, z i 0 z p, q, r). Dla 2 podstawowych wierzchołków trójkąta ustawiamy c = -0,382 (wkład 1 / złoty stosunek ^ 2 z x, y, z) id = 1,382 (wkład z p, q, r.) Przyczyną ujemnego wkładu jest że wierzchołki podstawy trójkąta są zdefiniowane w kategoriach przeciwnych końców, które znajdują się po przeciwnej stronie twarzy. Otrzymane współrzędne są w razie potrzeby mnożone przez e.
Cztery nienazwane tablice, których wartości są przypisane, aby
a,b,c,d
zawierały wymagane wartości dla zwykłego dwunastościanu, małego dwunastościanu gwiaździstego, wielkiego dwunastościanu i wielkiego dwunastościanu gwiaździstego, wybranych zgodnie ze zmienną.t
Uwaga: dla małego dwunastościanu gwiaździstego i dwunastościanu wielkiego a + b = c + d = 1. Relacja a + b = c + d dotyczy innych kształtów, ale stosowana jest inna skala.Dla każdego trójkąta tworzona jest linia kodu svg. Zawiera identyfikator wyprowadzony z sumy współrzędnych z 3 wierzchołków trójkąta, opis wierzchołków trzech współrzędnych trójkąta i kolor. zauważ, że patrzymy prosto w dół osi Z w rzucie ortograficznym. Zatem 2D x = 3D x i 2D y = 3D y. Linia zostanie dodana do
h.
na koniec, po zakończeniu wszystkich wywołań funkcji, h jest sortowane tak, że trójkąty o najwyższej wartości z (z przodu) są drukowane na końcu, a całość jest zapisywana jako plik svg z odpowiednim tekstem nagłówka i stopki.
Niegolfowany w programie testowym
Wynik
dla małego gwiaździstego dwunastościanu (wkrótce doda kilka zdjęć innych wielokątów)
1,0,0,0 pozycja domowa
1,30,0,0 obróć o 30 stopni w dół
1,0,30,0 obróć w prawo o 30 stopni (uwaga: dla idealnego widoku z boku obrót wyniósłby
atan(1/golden ratio)
= 31,7 stopni, stąd nadal możemy zobaczyć mały kawałek niebieskiego)1,0,20,0 obróć w prawo o 20 stopni
1,60, 10, -63 obrót w dół, w prawo i w górę (przykład orientacji możliwy tylko przy 3 obrotach)
0,30,0,0 dwunastościan regularny
2,0,20,0 wielki dwunastościan
3,45,45,45 wielki gwiaździsty dwunastościan
źródło
Mathematica,
426424 bajtówUżywa wbudowanego
Graphics3D
do wyświetlania kształtu. Większość bajtów jest jednak zajmowana przez skompresowane lokalizacje wierzchołków, które są następniePartition
przekształcane do postaci możliwej do użycia przezPolygon
. Wreszcie:Pamiętaj, że ten kształt można obracać, klikając i przeciągając.
źródło