1
1
/* bezier.c */
2
2
3
- // - Eliminate structure passing, or at least analyse some code with it inlined to see if it helps
4
- // - Does these need to round to nearest?
5
- // - Consider overflow too
3
+ // TODO
4
+ //
5
+ // - Eliminate structure passing, or at least analyse some code with it inlined
6
+ // to see if it hinders or helps
7
+ // - Consider rounding.
8
+ // - Consider overflow too.
9
+
10
+ #include <assert.h>
6
11
7
12
#include "base/utils.h"
8
13
9
14
#include "geom/point.h"
10
15
11
16
#include "framebuf/curve.h"
12
17
13
- point_t curve_point_on_line (point_t p0 , point_t p1 , fix16_t t )
14
- {
15
- point_t c ;
16
-
17
- c .x = p0 .x + (p1 .x - p0 .x ) * t / 65536 ;
18
- c .y = p0 .y + (p1 .y - p0 .y ) * t / 65536 ;
18
+ /* ----------------------------------------------------------------------- */
19
19
20
- return c ;
21
- }
20
+ #define LOG2SCALE (4)
21
+ #define SCALE (1 << LOG2SCALE)
22
22
23
- #define SCALE (16)
23
+ /* ----------------------------------------------------------------------- */
24
24
25
25
static point_t scale_up (point_t p )
26
26
{
@@ -40,6 +40,20 @@ static point_t scale_down(point_t p)
40
40
return q ;
41
41
}
42
42
43
+ /* ----------------------------------------------------------------------- */
44
+
45
+ point_t curve_point_on_line (point_t p0 , point_t p1 , fix16_t t )
46
+ {
47
+ point_t c ;
48
+
49
+ c .x = p0 .x + (p1 .x - p0 .x ) * t / FIX16_ONE ;
50
+ c .y = p0 .y + (p1 .y - p0 .y ) * t / FIX16_ONE ;
51
+
52
+ return c ;
53
+ }
54
+
55
+ /* ----------------------------------------------------------------------- */
56
+
43
57
point_t curve_bezier_point_on_quad (point_t p0 ,
44
58
point_t p1 ,
45
59
point_t p2 ,
@@ -291,3 +305,72 @@ void curve_bezier_cubic_f(point_t p0,
291
305
d2y += d3y ;
292
306
}
293
307
}
308
+
309
+ // attempt at an integer version
310
+ void curve_bezier_cubic (point_t p0 ,
311
+ point_t p1 ,
312
+ point_t p2 ,
313
+ point_t p3 ,
314
+ int nsteps ,
315
+ point_t * points )
316
+ {
317
+ fix16_t cx , cy ;
318
+ fix16_t bx , by ;
319
+ fix16_t ax , ay ;
320
+ fix16_t h , hh , hhh ;
321
+ fix16_t d1x , d1y ;
322
+ fix16_t d2x , d2y ;
323
+ fix16_t d3x , d3y ;
324
+ fix16_t curx , cury ;
325
+ int i ;
326
+ point_t * point ;
327
+
328
+ cx = 3 * (p1 .x - p0 .x ) * FIX16_ONE ;
329
+ cy = 3 * (p1 .y - p0 .y ) * FIX16_ONE ;
330
+
331
+ bx = 3 * (p2 .x - p1 .x ) * FIX16_ONE - cx ;
332
+ by = 3 * (p2 .y - p1 .y ) * FIX16_ONE - cy ;
333
+
334
+ ax = (p3 .x - p0 .x ) * FIX16_ONE - cx - bx ;
335
+ ay = (p3 .y - p0 .y ) * FIX16_ONE - cy - by ;
336
+
337
+ h = FIX16_ONE / nsteps ;
338
+ hh = h * h / FIX16_ONE ;
339
+ hhh = hh * h / FIX16_ONE ;
340
+
341
+ /* first difference */
342
+ d1x = (ax * (long long ) hhh + bx * (long long ) hh + cx * (long long ) h ) / FIX16_ONE ;
343
+ d1y = (ay * (long long ) hhh + by * (long long ) hh + cy * (long long ) h ) / FIX16_ONE ;
344
+
345
+ /* second difference */
346
+ d2x = (6 * ax * (long long ) hhh + 2 * bx * (long long ) hh ) / FIX16_ONE ;
347
+ d2y = (6 * ay * (long long ) hhh + 2 * by * (long long ) hh ) / FIX16_ONE ;
348
+
349
+ /* third difference */
350
+ d3x = (6 * ax * (long long ) hhh ) / FIX16_ONE ;
351
+ d3y = (6 * ay * (long long ) hhh ) / FIX16_ONE ;
352
+
353
+ point = & points [0 ];
354
+
355
+ curx = p0 .x * FIX16_ONE ;
356
+ cury = p0 .y * FIX16_ONE ;
357
+
358
+ for (i = 0 ; ; i ++ )
359
+ {
360
+ point -> x = (int ) (curx >> FIX16_SHIFT );
361
+ point -> y = (int ) (cury >> FIX16_SHIFT );
362
+ point ++ ;
363
+
364
+ if (i == nsteps )
365
+ break ;
366
+
367
+ curx += d1x ;
368
+ cury += d1y ;
369
+
370
+ d1x += d2x ;
371
+ d1y += d2y ;
372
+
373
+ d2x += d3x ;
374
+ d2y += d3y ;
375
+ }
376
+ }
0 commit comments