Tracemos una función f (x) = sin (πx) + 0.5 sin (3πx) sobre el dominio [-3,3] . Podemos interpretar esto como una cuerda suelta sobre un tablero. Ahora vamos a clavar n clavos en el tablero en las posiciones (x 1 , y 1 ) a (x n , y n ) , donde x i ∈ (-3,3) e y i ∈ [-1,1] . Imagine que hay dos ojales al final de la cuerda, que están en las posiciones (-3,0) y (3,0). Ahora podemos tomar los extremos de la cuerda y pasar los ojales hasta que la cuerda esté tensa. Esto deformará nuestro gráfico en una función lineal por partes.
Algunas fotos pueden ayudar. Tome 8 clavos en (-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) . Los siguientes tres gráficos muestran el proceso descrito anteriormente:
Para una versión más grande: haga clic con el botón derecho -> Abrir en una pestaña nueva
Y aquí hay una animación del ajuste de la cuerda si tiene alguna dificultad para visualizarla:
El reto
Dada una lista de "clavos" (que no está necesariamente ordenada), trace esos clavos y la cuerda tensa si comienza con la forma de la función anterior f .
Puede escribir un programa o función y recibir información a través de STDIN, ARGV o argumento de función. Puede mostrar el resultado en la pantalla o guardar una imagen en un archivo.
Si el resultado está rasterizado, debe tener al menos 300 píxeles de ancho y 100 píxeles de alto. El rango de coordenadas de (-3, -1.1) a (3,1.1) debe cubrir al menos el 75% de la extensión horizontal y vertical de la imagen. Las escalas de longitud de x e y no tienen que ser las mismas. Debe mostrar las uñas (usando al menos 3x3 píxeles) y la cadena (al menos 1 píxel de ancho). Puede incluir o no los ejes.
Los colores son su elección, pero necesita al menos dos colores distinguibles: uno para el fondo y otro para las uñas y la cuerda (aunque pueden tener colores diferentes).
Puede suponer que todas las uñas están al menos a 10-5 unidades de distancia de f (para que no tenga que preocuparse por la inexactitud de punto flotante).
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Más ejemplos
Aquí hay dos ejemplos más (más simples):
{{-2.5, 1}, {-1.5, -1}, {-0.5, 1}, {0.5, -1}, {1.5, 1}, {2.5, -1}}
(La cadena coincide con el eje 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}}