#define table_size 91 extern void line(int x0, int y0, int x1, int y1, uint16_t color); int32_t spiro_xofs = 120; int32_t spiro_yofs = 120; /* ------------------------------------------------------------- LookUp Table fuer Sinuswerte, Werte multipliziert mit 1000 -------------------------------------------------------------- */ #define sin_scale 1000 const int16_t sindeg_lookup[table_size] = { 0, 17, 34, 52, 69, 87, 104, 121, 139, 156, 173, 190, 207, 224, 241, 258, 275, 292, 309, 325, 342, 358, 374, 390, 406, 422, 438, 453, 469, 484, 500, 515, 529, 544, 559, 573, 587, 601, 615, 629, 642, 656, 669, 681, 694, 707, 719, 731, 743, 754, 766, 777, 788, 798, 809, 819, 829, 838, 848, 857, 866, 874, 882, 891, 898, 906, 913, 920, 927, 933, 939, 945, 951, 956, 961, 965, 970, 974, 978, 981, 984, 987, 990, 992, 994, 996, 997, 998, 999, 999, 1000 }; /* #define sin_scale 10000 int32_t sindeg_lookup[table_size] = { 0, 174, 348, 523, 697, 871, 1045, 1218, 1391, 1564, 1736, 1908, 2079, 2249, 2419, 2588, 2756, 2923, 3090, 3255, 3420, 3583, 3746, 3907, 4067, 4226, 4383, 4539, 4694, 4848, 5000, 5150, 5299, 5446, 5591, 5735, 5877, 6018, 6156, 6293, 6427, 6560, 6691, 6819, 6946, 7071, 7193, 7313, 7431, 7547, 7660, 7771, 7880, 7986, 8090, 8191, 8290, 8386, 8480, 8571, 8660, 8746, 8829, 8910, 8987, 9063, 9135, 9205, 9271, 9335, 9396, 9455, 9510, 9563, 9612, 9659, 9702, 9743, 9781, 9816, 9848, 9876, 9902, 9925, 9945, 9961, 9975, 9986, 9993, 9998, 10000 }; */ /* ------------------------------------------------------------- isin gibt einen Sinus-Wert als int32_Integerwert * 1000 zurueck, Wert aus der LookUp-Table gelesen ------------------------------------------------------------- */ int32_t isin(int32_t deg) { deg %= 360; if (deg < 0) { deg += 360; } if (deg < 90) { return sindeg_lookup[deg]; } else if (deg < 180) { return sindeg_lookup[180 - deg]; } else if (deg < 270) { return -sindeg_lookup[deg - 180]; } else { return -sindeg_lookup[360 - deg]; } } /* ------------------------------------------------------------- icos Kosinus aus Sinus berechnen (cos(x) = sin(x + 90)) ------------------------------------------------------------- */ #define icos(deg) (isin(deg + 90)) /* ------------------------------------------------------------- spirograph Spirograph ohne math.h und ohne Gleitkommazahl ------------------------------------------------------------- */ void ispirograph(int32_t outer_r, int32_t inner_r, int32_t dif_r, int32_t steps, uint32_t col) { int32_t k, i, x,y; int32_t winkel1, winkel2; int32_t prev_x, prev_y; int32_t cos1, cos2, sin1, sin2; int32_t ratio; k = outer_r - inner_r; ratio = (k * sin_scale) / inner_r; // = (outer - inner) / ( inner * sin_scale) winkel1 = 0; winkel2 = 0; prev_x = -1, prev_y = -1; steps = steps * inner_r; for (i = 0; i < steps; ++i) { cos1 = icos(winkel1); sin1 = isin(winkel1); cos2 = icos(winkel2 / sin_scale); sin2 = isin(winkel2 / sin_scale); x = (k * cos1 + dif_r * cos2) / sin_scale + spiro_xofs; y = (k * sin1 - dif_r * sin2) / sin_scale + spiro_yofs; if (prev_x != -1) line(prev_x, prev_y, x, y, col); prev_x = x; prev_y = y; winkel1 = (winkel1 + 1) % 360; winkel2 = winkel2 + ratio; // absichtlich nicht modulieren } }