Convert lines to bezier curve

Started by TomToad, April 15, 2019, 09:20:52

Previous topic - Next topic

TomToad

Anyone know how to convert a bunch of lines into a bezier curve?  Basically I want to go from the first image below to the second image.  I know it is possible as I have done it with inkscape, but I want to do it in code.


------------------------------------------------
8 rabbits equals 1 rabbyte.

therevills

#1
I've got this little function hidden away in my maths module:

Function Bezier:Float(p1:Float, p2:Float, cp1:Float, cp2:Float, t:Float)
Local v:Float = p1 * Pow( (1 - t), 3) + 3 * cp1 * Pow( (1 - t), 2) * t + 3 * cp2 * (1 - t) * Pow(t, 2) + p2 * Pow(t, 3)
Return v
EndFunction


and

Function BezierCurve(sx:Float,sy:Float,ex:Float,ey:Float,p1x:Float,p1y:Float,p2x:Float,p2y:Float, t:Float,pointx:Float Var, pointy:Float Var)
Local neg:Float =1-t
pointx:Float  = sx * (neg) ^ 3 + 3 * p1x * (neg) ^ 2 * t + 3 * p2x * (neg) * t ^ 2 + ex * t ^ 3
pointy:Float  = sy * (neg) ^ 3 + 3 * p1y * (neg) ^ 2 * t + 3 * p2y * (neg) * t ^ 2 + ey * t ^ 3
End Function

Steve Elliott

A long time a go I wrote a Galaxians-type game and I wanted some of the aliens to follow a smooth path, so I wrote a routine that produced lots of points along a bezier curve and read in the data at load time.  The aliens went from point to point.

I've found the game, but not the program to actually produce the bezier curve at the moment...

Looks like therevills has something.
Win11 64Gb 12th Gen Intel i9 12900K 3.2Ghz Nvidia RTX 3070Ti 8Gb
Win11 16Gb 12th Gen Intel i5 12450H 2Ghz Nvidia RTX 2050 8Gb
Win11  Pro 8Gb Celeron Intel UHD Graphics 600
Win10/Linux Mint 16Gb 4th Gen Intel i5 4570 3.2GHz, Nvidia GeForce GTX 1050 2Gb
macOS 32Gb Apple M2Max
pi5 8Gb
Spectrum Next 2Mb

Derron

Drawing a bezier curve (or a similar thing like catmull rom splines) is not what the OP wants, he wants to convert data points into a (set of) bezier curve(s).

https://stackoverflow.com/questions/6299019/how-can-i-fit-a-b%C3%A9zier-curve-to-a-set-of-data
https://stackoverflow.com/questions/5525665/smoothing-a-hand-drawn-curve

http://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gems/FitCurves.c


Seems it is not as trivial as drawing the bezier curve once you got the parameters.


bye
Ron

TomToad

@Derron:  That seems to be what I'm looking for, thanks.  I actually have the book Graphics Gems.  When I saw that C code, I had to dig up my old book and, sure enough, the code is in there.  Now to convert it to BlitzMax. :)
------------------------------------------------
8 rabbits equals 1 rabbyte.