Este es uno de los varios desafíos que Calvin's Hobbies dejó para la comunidad .
La curva que hace una cuerda o cadena colgante idealizada es una catenaria .
Imagen de Bin im Garten, vía Wikimedia Commons. Utilizado bajo la licencia CC-By-SA 3.0 .
Escribir un programa que atraerá a una catenaria, como una imagen, en el cuadrante 1 del plano dado dos puntos (x 1 , y 1 ) , (x 2 , y 2 ) , y la "longitud de cuerda" L . L será mayor que la distancia entre los dos puntos.
También debe dibujar ejes en los lados izquierdo e inferior de la imagen (400x400 px min) para la escala. Solo dibuje el cuadrante de x e y en el rango de 0 a 100. (Puede suponer que los puntos están en el rango).
Deben dibujarse puntos, o algo similar, en los puntos finales (x 1 , y 1 ) , (x 2 , y 2 ) para distinguirlos. La curva solo debe dibujarse en el espacio entre estos puntos.
fuente
Respuestas:
Python + NumPy + Matplotlib, 1131
Solo para comenzar, aquí hay un intento que no utiliza ningún conocimiento de cálculo o física que no sea el hecho de que la catenaria minimiza la energía de una cadena. ¡Oye, mi algoritmo puede no ser eficiente, pero al menos tampoco está implementado eficientemente!
fuente
BBC Basic, 300 caracteres ASCII, tamaño de archivo tokenizado 260
Emulador en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Obviamente, esto ya se ha resuelto antes, así que lo primero que hice fue mirar lo que otros han hecho.
La ecuación de una catenaria centrada en el origen es sencilla
y=a*cosh(x/a)
. Se vuelve un poco más complicado si no está centrado en el origen.Varias fuentes dicen que si se conocen la longitud y los puntos finales, el valor
a
debe determinarse numéricamente. Hay un parámetro no especificadoh
en el artículo de wikipedia. Así que encontré otro sitio y básicamente seguí el método aquí: http://www.math.niu.edu/~rusin/known-math/99_incoming/catenaryBBC Basic no tiene
sinh
ecosh
incorporado, así que definí dos funciones al final del programa para calcularlas usandoEXP
las coordenadas para el punto izquierdo se deben proporcionar antes del punto derecho, OP confirmó que esto está bien. La longitud se da al final. Los valores pueden estar separados por comas o nuevas líneas.
Código sin golf
fuente
Python 2.7 + matplotlib, 424
Correr como
Si puedo suponer que x0 siempre es menor que x1, el recuento de caracteres se reduce a 398
El número mágico 600 que ves aparecer en algunos lugares se debe al hecho de que cosh (x) y sinh (x) comienzan a desbordarse alrededor de x = 710 (600 para mantener un margen)
fuente