Hay varias maneras de lograr lo que está viendo, dependiendo de cómo le gustaría que se comporte. Explicaré algunos de los métodos más simples para modificar una curva de Bezier mediante el punto en la manipulación de la curva.
Lo primero que debe hacer es determinar el valor del parámetro (t) donde el usuario hizo clic en la curva. Esto generalmente será una aproximación. Si está realizando una representación de píxel o subpíxel del Bezier, simplemente registre para cada píxel el valor t y utilícelo. Si está realizando un mosaico en segmentos de línea, vea qué segmento de línea es el más cercano, encuentre los valores t de los dos puntos finales y aplique el valor t de acuerdo con la distancia a lo largo de la línea.
Una vez que tenga el valor de t, puede conectarlo a la ecuación de la curva de Bezier. Usted va a terminar con algo de la forma:
P = k0*P0 + k1*P1 + k2*P2 + k3*P3
donde P es el punto de la curva, P0, P1, P2 y P3 son los puntos de control de entrada y K0, K1, K2, y K3 son constantes para una t dada. Llamaré a las 'contribuciones' de los valores k, o más específicamente a las contribuciones de los puntos de control al punto en la curva P (t). Una buena propiedad para recordar es que k0 + k1 + k2 + k3 = 1.
Entonces, digamos que tiene un vector V = P '- P, donde P' es la nueva posición y P es la posición original. Necesitamos mover algunos de los puntos de control para obtener P 'donde debe ir, pero tenemos cierta flexibilidad sobre cuáles de los puntos de control queremos mover. Se puede usar cualquier punto con contribución distinta de cero, o alguna combinación.
Digamos que el usuario hace clic en la curva en t = 0. En este caso, solo k0 no es cero, entonces
P0 := P0 + V
producirá el resultado correcto. Esto también se puede escribir como
P0 := P0 + k0 * V
En el caso general en que todas las contribuciones son distintos de cero, se puede aplicar la misma transformación a cada uno de los puntos, lo que tendrá el efecto de una muy suave, se extendió de salida deformación.
Otra opción es simplemente mover el punto de control con la contribución máxima de toda la distancia. Creo que la ecuación a utilizar sería algo así como
Pmax := Pmax + 1/kmax * V
pero de cualquier manera que se reduce a mirar las contribuciones a un valor dado t, y mover los puntos de control para que el nuevo punto se encuentra en la ubicación deseada.
Este enfoque es bastante general, y funciona para NURBS y la mayoría de otras splines, incluso superficies. Hay otro método bastante común que usa Greville Abscissae, que fija tantos puntos como sea posible, pero en mi experiencia es muy fácil obtener la oscilación.
Debo mencionar que con Beziers lo más cercano que se puede llegar a los puntos de control coincidentes es crear una cadena de curvas de 3 puntos. el punto final de cada curva se establece igual al punto de inicio de la siguiente curva. Luego, los dos puntos medios a cada lado de los puntos de unión de dos curvas deben configurarse para reflejar alrededor del punto de unión, forzando una unión suave entre ellos. Sin embargo, las curvas nunca pasarán por los puntos medios. –