Zeichnen Sie anhand der Koordinaten mehrerer Punkte in einer Ebene und des Radius eines Kreises, der jeden Punkt umgibt, Polygone, die die Kreise und die Kanten darstellen, an denen sich die Kreise treffen. Gerade Kanten fallen immer entlang von Kreis-Kreis-Schnittlinien , folgen jedoch möglicherweise nicht der gesamten Länge dieser Linien.
Per mbomb007 ‚s Vorschlag, stellen Sie sich das Verhalten von 2D - Seifenblasen. Das ist technisch falsch, da sich Seifenblasen immer in einem Winkel von 120 ° treffen, um die Energie zu minimieren, während sich diese Kreise in einem beliebigen Winkel treffen können.
Dies ist ein Voronoi-Diagramm abzüglich einer definierten Flächenebene. Danke Andreas . Dies ist eine Verallgemeinerung eines Voronoi-Diagramms, das als Leistungsdiagramm bezeichnet wird .
Beispiele
Bei zwei Punkten und zwei Radien könnte die Ausgabe beispielsweise so aussehen:
Fügen Sie einen weiteren Punkt und Radius hinzu und die Ausgabe könnte folgendermaßen aussehen:
Eingang
Sie können die Eingabe beliebig strukturieren. Bitte posten Sie die Ergebnisse mit den folgenden Eingaben.
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
Ausgabe
Die Ausgabe sollte grafisch sein und Polygonränder enthalten, es ist jedoch nichts anderes erforderlich. Punkte und Schnittpunkte müssen nicht wie in den Beispielen dargestellt werden.
Einschränkungen
- Innerhalb des Radius eines anderen Kreises existiert kein Punkt.
- Standard Codegolf Regeln.
- Es werden keine Antworten mit Lücken akzeptiert, aber Sie können sich gerne daran erfreuen.
quelle
Antworten:
Python 2,
473355 BytesDies liest eine Reihe von Kreisen als
(x,y,r)
Tupel auf stdin und gibt ein Bild im PGM-Format an stdout aus. Dies funktioniert grob, indem für jedes Pixel eine Abstandsfunktion des Diagramms berechnet wird und jedes Pixel proportional zu seinem Abstand weniger als ein Pixel entfernt schattiert wird.Hier wurde die Distanzfunktion durch 32 geteilt, um sie sichtbar zu machen:
quelle
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
Dies ist eine Lösung in C #. Wahrscheinlich alles andere als optimal, aber C # wird dies sowieso nicht gewinnen. Ich wollte nur, dass ich beweise, dass ich es kann.
Eingabe über die Kommandozeile durch Angabe der mit einem Leerzeichen in der Reihenfolge xyr getrennten Werte. Ausgabe ist eine Datei 'l.bmp' innerhalb des ausführenden Verzeichnisses.
Das Programm akzeptiert eine beliebige Anzahl von Kreisen.
Test 1: 10 10 10 25 12 8
Test 2: 8 10 6 20 8 4 18 20 12
Alle hier beteiligten Mathematik basiert darauf . Die Koordinaten der Linien waren mit den Formularen aus dem Link leicht zu ermitteln. Sie mussten jedoch um den Winkel zwischen den beiden beteiligten Krikelzentren gedreht werden.
Um die Linienlänge zu reduzieren, habe ich ihre Schnittpunkte berechnet. Dann habe ich für diese Kreuzung überprüft, ob das aktuelle Linienende in einen Kreis hineinreicht, der nicht das "übergeordnete Element der Linie" ist und auch die Kreuzung selbst enthält. In diesem Fall wurde das Ende der Linie auf den Ort der Kreuzung reduziert.
Die Kreise waren einfach zu zeichnen, die "nicht benötigten" Teile waren schwer zu entfernen, deshalb habe ich eine "Gummi" -Lösung entwickelt, die das nicht mehr benötigte Material entfernt, indem sie wieder weiß gestrichen wird. Ein bisschen brachial, es zu erzwingen. Dies geschieht, indem Sie entlang jeder Kreiskante gehen und prüfen, ob sich dieses Pixel in Reichweite eines anderen Kreises befindet.
Ursprünglich wollte ich meine eigene Kreiszeichnungsmethode rollen, die nur den Kreis mit den angegebenen Winkeln zeichnet, die sich jedoch als nicht gut herausstellte und noch mehr Codezeilen benötigte.
Es fällt mir wirklich schwer, das zu erklären, wenn Sie es nicht bemerkt haben ... Englisch ist nicht meine Muttersprache, also tut mir das leid.
Golf gespielt
Komplexere Beispiele (oberer Kreis erhält negative y-Werte)
quelle