Jump to content
  • Advertisement
Sign in to follow this  
nkint

[BEZIER] again, derivate of a bezier curve

This topic is 2994 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

hi this is my first post in forum i've tried to find a post about derivate of a bezier curve but i din't manage to undestrand at all. i'm creating a bezier curve in java using this methos:
//java code

	ArrayList<Point3D> controlPoints;
	...
	public Point3D samplePoint(float t) {

		float b, 
		x = 0, 
		y = 0, 
		z = 0;

		for (int i=0; i<=degree; i++) {
			b = Bernstein.compute(t, i, degree);
			x += (controlPoints.get(i).x)*b;
			y += (controlPoints.get(i).y)*b;
			z += (controlPoints.get(i).z)*b;
		}
		return new Point3D(x,y,z);
	}

i think this is casteljeau algorithm that use bernstein polynomials. it runs perfectly. i think is this one: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/b-eqn.jpg ok. now i want to fine the 1° and 2° derivate for tangent, binormal, normal. for first derivate i try to follow this: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/b-derv-1.jpg and code is:
	public static Vector3D sampleDerivateI(float t)  {
		/*	
		 *  First derivate in Bezier with casteljeau algorithm
		 *  the first curve C1(u) is defined by control points P1, P2, ..., Pn
		 *  the second curve C2(u) is defined by control points P0, P1, ..., Pn-1
		 *  C'(u) = n(C1(u) - c2(u))
		 *  
		 */
		 
		float 
		x1 = 0, 
		y1 = 0, 
		z1 = 0, 
		b1, b2;
		
		float 
		x2 = 0, 
		y2 = 0, 
		z2 = 0; 
		
		Point3D p1, p2;
		
		for (int i=0; i<degree-1; i++) {
			q = deltaPoint(i, t);
			
			b1 = Bernstein.compute(t, i+1, degree-1);
			p1 = controlPoints.get(i+1);
			x1 += b1*p1.x;
			y1 += b1*p1.y;
			z1 += b1*p1.z;
			
			b2 = Bernstein.compute(t, i, degree-1);
			p2 = controlPoints.get(i);
			x2 += b2*p2.x;
			y2 += b2*p2.y;
			z2 += b2*p2.z;	
		}
		
		return new Vector3D(degree*(x1-x2), degree*(y1-y2), degree*(z1-z2));
	}

It compile but it do not seems to be a derivate. I tryed to find others solutions in iternet but no one works good (or, better, i can't manage to figure how write in code mathematical expression) please, i don't know how to do it!! reference: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html ps. sorry for my bad english [Edited by - nkint on April 11, 2010 11:27:17 AM]

Share this post


Link to post
Share on other sites
Advertisement
I think you got an off-by-one-bug here:
for (int i=0; i<degree-1; i++) {...

According to your reference the summation goes from 0 to n-1 inclusive. So:
for (int i=0; i<=degree-1; i++) {...


Hope that helps

Share this post


Link to post
Share on other sites
thanks for answer but no
it is not that error
the tangent has the same wrong direction..

Share this post


Link to post
Share on other sites
Ok, there's another one. The bernstein factor was wrong and is the same for both points, so


for (int i = 0; i <= degree - 1; i++)
{
b = Bernstein.compute(t, i, degree); // == B i,n (t)
p1 = controlPoints.get(i + 1); // == P i + 1
x1 += b * p1.x; // summation
y1 += b * p1.y;
z1 += b * p1.z;

p2 = controlPoints.get(i); // == P i
x2 += b * p2.x; // summation
y2 += b * p2.y;
z2 += b * p2.z;
}


Now it should work.

Quote:
or, better, i can't manage to figure how write in code mathematical expression


Not having operator overloading at hand makes it difficult to find bugs. One hint though: If your formulas get complex explain steps with comments (s. above) and use similar variable names to get less confused (e.g. u instead of t here) until it's working. Afterwards you can always rename them.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!