|
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
namespace Curves
{
class BezierCurve
{
private double[] FactorialLookup;
public BezierCurve()
{
CreateFactorialTable();
}
// just check if n is appropriate, then return the result
private double factorial(int n)
{
if (n < 0) { throw new Exception("n is less than 0"); }
if (n > 32) { throw new Exception("n is greater than 32"); }
return FactorialLookup[n]; /* returns the value n! as a SUMORealing point number */
}
// create lookup table for fast factorial calculation
private void CreateFactorialTable()
{
// fill untill n=32. The rest is too high to represent
double[] a = new double[33];
a[0] = 1.0;
a[1] = 1.0;
a[2] = 2.0;
a[3] = 6.0;
a[4] = 24.0;
a[5] = 120.0;
a[6] = 720.0;
a[7] = 5040.0;
a[8] = 40320.0;
a[9] = 362880.0;
a[10] = 3628800.0;
a[11] = 39916800.0;
a[12] = 479001600.0;
a[13] = 6227020800.0;
a[14] = 87178291200.0;
a[15] = 1307674368000.0;
a[16] = 20922789888000.0;
a[17] = 355687428096000.0;
a[18] = 6402373705728000.0;
a[19] = 121645100408832000.0;
a[20] = 2432902008176640000.0;
a[21] = 51090942171709440000.0;
a[22] = 1124000727777607680000.0;
a[23] = 25852016738884976640000.0;
a[24] = 620448401733239439360000.0;
a[25] = 15511210043330985984000000.0;
a[26] = 403291461126605635584000000.0;
a[27] = 10888869450418352160768000000.0;
a[28] = 304888344611713860501504000000.0;
a[29] = 8841761993739701954543616000000.0;
a[30] = 265252859812191058636308480000000.0;
a[31] = 8222838654177922817725562880000000.0;
a[32] = 263130836933693530167218012160000000.0;
FactorialLookup = a;
}
private double Ni(int n, int i)
{
double ni;
double a1 = factorial(n);
double a2 = factorial(i);
double a3 = factorial(n - i);
ni = a1/ (a2 * a3);
return ni;
}
// Calculate Bernstein basis
private double Bernstein(int n, int i, double t)
{
double basis;
double ti; /* t^i */
double tni; /* (1 - t)^i */
/* Prevent problems with pow */
if (t == 0.0 && i == 0)
ti = 1.0;
else
ti = Math.Pow(t, i);
if (n == i && t == 1.0)
tni = 1.0;
else
tni = Math.Pow((1 - t), (n - i));
//Bernstein basis
basis = Ni(n, i) * ti * tni;
return basis;
}
public void Bezier2D(double[] b, int cpts, double[] p)
{
int npts = (b.Length) / 2;
int icount, jcount;
double step, t;
// Calculate points on curve
icount = 0;
t = 0;
step = (double)1.0 / (cpts - 1);
for (int i1 = 0; i1 != cpts; i1++)
{
if ((1.0 - t) < 5e-6)
t = 1.0;
jcount = 0;
p[icount] = 0.0;
p[icount + 1] = 0.0;
for (int i = 0; i != npts; i++)
{
double basis = Bernstein(npts - 1, i, t);
p[icount] += basis * b[jcount];
p[icount + 1] += basis * b[jcount + 1];
jcount = jcount +2;
}
icount += 2;
t += step;
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Currently, also an MSc. student in Technical University of Munich, I develop practical application in computer vision for more than 5 years. I design real-time solutions to industrial and practical vision problems, both 3D and 2D. Very interested in developing algorithms in C relating math and vision.
Please visit Gravi's web page (http://www.gravi.com.tr) and my page (http://www.tbirdal.me) to learn more about what we develop.
I admire performance in algorithms.
"Great minds never die, they just tend to infinity..."