Editar: alterou a resposta de acordo com novas imagens e esclarecimentos.
for every control point p(k, n)
p'(k, n) = ( p(k, n) - p(k) ) * d * l(k) + p(k, n)
onde k
é o índice da linha e n
é o índice da coluna do ponto de controle. l
é o fator de elevação e é igual a {-1, -1/3, 1/3, 1}. p(k)
é o centro da k'th linha.
Fundamentação da petição:
A partir das novas imagens, linhas vermelhas e azuis são desenhadas do centro da linha (p (k), que é basicamente (k, 0)) até esse ponto. Na primeira linha, todos os pontos de controle, incluindo os do gráfico (linhas vermelhas) são movidos para o mesmo ponto nessa linha. p (k, n) - p (k) fornece o vetor que move um ponto de p (k) para p (k, n) que agora deve ser aplicado de outra maneira, movendo o ponto para o local desejado. Nos seus gráficos, d = 1 para que todos os pontos da primeira linha sejam movidos para o centro. Você pode resolver facilmente a equação para verificar isso. d * l(0)
é -1, então seria o -p(k, n) + p(k) + p(k, n)
que daria p (k).
Na segunda linha, sua linha azul é novamente do ponto ao centro, mas desta vez parou antes de alcançá-la. Não sei dizer se é realmente cortado de 1/3, mas seria um bom ponto de partida. Portanto, a mesma fórmula ainda se aplica. l é -1/3 d é 1, então o ponto seria movido em 1/3 do caminho. O terceiro é o mesmo que o segundo, mas agora se move para fora, portanto l é 1/3.
Na linha final, todos os pontos de controle são movidos para fora do ponto central dessa linha. Isso é bastante claro, já que suas filas se encontram naquele centro.
O único problema que esta fórmula pode ter é a suposição de 1/3, exceto que não vejo a razão pela qual ela deve falhar.
Nota: Eu usei linha, coluna durante a indexação, portanto, se você estiver usando x, y, deverá alternar seus locais.