2010-02-23 15 views
6

Comprenderá lo que quiero decir si utiliza programas de edición gráfica como Gimp o Photoshop. Para editar una curva en esos programas (que probablemente sea Bezier Curve), podemos hacer clic en la curva, arrastrar el mouse y la curva se cambia en consecuencia. Sospecho que todas las cosas detrás de este mecanismo están relacionadas con los vectores, pero no pude encontrar ningún documento que mencione cómo hacerlo. ¿Alguien podría decirme cómo puedo hacer eso? Muchas gracias.Arrastre una curva bezier para editarlo

[edit] Lo que quise decir es seleccionar la curva misma para cambiarla (editarla) (haga clic en la curva y arrastre la curva para editarla). De la manera habitual, seleccionamos los puntos de control para cambiar la curva. Sé que para cambiar la curva, necesito editar los puntos de control, pero ¿cómo interpreto un cambio en una curva en un cambio en un cambio para controlar los puntos?

Respuesta

0

Arrastrar simplemente cambia los puntos de control de la curva de Bezier, y la curva se vuelve a calcular en consecuencia. Ver Wikipedia para una buena explicación de cómo funcionan.

0

Por favor, aclare lo que desea hacer? ¿Desea editar las curvas de bezier en una aplicación? ¿Estás interesado en las matemáticas generales detrás de esto?

Normalmente manipula los puntos de control que se utilizan para generar la curva de bezier.

1

EDITAR - En respuesta a su pregunta de edición

Con el fin de ser capaz de seleccionar la curva en sí para mover los puntos de control, sugeriría que las curvas de Bézier son definitivamente no es el camino a seguir - que tendría para resolver la ecuación en reversa con el fin de encontrar las ubicaciones correctas del punto de control. También encontrará que, en algunos casos, no es posible mover los puntos de control para hacer que la curva vaya a donde desee.

Si estaba utilizando B-Splines, entonces podría simplemente insertar un nuevo punto de control en el punto en la curva más cercana a donde ha hecho clic el usuario, y luego mover el nuevo punto de control. Entonces, efectivamente, agregarías un nuevo punto de control.

Texto original

Asumiendo que ya tiene una implementación de una curva de Bezier, que, dado un conjunto de puntos de control (normalmente tres de Bezier, pero puede haber tantos como desee) puede producir un conjunto de puntos para unirlo con líneas en el dispositivo de visualización (normalmente usa la ecuación paramétrica 0 >= u <= 1), entonces esto es fácil.

Sus puntos de control determinan hacia dónde va la curva, por lo que simplemente necesita implementar comentarios de selección y arrastrar/soltar en esos puntos de control.

Sin embargo, si busca una coincidencia de puntos exacta, las curvas de bezier no son ideales ya que solo pasan por el primer y último punto de control. Y cuantos más puntos agregue a la curva, menos precisos serán.

B-Splines sería mejor, y las variaciones de estos son lo que realmente se ve en photoshop et al.

+0

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. –

0

OK, así que supongamos que debe usar las curvas de Bezier porque está utilizando una biblioteca de representación que las tiene como primitiva.Si está absolutamente casado con la idea de usar puntos de control en la curva, puede simplemente interpolar los puntos de control utilizando el método descrito aquí: How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# - AKA Cubic Bezier 4-point Interpolation

En otras palabras, para cada conjunto de 4 puntos en la curva, ejecutaría el algoritmo anterior y obtendría los 4 puntos de control necesarios para dibujar el Bezier cúbico.

3

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.

0

Ver github.com/bootchk/freehandTool para modelos de objetos

un usuario arrastra. Proyecte el arrastre en el punto de control más cercano o arme entre los puntos de control. Interpreta el arrastre como rotación y/o traducción (transformación) de dichos puntos de control más cercanos.Nota plural: los puntos de control más cercanos pueden ser coincidentes (finales) de dos segmentos, o puntos de control del brazo del segmento bezier.

Cuestiones relacionadas