6. Curvas de Bezier
● Propuesta por Pierre Bézier para Renault
● Punto inicial, punto final y N puntos de control
● Forma paramétrica: t [0,1]∊
7. Curvas de Bezier
● Propuesta por Pierre Bézier para Renault
● Punto inicial, punto final y N puntos de control
● Forma paramétrica: t [0,1]∊
8. Curvas de Bezier
● Propuesta por Pierre Bézier para Renault
● Punto inicial, punto final y N puntos de control
● Forma paramétrica: t [0,1]∊
9. Curvas de Bezier
● Propuesta por Pierre Bézier para Renault
● Punto inicial, punto final y N puntos de control
● Forma paramétrica: t [0,1]∊
Para este problema
usaremos este tipo
de curva, la cúbica
10. Curvas de Bezier
● Propuesta por Pierre Bézier para Renault
● Punto inicial, punto final y N puntos de control
● Forma paramétrica: t [0,1]∊
11. La idea
● ¡Búsquemos curvas de Bézier que sustituyan a las siluetas rasterizadas!
● Apliquemos un algoritmo genético para hallar una curva factible para sustituir
a la rasterizada
○ Población de curvas de bézier: los genes son las coordenadas de los puntos de control
○ Función de evaluación/adaptación al medio: ¿qué tan bien se comporta como la curva original?
12. Encontrar puntos iniciales y finales
● Encontrar ‘esquinas’
● Algoritmos existentes: Harris, FAST9, FAST12
○ Resultados muy deficientes
○ Necesitamos un humano
● No tienen orden
○ Imponemos un orden cronológico
13. Estructura general
fn vectorizar(puntoInicial,puntoFinal,imagen){
poblacion <- generar_poblacion_inicial()
poblacion <- seleccion_natural(poblacion)
while evaluar(poblacion) no es suficientemente buena {
poblacion += recombinar(poblacion)
poblacion <- mutacion(poblacion)
poblacion <- seleccion_natural(poblacion)
}
}
O(n log n)
O(1)
O(1)
O(1)
O(1)
O(n log n)
O(?)
14. Población inicial
fn generar_poblacion_inicial(puntoInicial,puntoFinal){
distancia <- distancia(puntoInicial,puntoFinal)
medio <- puntoMedio(puntoInicial,puntoFinal)
for i in 0..1000 {
xrand <- rand_range(-distancia,distancia)
yrand <- rand_range(-distancia,distancia)
p1 <- medio.copia().addX(xrand).addY(yrand)
p2 <- medio.copia().addX(rand).addY(yrand)
poblacion <- Punto { p1, p2 }
}
O(1)
15. Función de evaluación
fn evaluacion(curva,imagen){
puntuacion <- 0
for t in 0..100{
punto<-calcularPuntoCurvaBezier(curva,t)
if imagen.getPunto(punto) no es negro {
puntuacion -= 100
}
}
return puntuacion
}
O(1)
16. Función de evaluación
● No es perfecta, hay casos
que obtienen la máxima
puntuación y no son
deseables
18. Recombinado
● Se generan 250 nuevos individuos
● Real-Coded Genetic Algorithm, no sirve recombinación binaria
● Métodos
○ Single-Point Crossover
○ Linear
○ Blend Crossover
○ Simulated Binary Crossover
19. Recombinado
fn recombinar(poblacion){
while i<500 {
padre <- poblacion[i]
madre <- poblacion[i+1]
minX, maxX, minY, maxY <- extremePointsP1(padre,madre)
pointX <- rand_range(minX,maxX)
pointY <- rand_range(minY,maxY)
poblacion.add(Bezier(pointX,pointY))
...(segundo punto de control)
i+=2
}
}
O(1)
20. Mutación
● Tasa de mutación del 10% de la
población
● Cada mutación, muta solamente un gen
(coordenada)
● La variación se define por una
distribución normal N(0,distancia/2)