[chiplotle-discuss] bezier curves
Victor Adan
vga2102 at columbia.edu
Fri Mar 12 14:15:01 EST 2010
hello Francesco,
This is fantastic!! We have been thinking about implementing something like this, and now you have done it!
I'll take a careful look at the code and add it to the repository.
best,
Victor.
On Fri, Mar 12, 2010 at 11:18:36AM +0100, francesco fantoni wrote:
> As in HPGL/1 there are no bezier curves as far as I know, I was thinking
> about a chiplote compound command in order to aproximate a bezier.
> I've written a first implementation, and it seems to work.
> the compound command is 'Bezier(list)', where list is a list of tuples.
> Each tuple contains the absolute coordinates of bezier curve's control
> points.
> I'm using PA commands to plot the sequence of aproximated points
> calculated by the routine, probably circle arcs could be used in a more
> sophisticated way, but I think it's way too complex for me.
> I include an image of my test, showing some variations of a curve with
> some control point in common, and some 20 curves drawn with random
> control points.
> Maybe it's interesting.
> (obviously bezier.py goes in chiplotle-trunk/chiplotle/hpgl/compound/)
>
> best regards,
> francesco
> from chiplotle.hpgl.compound.compound import _CompoundHPGL
> from chiplotle.hpgl.commands import PU, PD, PA
> from chiplotle.hpgl.scalable import Scalable
> from chiplotle.utils.geometry import *
>
>
> class Bezier(_CompoundHPGL):
> '''Bezier curve aproximation'''
> def __init__(self, control_points):
> self.control_points = control_points
> xy = self.control_points[0]
> _CompoundHPGL.__init__(self, xy)
>
>
> def pascal_row(n):
> # This returns the nth row of Pascal's Triangle
> result=[1]
> x,numerator=1,n
> for denominator in range(1,n//2+1):
> # print(numerator,denominator,x)
> x*=numerator
> x/=denominator
> result.append(x)
> numerator-=1
> if n&1==0:
> # n is even
> result.extend(reversed(result[:-1]))
> else:
> result.extend(reversed(result))
> return result
>
>
> self.n=len(self.control_points)
> self.combinations=pascal_row(self.n-1)
>
> # This uses the generalized formula for bezier curves
> # http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Generalization
> self.plot_points=[]
> ts=[t/100.0 for t in range(101)]
> for t in ts:
> tpowers=(t**i for i in range(self.n))
> upowers=reversed([(1-t)**i for i in range(self.n)])
> coefs=[c*a*b for c,a,b in zip(self.combinations,tpowers,upowers)]
> self.plot_points.append(tuple(sum([coef*p for coef,p in zip(coefs,ps)]) for ps in zip(*self.control_points)))
> self.plot_points_int=[]
> for point in self.plot_points:
> self.plot_points_int.append((int(point[0]),int(point[1])))
>
>
> @property
> def _subcommands(self):
>
> result = _CompoundHPGL._subcommands.fget(self)
> result.append( PU( ) )
> result.append( PA(self.plot_points_int[0]) )
> result.append( PD() )
> for point_tuple in self.plot_points_int:
> result.append( PA(point_tuple) )
> result.append( PU() )
>
> return result
> _______________________________________________
> chiplotle-discuss mailing list
> chiplotle-discuss at music.columbia.edu
> http://music.columbia.edu/mailman/listinfo/chiplotle-discuss
More information about the chiplotle-discuss
mailing list