Este é o segundo de dois desafios sobre "puxar funções esticadas". Aqui está a parte I mais simples .
Vamos colocar m pregos em uma placa nas posições (x 1 , y 1 ) a (x m , y m ) . Amarre um elástico ao primeiro e ao último deles e estique-o em volta das outras unhas, de modo que a banda atravesse todas as unhas em ordem. Observe que o elástico agora descreve uma função parametrizada linear por partes (x (t), y (t)) no espaço 2D.
Agora, introduza mais n pregos no quadro, nas posições (x 1 , y 1 ) a (x n , y n ) . Se agora remover todos os originais m unhas , exceto a primeira e última (que as extremidades da borracha está ligada a), o elástico vai encurtar até que ele está mentindo esticada em torno dos pregos novos, produzindo outra linear por partes função.
Como exemplo, faça m = 12 pregos iniciais nas posições (0, 0), (2, -1), (3/2, 4/3), (7/2, 1/3), (11/2, 16/3), (1, 16/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0) , e n = 10 pregos adicionais nas posições (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0 ), (6, 2), (7, 1), (6, 0) . Os três gráficos seguintes mostram o processo descrito acima:
Para versão maior: Clique com o botão direito do mouse -> Abrir em uma nova guia
E aqui está uma animação do aperto do elástico se você tiver alguma dificuldade para visualizá-lo:
O desafio
Dadas duas listas de "pregos", trace o elástico esticado em torno da segunda lista, se ele começar com a forma que atravessa todas as unhas da primeira lista.
Você pode escrever um programa ou função e receber entradas via STDIN, ARGV ou argumento de função. Você pode exibir o resultado na tela ou salvar uma imagem em um arquivo.
Se o resultado for rasterizado, ele precisará ter pelo menos 300 pixels de cada lado. O elástico final e as unhas devem cobrir pelo menos 75% da extensão horizontal e vertical da imagem. As escalas de comprimento de x e y devem ser as mesmas. Você precisa mostrar as unhas no segundo conjunto (usando pelo menos 3x3 pixels) e a corda (com pelo menos 1 pixel de largura). Você pode ou não incluir os eixos.
As cores são a sua escolha, mas você precisa de pelo menos duas cores distintas: uma para o fundo e outra para as unhas e a corda (essas podem ter cores diferentes).
Você pode supor que todas as unhas da segunda lista estão a pelo menos 10 a 5 unidades da forma inicial do elástico (para que você não precise se preocupar com a imprecisão do ponto flutuante).
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Mais exemplos
Aqui estão mais dois exemplos:
{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}
{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}
E aqui está um exemplo que mostra o significado de duas das unhas iniciais restantes. O resultado deve ser b e não um :
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
Agradecemos a Ell por fornecer este exemplo.