Biorąc pod uwagę współrzędne kilku punktów na płaszczyźnie i promień okręgu otaczającego każdy punkt, narysuj wielokąty reprezentujące koła i krawędzie, w których stykają się koła. Proste krawędzie zawsze będą opadać wzdłuż linii przecięcia okrąg-okrąg , ale mogą nie być wzdłuż pełnej długości tych linii.
Zgodnie z sugestią mbomb007 wyobraź sobie zachowanie baniek mydlanych 2D. Jest to technicznie niepoprawne, ponieważ bańki mydlane zawsze spotykają się pod kątem 120 °, aby zminimalizować energię, podczas gdy koła te mogą spotkać się pod dowolnym kątem.
To jest diagram Voronoi, pomniejszony o płaszczyznę określonego obszaru. Dzięki Andreas . Jest to właściwie uogólnienie diagramu Voronoi zwanego diagramem mocy .
Przykłady
Na przykład, biorąc pod uwagę dwa punkty i dwa promienie, dane wyjściowe mogą wyglądać następująco:
Dodaj kolejny punkt i promień, a dane wyjściowe mogą wyglądać następująco:
Wkład
Możesz uporządkować dane wejściowe w dowolny sposób. Proszę zamieścić wyniki z następującymi danymi wejściowymi.
Test 1
- x: 10, y: 10, r: 10
- x: 25, y: 12, r: 8
Test 2
- x: 8, y: 10, r: 6
- x: 20, y: 8, r: 4
- x: 18, y: 20, r: 12
Wydajność
Dane wyjściowe powinny być graficzne i powinny zawierać granice wielokątów, ale nic więcej nie jest wymagane. Punkty i skrzyżowania nie muszą być reprezentowane tak jak w przykładach.
Ograniczenia
- W promieniu innego koła nie będzie żadnego punktu.
- Standardowe zasady gry w codegolf.
- Żadne odpowiedzi z lukami nie będą akceptowane, ale możesz się z nimi dobrze bawić.
źródło
Odpowiedzi:
Python 2,
473355 bajtówOdczytuje zestaw kręgów jako
(x,y,r)
krotki na standardowym wyjściu i wysyła obraz w formacie PGM na standardowe wyjście. Działa z grubsza, obliczając funkcję odległości diagramu na każdym pikselu i cieniując każdy piksel w odległości mniejszej niż jeden piksel proporcjonalnie do jego odległości.Tutaj funkcja odległości została podzielona przez 32, aby była widoczna:
źródło
exec"%s=m%s(%s for u,v,r in L);"*4%('a','in','u-r','b','ax','v-r','c','in','u+r','d','ax','v+r')
C # ~ 2746
To jest rozwiązanie w C #. Prawdopodobnie daleki od optymalnego, ale C # i tak nie wygra. Chciałem tylko udowodnić, że mogę to zrobić.
Wprowadź za pomocą wiersza polecenia, określając wartości oddzielone spacją w kolejności xyr Dane wyjściowe to plik „l.bmp” w katalogu wykonawczym.
Program akceptuje dowolną liczbę kręgów.
Test 1: 10 10 10 25 12 8
Test 2: 8 10 6 20 8 4 18 20 12
Cała tu matematyka oparta jest na tym . Współrzędne linii były łatwe do uzyskania przy użyciu formuł z łącza. Musiały one jednak zostać obrócone o kąt między dwoma zaangażowanymi środkami centra.
Aby zmniejszyć długość linii, obliczyłem ich przecięcia. Następnie dla tego skrzyżowania sprawdziłem, czy bieżący koniec linii sięga do koła, które nie jest „rodzicem linii”, a także zawiera samo skrzyżowanie. W takim przypadku ten koniec linii został zredukowany do położenia skrzyżowania.
Koła były łatwe do narysowania, „niepotrzebne” części były trudne do usunięcia, więc wymyśliłem rozwiązanie „gumowe”, które usuwa niepotrzebne rzeczy, malując je ponownie na biało. Coś w rodzaju brutalnego zmuszania. Odbywa się to poprzez przejście wzdłuż krawędzi każdego koła i sprawdzenie, czy piksel znajduje się w zasięgu innego koła.
Początkowo chciałem rzucić własną metodę rysowania okręgu, która rysuje okrąg tylko z określonymi kątami, ale nie wyszło dobrze i zajęła jeszcze więcej linii kodu.
Naprawdę trudno mi to wytłumaczyć, jeśli nie zauważyłeś ... Angielski nie jest moim językiem ojczystym, więc przepraszam za to.
Grał w golfa
Bardziej złożone przykłady (górne kółko przechodzi w ujemne wartości y)
źródło