Łańcuchy Steinera to zestaw N kół, w których każde koło jest styczne do 2 innych nie przecinających się kół, a także do poprzedniego i następnego koła łańcucha, jak pokazano na poniższych zdjęciach:
W tym wyzwaniu napiszesz program / funkcję, która rysuje rekurencyjnie łańcuchy Steinera, to znaczy koła danego łańcucha będą podstawowymi okręgami innej iteracji łańcuchów:
Wyzwanie
Napisz program / funkcję, która akceptuje wymiary obrazu i listę liczb całkowitych oznaczających poziom okręgów w każdej kolejnej iteracji łańcuchów, i wyślij obraz z narysowanymi do niego rekurencyjnymi łańcuchami Steiner.
Wejście
Twój program / funkcja zaakceptuje 2 argumenty:
s
- szerokość i wysokość obrazuls
- lista liczb całkowitych dodatnich oznaczających liczbę okręgów obecnych w każdej kolejnej iteracji łańcuchów, uporządkowana od łańcucha od najwyższego do najniższego łańcucha
Wynik
Twój program / funkcja wyświetli obraz wymiaru s
x s
przedstawiający łańcuch odzysku Steiner.
- Koło podstawowe najwyższego poziomu będzie tak duże, jak obraz o średnicy
s
, wyśrodkowany w środku obrazu - Dla uproszczenia, 2 podstawowe koła łańcucha Steiner będą koncentryczne, to znaczy, że punkty środkowe 2 podstawowych kół będą takie same
- Biorąc pod uwagę promień zewnętrzny
R
i liczbę kół w łańcuchu,N
wzór na promień wewnętrznyR'
jest następującyR' = (R-R*sin(pi/N))/(sin(pi/N)+1)
- Okręgi łańcucha, jak i wewnętrzny okrąg podstawy, będą zewnętrznymi okręgami podstawy następnej iteracji łańcuchów
- Podczas rekurencji przez koła łańcucha kolejność następnego łańcucha powinna odpowiadać następnej wartości w
ls
- Podczas powtarzania się przez wewnętrzny krąg łańcucha, kolejność powinna być taka sama jak kolejność jego rodziców (przykład [5,2]):
- Wszystkie łańcuchy powinny kończyć rekurencję na głębokości
ls
- Rotacja łańcuchów nie ma znaczenia:
- Jednak obroty łańcuchów rekurencyjnych względem punktu środkowego ich rodziców powinny być takie same:
- Wszystkie koła powinny być narysowane konturem lub wypełnieniem pełnym
- Wybór koloru pozostawia się do wdrożenia, z wyjątkiem luk (na przykład wypełnianie wszystkiego tym samym kolorem)
Przykład działa
W poniższych przykładach kolor określa (depth of the recursion)^4
.
Możesz znaleźć źródło tutaj .
chain(600,[5,4,3])
chain(600,[11,1,1,1,1,1,1])
chain(600,[5,6,7,8,9])
źródło
Odpowiedzi:
JavaScript ES6, 379 bajtów
To rozwiązanie zostało użyte do wygenerowania przykładowych przebiegów w pytaniu.
Nie golfowany:
Uwaga:
f
zwraca płótno.Przykładowy przebieg (przy założeniu, że
<body>
należy dołączyć):Powinien zrzucić na stronę następujący obraz:
źródło