Code archives/Algorithms/Move at a constant speed along a bezier

This code has been declared by its author to be Public Domain code.

Download source code

Move at a constant speed along a bezier by Warpy2005
Adjust the (proportional to the length of the curve) speed an object moves along a bezier curve so its speed in cartesian space is more or less constant.
The trick is to work out the length of the tangent to the curve at the point where the ball is, and make the t-increment inversely proportional to that. If that's too much maths, just cut and paste :P
Graphics 800,800,0

Local ax=50,ay=50,bx=400,by=50,cx=350,cy=750,dx=750,dy=750
t1#=0
t2#=0
speed#=0 'Speed of clever speed changing version
x1#=ax
y1#=ay
x2#=ax
y2#=ay
While Not KeyHit(KEY_ESCAPE)
	SetColor 100,100,100
	bezier(ax,ay,bx,by,cx,cy,dx,dy) 'draw the curve
	
	ox1#=x1
	oy1#=y1
	ox2#=x2
	oy2#=y2
	
	'CLEVER SPEED CHANGING VERSION
	t1:+speed
	If t1>1 Then t1=0
	a#=t1
	b#=1-t1
	x1#=ax*b*b*b + 3*bx*b*b*a + 3*cx*b*a*a + dx*a*a*a
	y1#=ay*b*b*b + 3*by*b*b*a + 3*cy*b*a*a + dy*a*a*a
	SetColor 255,255,0
	DrawRect x1-3,y1-3,7,7

	'Calculate 'speed' of curve at this point. 
	vx#=-3*ax*b*b + 3*bx*b*(b-2*a) + 3*cx*a*(2*b-a) + dx*3*a*a
	vy#=-3*ay*b*b + 3*by*b*(b-2*a) + 3*cy*a*(2*b-a) + dy*3*a*a
	d#=Sqr(vx*vx+vy*vy)

	'Watch out, magic ahead!

	speed#=1/d 'Make the ball moves less along the curve the 'faster' the curve is at this point, so the ball's *actual* cartesian velocity should stay roughly constant

	'You missed the magic! Go back!

	'Check what the actual speed is
	movedist1#=Sqr((ox1-x1)^2+(oy1-y1)^2)
	DrawText movedist1,0,0

	'Boring old version, t increments at a constant rate
	t2:+.001
	If t2>1 Then t2=0
	a#=t2
	b#=1-t2
	x2#=ax*b*b*b + 3*bx*b*b*a + 3*cx*b*a*a + dx*a*a*a
	y2#=ay*b*b*b + 3*by*b*b*a + 3*cy*b*a*a + dy*a*a*a
	SetColor 0,0,255
	DrawRect x2-3,y2-3,7,7

	'Check what the actual speed is
	movedist2#=Sqr((ox2-x2)^2+(oy2-y2)^2)
	DrawText movedist2,0,15

	Flip
	Cls
Wend

'DON'T BE DECEIVED! This is just a plain old bezier-drawing function, to show the curve the balls are moving along
Function bezier(ax#,ay#,bx#,by#,cx#,cy#,dx#,dy#)
	DrawLine ax,ay,bx,by
	DrawLine cx,cy,dx,dy
	ox#=ax
	oy#=ay
	For t#=0 To 1 Step .01
		a#=t
		b#=1-t
		x#=ax*b*b*b + 3*bx*b*b*a + 3*cx*b*a*a + dx*a*a*a
		y#=ay*b*b*b + 3*by*b*b*a + 3*cy*b*a*a + dy*a*a*a
		DrawRect x-1,y-1,3,3
		DrawLine ox,oy,x,y
		ox=x
		oy=y
	Next
End Function

Comments

None.

Code Archives Forum