Last active
August 29, 2015 14:22
-
-
Save karimnaaji/49b968009daf454e6c8a to your computer and use it in GitHub Desktop.
cubic bezier curve
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <string> | |
#include <cmath> | |
void bCurveP4Derivative(float t, float p0x, float p0y, float p1x, float p1y, float p2x, float p2y, float p3x, float p3y, float* x, float* y) { | |
// derivate of cubic b-curve is a quadratic b-curve | |
float it = 1 - t; | |
float f0 = 3 * powf(it, 2.f); | |
float f1 = 6 * t * (it); | |
float f2 = 3 * powf(t, 2.f); | |
*x = f0 * (p1x - p0x) + f1 * (p2x - p1x) + f2 * (p3x - p2x); | |
*y = f0 * (p1y - p0y) + f1 * (p2y - p1y) + f2 * (p3y - p2y); | |
} | |
void bCurveP4(float t, float p0x, float p0y, float p1x, float p1y, float p2x, float p2y, float p3x, float p3y, float* x, float* y) { | |
float it = 1 - t; | |
float f0 = powf(it, 3.f); | |
float f1 = 3 * t * powf(it, 2.f); | |
float f2 = 3 * powf(t, 2.f) * it; | |
float f3 = powf(t, 3.f); | |
*x = f0 * p0x + f1 * p1x + f2 * p2x + f3 * p3x; | |
*y = f0 * p0y + f1 * p1y + f2 * p2y + f3 * p3y; | |
} | |
int main() { | |
// control points | |
float p0x = 0.0; | |
float p0y = 0.0; | |
float p1x = 0.0; | |
float p1y = 1.0; | |
float p2x = 1.0; | |
float p2y = 1.0; | |
float p3x = 1.0; | |
float p3y = 0.0; | |
for (float t = 0.f; t <= 1.1f; t += 0.1f) { | |
float x, y; | |
float dx, dy; | |
bCurveP4(t, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, &x, &y); | |
bCurveP4Derivative(t, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, &dx, &dy); | |
float il = 1.f / sqrtf((dx * dx) + (dy * dy)); | |
float theta = (atan2f(dx * il, -dy * il) - M_PI_2) * 180 / M_PI;; | |
std::cout << x << " " << y << " " << dx << " " << dy << " " << theta << std::endl; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment