Représentons une fonction f (x) = sin (πx) + 0,5 sin (3πx) sur le domaine [-3,3] . Nous pouvons interpréter cela comme une chaîne lâche posée sur une planche. Maintenant, enfonçons n clous dans la planche aux positions (x 1 , y 1 ) à (x n , y n ) , où x i ∈ (-3,3) et y i ∈ [-1,1] . Imaginez qu'il y ait deux œillets à la fin de la chaîne, c'est-à-dire aux positions (-3,0) et (3,0). Nous pouvons maintenant prendre les extrémités de la ficelle et tirer à travers les œillets jusqu'à ce que la ficelle soit tendue. Cela déformera notre graphique en une fonction linéaire par morceaux.
Certaines photos pourraient aider. Prenez 8 clous à (-2,8, -0,7), (-2,5, -0,9), (-1,2, 0,2), (-0,5, 0,8), (0,5, 0,4), (1,2, -0,9), (1,5, -0,6), (1,8, -0,8) . Les trois graphiques suivants montrent le processus décrit ci-dessus:
Pour une version plus grande: clic droit -> Ouvrir dans un nouvel onglet
Et voici une animation du serrage des cordes si vous avez du mal à le visualiser:
Le défi
Étant donné une liste de "clous" (qui n'est pas nécessairement triée), tracez ces clous et la chaîne tendue si elle part de la forme de la fonction ci-dessus f .
Vous pouvez écrire un programme ou une fonction et prendre une entrée via STDIN, ARGV ou un argument de fonction. Vous pouvez soit afficher le résultat à l'écran, soit enregistrer une image dans un fichier.
Si le résultat est tramé, il doit avoir une largeur d'au moins 300 pixels et une hauteur de 100 pixels. La plage de coordonnées de (-3, -1,1) à (3,1.1) doit couvrir au moins 75% de l'étendue horizontale et verticale de l'image. Les échelles de longueur de x et y ne doivent pas nécessairement être les mêmes. Vous devez montrer les ongles (en utilisant au moins 3x3 pixels) et la chaîne (au moins 1 pixel de large). Vous pouvez ou non inclure les axes.
Les couleurs sont votre choix, mais vous avez besoin d'au moins deux couleurs distinctes: une pour l'arrière-plan et une pour les ongles et la chaîne (celles-ci peuvent cependant avoir des couleurs différentes).
Vous pouvez supposer que tous les clous sont à au moins 10 à 5 unités de f (de sorte que vous n'avez pas à vous soucier de l'inexactitude en virgule flottante).
Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.
Plus d'exemples
Voici deux autres exemples (plus simples):
{{-2.5, 1}, {-1.5, -1}, {-0.5, 1}, {0.5, -1}, {1.5, 1}, {2.5, -1}}
(La chaîne coïncide avec l' axe des x .)
{{-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}}