Esse é um dos vários desafios que a Calvin's Hobbies deixou para a comunidade .
A curva que uma corda ou corrente pendurada idealizada faz é uma catenária .
Imagem de Bin im Garten, via Wikimedia Commons. Usado sob a licença CC-By-SA 3.0 .
Escrever um programa que irá chamar uma catenária, como uma imagem, em um quadrante do plano dado dois pontos (x 1 , y 1 ) , (x 2 , Y 2 ) , e o "comprimento de corda" L . L será maior que a distância entre os dois pontos.
Você também deve desenhar eixos nos lados esquerdo e inferior da imagem (400x400 px min) para a escala. Desenhe apenas o quadrante de xey no intervalo de 0 a 100. (Você pode assumir que os pontos estão no intervalo.)
Pontos ou algo semelhante devem ser desenhados nos pontos de extremidade (x 1 , y 1 ) , (x 2 , y 2 ) para distingui-los. A curva deve ser desenhada apenas no espaço entre esses pontos.
fonte
Respostas:
Python + NumPy + Matplotlib, 1131
Apenas para começar, aqui está uma tentativa que não utiliza nenhum conhecimento de cálculo ou física além do fato de que a catenária minimiza a energia de uma cadeia. Ei, meu algoritmo pode não ser eficiente, mas pelo menos também não é implementado com eficiência!
fonte
BBC Basic, 300 caracteres ASCII, tamanho de arquivo tokenised 260
Emulador em http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Obviamente, isso já foi resolvido antes, então a primeira coisa que fiz foi ver o que os outros fizeram.
A equação de uma catenária centrada na origem é simples
y=a*cosh(x/a)
. Torna-se um pouco mais complicado se não estiver centrado na origem.Várias fontes dizem que, se o comprimento e os pontos de extremidade forem conhecidos, o valor
a
deverá ser determinado numericamente. Há um parâmetro não especificadoh
no artigo da wikipedia. Encontrei outro site e basicamente segui o método aqui: http://www.math.niu.edu/~rusin/known-math/99_incoming/catenaryComo o BBC Basic não possui
sinh
e foicosh
incorporado, defini duas funções no final do programa para calculá-las usandoEXP
as coordenadas do ponto da esquerda devem ser fornecidas antes do ponto da direita, OP confirmou que isso está OK. O comprimento é dado por último. Os valores podem ser separados por vírgulas ou novas linhas.
Código ungolfed
fonte
Python 2.7 + matplotlib, 424
Correr como
Se eu puder assumir que x0 é sempre menor que x1, a contagem de caracteres reduz para 398
O número mágico 600 que você vê aparecendo em alguns lugares se deve ao fato de cosh (x) e sinh (x) começarem a transbordar em torno de x = 710 (portanto, 600 para manter alguma margem)
fonte