Epicykloida jest krzywa punktu na kole, jak to czyni rolki wokół drugiego okręgu. Cyclogon jest kształt punktem na wielokąta foremnego sprawia, gdyż rzuca w całej płaszczyźnie. NaEpicyclogon jest krzywa śledzone przez punkt na jednej wielokąta foremnego, jak toczy się wokół drugiego.
Napisz program, który rysuje epicyclogon podane r
, r1
, r2
, n1
, n2
:
r = number of clockwise revolutions rolling polygon makes around stationary polygon (any real number as limited by float values)
r1 = distance from center of stationary polygon to each of its vertices (positive real number)
r2 = distance from center of rolling polygon to each of its vertices (positive real number)
n1 = number of sides stationary polygon has (integer greater than 2)
n2 = number of sides rolling polygon has (integer greater than 2)
Notatki
- Kiedy
r
jest ujemny, wałek powinien odejść kierunku przeciwnym ruchu wskazówek zegara . - Bo
r
jeden obrót ma miejsce, gdy linia łącząca centroidy dwóch kształtów rozciąga się o pełne 360 stopni. Pojęcie to zostało rozszerzone o wszystkie wartościr
. (Tak więc w ćwierć obrotu linia łącząca centroidy rozciąga się o 90 stopni.) - Argumenty te powinny pochodzić z wiersza poleceń lub twój program powinien je o nie poprosić (np. W języku Python
input()
). r1
ir2
są względem siebie, a nie wymiary obrazu. Możesz więc ustawić jedną „jednostkę” na dowolną liczbę rzeczywistych pikseli.
Punkt, który musisz prześledzić, jest jednym z wierzchołków tocznego kształtu. Kształty muszą zaczynać się od tego wierzchołka, który dotyka nieruchomego wierzchołka i sąsiaduje z dwoma bokami:
Dokładne początkowe wierzchołki i kąt stacjonarnego wielokąta nie mają znaczenia.
Wydajność
Dane wyjściowe powinny przejść do obrazu o rozmiarze co najmniej 600 x 600 pikseli (lub innym zmiennym wymiarze niż można ustawić na 600). Musi pokazywać całą krzywą epicyklogonu określoną parametrami, dobrze wykadrowaną na obrazie.
Toczone i stacjonarne wielokąty muszą być również narysowane (z rolką w jej końcowym stanie). Dwa kształty i epicyclogon powinny mieć trzy zauważalnie różne kolory.
Musi również istnieć prosty sposób, aby nie rysować wielokątów (zmiana true
nafalse
w kodzie).
Pokaż nam co najmniej 2 obrazy wyjściowe. W razie potrzeby można je zmniejszyć.
Punktacja
Wygrywa najkrótszy kod, który produkuje prawidłowe obrazy wyjściowe.
Bonusy
- Minus 50 bajtów, jeśli wynikiem jest animowany gif (lub podobny) rysowanej krzywej.
- Minus 150 bajtów, jeśli pozwolisz
n1
in2
przyjmiesz wartość 2, aby kształty stały się odcinkami linii o długości2 * r1
(lubr2
), „toczącymi się” wokół siebie. To, jak poradzisz sobie,r
kiedyn1
i kiedyn2
masz 2 lata, zależy od ciebie, ponieważ centroidy nie obracają się wokół siebie, tak jak w innych przypadkach. (Brak „toczenia” w ogóle nie liczy się jako obsługa).
Ponieważ bardzo chętnie widzę, jak ten nowatorski pomysł został wykonany dobrze (i nie jest to dokładnie bułka z masłem), nagrodzę zwycięzcę 150 repozytorium nagród . Konkurs zakończy się tego samego dnia, w którym skończy się nagroda.
Nagroda nie zostanie przyznana zwycięzcy, jeśli jest jasne, że po prostu przepisali większość kodu z innego zgłoszenia.
Funkcje biblioteczne, które już to robią (jeśli takie istnieją) są niedozwolone.
Uwaga: Pochodzi z moich pozostałych pytań, które każdy może swobodnie publikować. Ale jeśli nikt inny ich nie opublikuje, istnieje duża szansa, że zdążę. : P
źródło
Odpowiedzi:
MATLAB: 735 bajtów - 200 bonusów = 535
Mój program obsługuje przypadek n = 2 i rysuje animację w czasie rzeczywistym. Istnieje kilka różnic między wersjami golfową i nie golfową:
Wersja bez golfa ma tylko opcję zapisania animacji do pliku „g.gif”, poprzez ustawienie
savegif = 1
w kodzie. Domyślnie jest wyłączone, ponieważ może być denerwujące z kilku powodów:Oszczędność gifów musiała zostać zmniejszona w wersji golfowej, ponieważ zajęło to około 100 bajtów, przekraczając wielkość premii.Wersja bez golfa rysuje okrąg na wierzchołku znacznika. Tworzy także więcej klatek i porusza się szybciej (choć można to zmienić w wersji golfowej, zmieniając liczby).
Próbki:
f(11,5,90,2,99,0)
po zakończeniu programuepic(1.3,4,2,6,6,1)
z wyjściem gifNieskluczony kod
Kod do gry w golfa
Instrukcje:
Zapisz funkcję w pliku o tej samej nazwie, tj .
epic.m
Lubf.m
. Uruchom go, wywołując funkcję z konsoli Matlab.Zastosowanie:
epic(r, r1, r2, n1, n2, dispPoly)
gdziedispPoly
jest zmienną logiczną (zero, jeśli fałsz, liczba niezerowa, jeśli prawda) określająca, czy narysować wielokąty.Edycja: Dodano premię 50 za animowany obraz.
źródło
Java -
27262634 - 200 = 2434 znakówPoprawiono z 3800 bajtów ish
Dziękujemy wszystkim za sugestie (zwłaszcza pseudonim 117), oto nowa wersja.
Dodałem klasę P, która jest klasą punktową i klasę L, która rozszerza ArrayList
Dodałem także kilka drobnych zmian logicznych.
Oto główna klasa (nie golfowa):
I wersja w golfa:
Jak również klasy P:
I ja:
Zmień int d na 0 lub 1, aby wyświetlić wielokąty
argumenty - 1 100 50 5 2
argumenty - 1,5 100 100 7 3
args - 2 40 100 3 7
źródło
r
naprawdę 50 we wszystkich twoich przykładach? Oznaczałoby to, że walec porusza się około 50 razy.RotatingPolygonsGolfed
w kodzie „golfowym”, podczas gdy jest po prostuRotatingPolygons
w normalnym kodzie. ;)JavaScript, 1284 znaki (-200 = 1084 znaki)
Kod minimalny to
Pełny kod to
Można znaleźć skrzypce, aby zobaczyć rutynę w całej jej wielobocznej chwale (i aby zademonstrować animację)
http://jsfiddle.net/7rv751jy/2/embedded/result/
Skrypt definiuje wywoływaną funkcję,
epi
która akceptuje pięć wymienionych parametrów w PO.epi
zwraca funkcję z podpisem,(e,t,isCCW,flags)
która akceptuje argumenty:e
- odniesienie do elementu płótna HTML5 o wymiarach 600 x 600, na którym ma być renderowanyt
- całkowity kąt (w radianach), jaki środek ciężkości drugiego wielokąta powinien omiatać wokół środka ciężkości pierwszego. Podany argument nie powinien przekraczać 2 pi razy liczby przekazanych obrotówepi
.isCCW
- wartość logiczna wskazująca, czy śledzenie powinno przebiegać w kierunku przeciwnym do ruchu wskazówek zegara (a nie w kierunku zgodnym z ruchem wskazówek zegara)flags
- zestaw flag bitowych wskazujących, które elementy powinny być renderowaneFunkcję można wywołać dowolną liczbę razy przy użyciu różnych zestawów argumentów.
Niektóre uwagi:
Procedura obsługuje zdegenerowane przypadki, w których
n1 = 2
i / lubn2 = 2
. Podczas animacji niektóre kombinacje długości powodują nagłe szybkie postępy w śladzie. Wynika to z faktu, że ramki animacji są indeksowane pod kątem do środka ciężkości drugiego wielokąta, a środek masy theta poly2 / d theta staje się liczbą pojedynczą w przypadkach, gdy środek ciężkości dwustronnego poli 2 znajduje się w pobliżu wierzchołka dwustronnego poli 1 Nie wpływa to jednak na ślad.Nazwy parametrów
epi
będą wydawać się mylące, ponieważ przez cały czas rozwoju nazwałem wielokąt 1 „2”, a wielokąt 2 „1”. Kiedy zdałem sobie sprawę z niespójności między moją konwencją a konwencją PO, zamiast zamiany wszystkich wskaźników w kodzie, po prostu zamieniłem kolejność argumentów wepi
.Skrzypce powyżej importuje jQuery, ale służy to do obsługi interfejsu użytkownika.
epi
Funkcja nie ma zależności bibliotecznych.Kod obsługuje ślady CCW, po prostu odwracając oś Y. Jest to nieco nieeleganckie, ponieważ wielokąt 2 zaczyna się w pozycji odwróconej Y podczas śladów CCW, ale nikt nie powiedział, że rutyna musi być elegancka. ;)
źródło
nt = ~~(t*(r_>rC?r_:rC)+1)
nant = ~~(t*(r_>rC?r_:rC)/10+1)
i powinno to nieco przyspieszyć.