mirror of
https://github.com/isometimes/rpi4-osdev
synced 2024-11-14 14:20:39 +00:00
59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
#include "../include/wgt.h"
|
|
#include "../include/mem.h"
|
|
|
|
void wbezier (tpolypoint *rawpts, short numraw, tpolypoint *curvepts, short numcurve)
|
|
/* Bezier curve algorithm submitted to us by Claude Morais */
|
|
{
|
|
double *combi;
|
|
double deltat, temp;
|
|
double prod,quot;
|
|
double sumx,sumy;
|
|
short tmp, count;
|
|
|
|
combi = malloc (sizeof(double)*numraw);
|
|
|
|
numraw--;
|
|
deltat = 1.0 / (numcurve - 1);
|
|
combi[0] = combi[numraw] = 1.0;
|
|
|
|
for (tmp = 0; tmp <= (numraw - 2); tmp++)
|
|
combi[tmp + 1] = (combi[tmp] * (numraw - tmp)) / (tmp + 1);
|
|
|
|
for (count = 0; count < numcurve; count++)
|
|
{
|
|
if ((temp = count*deltat) <= 0.5)
|
|
{
|
|
quot = prod = 1.0 - temp;
|
|
for (tmp = 1; tmp < numraw; tmp++)
|
|
prod *= quot;
|
|
|
|
quot = temp / quot;
|
|
sumx = rawpts[numraw].x;
|
|
sumy = rawpts[numraw].y;
|
|
for (tmp = numraw - 1; tmp >= 0; tmp--)
|
|
{
|
|
sumx = combi[tmp]* rawpts[tmp].x + quot* sumx;
|
|
sumy = combi[tmp]* rawpts[tmp].y + quot* sumy;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
quot = prod = temp;
|
|
for (tmp = 1; tmp < numraw; tmp++)
|
|
prod *= quot;
|
|
|
|
quot = (1.0 - temp) / quot;
|
|
sumx = rawpts[0].x;
|
|
sumy = rawpts[0].y;
|
|
for (tmp = 1; tmp <= numraw; tmp++)
|
|
{
|
|
sumx = combi[tmp]* rawpts[tmp].x + quot* sumx;
|
|
sumy = combi[tmp]* rawpts[tmp].y + quot* sumy;
|
|
}
|
|
}
|
|
curvepts[count].x = (sumx*prod);
|
|
curvepts[count].y = (sumy*prod);
|
|
}
|
|
|
|
free (combi);
|
|
}
|