Utilities: Bezier

0

This time only a quicky, but it will be used in a later post. A small class to calculate a Bezier curve interpolation in 3D or 2D. Nothing special about it.

public class Bezier {

	public static Vector3 Interpolate(Vector3 start, Vector3 end, Vector3 controlPointA, Vector3 controlPointB, float t) {
		float tInv = 1 - t;
		float tSqr = t * t;
		float tInvSrq = tInv * tInv;

		return tInv * tInvSrq * start + 3 * t * tInvSrq * controlPointA + 3 * tInv * tSqr * controlPointB + t * tSqr * end;
	}

	public static Vector2 Interpolate(Vector2 start, Vector2 end, Vector2 controlPointA, Vector2 controlPointB, float t) {
		float tInv = 1 - t;
		float tSqr = t * t;
		float tInvSqr = tInv * tInv;

		return tInv * tInvSqr * start + 3 * t * tInvSqr * controlPointA + 3 * tInv * tSqr * controlPointB + t * tSqr * end;
	}

	public static float Length(Vector3 start, Vector3 end, Vector3 controlPointA, Vector3 controlPointB, int steps) {
		float length = 0;

		Vector3 fst = start;
		for (int i = 1; i <= steps; ++i) {
			Vector3 snd = Interpolate(start, end, controlPointA, controlPointB, (float) i / steps);
			length += (snd - fst).magnitude;

			fst = snd;
		}

		return length;
	}

	public static float Length(Vector2 start, Vector2 end, Vector2 controlPointA, Vector2 controlPointB, int steps) {
		float length = 0;

		Vector2 fst = start;
		for (int i = 1; i <= steps; ++i) {
			Vector2 snd = Interpolate(start, end, controlPointA, controlPointB, (float) i / steps);
			length += (snd - fst).magnitude;

			fst = snd;
		}

		return length;
	}
}

Comments

Your email address will not be published. Required fields are marked *

Trackbacks

  1. Nov 14th, 2016 18:29