Zeichnen wir eine Funktion f (x) = sin (πx) + 0,5 sin (3πx) über die Domäne [-3,3] . Wir können dies als lose Schnur interpretieren, die auf einem Brett liegt. Fahren wir nun n Nägel in die Platine an den Positionen (x 1 , y 1 ) bis (x n , y n ) , wo x i ∈ (-3,3) und y i ∈ [-1,1] sind . Stellen Sie sich vor, am Ende der Saite befinden sich zwei Ösen an den Positionen (-3,0) und (3,0).. Wir können jetzt die Enden der Schnur nehmen und durch die Ösen ziehen, bis die Schnur gespannt ist. Dies verformt unser Diagramm in eine stückweise lineare Funktion.
Einige Bilder könnten helfen. Nehmen Sie 8 Nägel bei (-2,8, -0,7), (-2,5, -0,9), (-1,2, .2), (-0,5, .8), (0,5, .4), (1,2, -0,9). (1,5, -0,6), (1,8, -0,8) . Die folgenden drei Darstellungen zeigen den oben beschriebenen Prozess:
Für größere Version: Rechtsklick -> In neuem Tab öffnen
Und hier ist eine Animation zum Spannen der Saite, falls Sie Schwierigkeiten haben, sie zu visualisieren:
Die Herausforderung
Zeichnen Sie anhand einer Liste von "Nägeln" (die nicht unbedingt sortiert ist) diese Nägel und die gespannte Zeichenfolge, wenn sie von der Form der obigen Funktion ausgeht . F.
Sie können ein Programm oder eine Funktion schreiben und Eingaben über STDIN, ARGV oder Funktionsargument vornehmen. Sie können das Ergebnis entweder auf dem Bildschirm anzeigen oder ein Bild in einer Datei speichern.
Wenn das Ergebnis gerastert wird, muss es mindestens 300 Pixel breit und 100 Pixel hoch sein. Der Koordinatenbereich von (-3, -1.1) bis (3,1.1) muss mindestens 75% der horizontalen und vertikalen Ausdehnung des Bildes abdecken. Die Längenskalen von x und y müssen nicht gleich sein. Sie müssen die Nägel (mindestens 3x3 Pixel) und die Schnur (mindestens 1 Pixel breit) zeigen. Sie können die Achsen einschließen oder nicht.
Sie haben die Wahl zwischen Farben, aber Sie benötigen mindestens zwei unterscheidbare Farben: eine für den Hintergrund und eine für die Nägel und die Schnur (diese können jedoch unterschiedliche Farben haben).
Sie können davon ausgehen, dass alle Nägel mindestens 10 -5 Einheiten von f entfernt sind (damit Sie sich keine Gedanken über Gleitkomma-Ungenauigkeiten machen müssen).
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Mehr Beispiele
Hier sind zwei weitere (einfachere) Beispiele:
{{-2.5, 1}, {-1.5, -1}, {-0.5, 1}, {0.5, -1}, {1.5, 1}, {2.5, -1}}
(Die Zeichenfolge stimmt mit der x- Achse überein.)
{{-2.7, -0.5}, {-2.3, -0.5}, {-1.7, 0.5}, {-1.3, 0.5}, {-0.7, -0.5}, {-0.3, -0.5}, {0.5, 1}, {1.5, -1}, {2.5, 1}}
Willst du eine weitere Herausforderung?
quelle
Antworten:
Python
+ Pycairo,727708608, + PyLab, 383Beispiel
Wie es funktioniert
quelle
Python + Pylab, 576 Bytes
Algorithmus:
Beispiel mit 27 zufälligen Punkten:
Golf gespielt
Was als mehrere Einrückungsbereiche in der
for j in R(i&~1)
Schleife erscheint, sollte eigentlich ein Tabulator sein.Ungolfed
quelle