## Forum Stats

• 3,837,629 Users
• 2,262,276 Discussions

Discussions

# Help with Bezier curve algorithm, n amount of points?

Hello,

I have tried to follow my graphics book but its way to complicated. The book uses openGL. I want to do it in java.

I need to use n amount of control points. I am going to use an applet, and basically hard code the control points in the program. Nothing fancy.

I tried to change this c code to java format, but I cant get it to work at all.
Does any one have an algorithm already written, or help me improve this one.

thanks.
```/*
Code to generate a cubic Bezier curve
*/

typedef struct
{
float x;
float y;
}
Point2D;

/*
cp is a 4 element array where:
cp is the starting point, or P0 in the above diagram
cp is the first control point, or P1 in the above diagram
cp is the second control point, or P2 in the above diagram
cp is the end point, or P3 in the above diagram
t is the parameter value, 0 <= t <= 1
*/

Point2D PointOnCubicBezier( Point2D* cp, float t )
{
float   ax, bx, cx;
float   ay, by, cy;
float   tSquared, tCubed;
Point2D result;

/* calculate the polynomial coefficients */

cx = 3.0 * (cp.x - cp.x);
bx = 3.0 * (cp.x - cp.x) - cx;
ax = cp.x - cp.x - cx - bx;

cy = 3.0 * (cp.y - cp.y);
by = 3.0 * (cp.y - cp.y) - cy;
ay = cp.y - cp.y - cy - by;

/* calculate the curve point at parameter value t */

tSquared = t * t;
tCubed = tSquared * t;

result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp.x;
result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp.y;

return result;
}

/*
ComputeBezier fills an array of Point2D structs with the curve
points generated from the control points cp. Caller must
allocate sufficient memory for the result, which is
<sizeof(Point2D) numberOfPoints>
*/

void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve ) {
float   dt;
int   i;

dt = 1.0 / ( numberOfPoints - 1 );

for( i = 0; i < numberOfPoints; i++)
curve[i] = PointOnCubicBezier( cp, i*dt );
}```
«1

• anyone?

http://64.233.161.104/search?q=cache:7PVVDJ5XUmQJ:www.people.nnov.ru/fractal/Splines/Bezier.htm+Bezier+curve+algorithm+java&hl=en&gl=us&ct=clnk&cd=1
• I have searched google for days for an easy way that makes sense to me. thats why I posted here. I know how to do it by hand, just cant figure out logically to put it as code.
• i dont know anyhting about the Bezier curve algorithm, but the link i gave you has source code that does it. what is wrong with the source it provides?
• You say you want to do one thing and then ask for help in translating a piece of code which does something different. Do you want to do Bezier curves with n control points, or find n points on a cubic (i.e. 4 control point) curve?
• sorry about that. Yeah, I want to write up a hard coded app that can take n amount of control points.

just the normal bezier curve. We are supposed to test with 4 control points then 5, 6, 7, 8, 9. I guess he wants us to see how smoother it looks.

thanks again.
• Please give your working definition of a control point, because I'm still not certain what you want - it seems that you may be using the term differently from all the literature.
• here is what I need to do..

"Use the Bezier curve algortihm to approximate a curve for the control points. Your driver program should draw the curves for many different cases of control points"

I am using the term incorrectly--I guess.

thanks again.
• Synthesising your various posts then, am I correct in understanding the following to be your task?

1. Write code to draw an approximation to a cubic Bezier curve by evaluating the positions of n points equally spaced in parameter space.
2. Write test cases demonstrating it for various numbers of interpolated points and various interesting/degenerate curves.

If I am, then the code you posted will do half of step 1 with very minor changes. Replace the typedef struct with a class having two fields, the pointers cp with Point2D[]s having 4 elements, the pointer curve with a Point2D[], and the argument numberOfPoints with curve.length. Allocate result a new Point2D() rather than merely declaring it, and I think the rest works.

For the rendering, which would be the actual thing you claim in post 1 to be a problem (being the part which OpenGL would have played), a GeneralPath on which you call moveto followed by a series of lineto will be perfectly suited. In fact you could then optimise the code to ditch curve and simply start with a new GeneralPath().
• yes you are correct. I tried to make the struct a class but the interpreter doesn't like the point2d[].

I think my problem is, How do I use a class within a class.

is there an easier way to do this than from the code above?

thanks
This discussion has been closed.