Aplique distorção à superfície de Bézier


8

Estou tentando simular o efeito de distorção da imagem, usado no Adobe Photoshop.

A imagem retangular é distorcida de acordo com uma superfície cúbica de Bézier (em 2D, todos os componentes Z são 0). Tendo qualquer superfície de Bézier, distorção vertical d[0,1] pode ser aplicado a ele.

Esquerda : superfície de entrada bézier,d=0, Direita : superfície de saída, d=0.8

insira a descrição da imagem aqui insira a descrição da imagem aqui

Você tem alguma idéia do que é feito na superfície de Bézier (16 pontos) ao converter da versão à esquerda para a saída à direita?

Respostas:


5

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.


Ele preserva as linhas verticais, isso é verdade. Mas estou trabalhando com a superfície de Bézier (16 pontos em um avião) e acredito que deve ser possível movendo esses 16 pontos, sem computar pontos nas curvas de bézier etc. Aqui você pode ver como a superfície de Bézier funciona: philipandrews.org/ sandbox / BezierSurface / bin / BezierSurface.swf #
19266 Ivan Kuckir

Acho que encontrei solução para esse problema se entendi corretamente. Você está perguntando como deformar a superfície do bezier A para a superfície do bezier B ou C para D com o parâmetro d sendo 0,8, está correto?
Cem Kalyoncu 19/07/19

Bem, parece que essa não é a fórmula exata, mas é bem próxima. Vou refletir um pouco mais sobre isso. A fórmula está correta pelo menos para os pontos na curva.
Cem Kalyoncu 19/07/2016

Você está chegando mais perto :) Mas, para o segundo exemplo, a coordenada Y também muda. Como mencionei, todos os pontos se movem ao longo das linhas, portanto é suficiente encontrar a nova posição para d = 1 para cada ponto, para que eu possa interpolar linearmente.
19416 Ivan Kuckir

Eu adicionei outra imagem, pode ajudá-lo.
19416 Ivan Kuckir
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.