Así que ímos ver como funcionan por detrás...
As curvas de Bézier están definidas por un conxunto arbitrario de puntos, supoñamos que temos 4 (A, B, C e D), para trazar a curva que corresponda os catro tomaremos cada par de puntos consecutivos (A-B, B-C e C-D) e trazamos unha recta entre eles.
Agora supoñamos que queremos saber onde cae o punto do primeiro cuarto da curva (segundo este método teremos que calcular cada punto individualmente), tomaremos como puntos entón o primeiro cuarto de cada liña.
![]() |
| Así, a ollo :P |
Por suposto, se non queremos pasar a vida fedellando no GIMP para debuxar a curva sempre podemos programala:
def frange(start, end, step):
"""Funciona coma un range() pero con números con decimais."""
points = []
next = start
while next < end:
points.append(next)
next += step
return points
def point_in_line(p1, p2, cut):
"""Toma o punto 'cut' da liña entre os puntos p1 e p2."""
line = []
for dim1, dim2 in zip(p1, p2):
diff = dim2 - dim1
line.append(dim1 + diff * cut)
return line
def bezier(data_points, cut):
"""Calcula un punto da curva de bézier a partir do conxunto de puntos."""
while len(data_points) > 1:
next = []
for i in xrange(len(data_points) - 1):
next.append(point_in_line(data_points[i], data_points[i + 1], cut))
data_points = next
return data_points[0]
Así, supoñendo os puntos:
data = [(0, 2), (1.5, 2), (0.5, 0), (2, 0)]
Xeraríamos os puntos da curva bézier entre 0 e 1 cunha resolución de 0.001
points = [bezier(data, x) for x in frange(0, 1, .001)]
Para amosalos poderíamos por exemplo introducilos nun arquivo:
f = open("saída", "wt")
for point in points:
print >> ' '.join(map(str, point))
f.close()
E debuxalos con `gnuplot`:
gnuplot -e "plot 'saída'" -p





Inspireime neste post para facer unha visualización dinámica dunha curva de Bézier de 5 puntos con Geogebra:
ResponderEliminarhttp://www.geogebratube.org/student/m22205
Podedes descargar o arquivo fonte aquí:
https://docs.google.com/open?id=0B-sQLQclv3XIdm0tZ2xLX01MYlE
Xenial, alégrome que resultase positivo :D
Eliminar