From 6286a3ed25cbc32e093b650a878f6e9e75ad13c0 Mon Sep 17 00:00:00 2001 From: Christian Kroll Date: Thu, 15 Dec 2011 04:43:40 +0000 Subject: [PATCH] integrated the black hole animation from the former borg simulator tree --- animations/Makefile | 4 ++ animations/blackhole.c | 99 ++++++++++++++++++++++++++++++++++++++++++ animations/blackhole.h | 6 +++ animations/config.in | 1 + display_loop.c | 7 +++ 5 files changed, 117 insertions(+) create mode 100644 animations/blackhole.c create mode 100644 animations/blackhole.h diff --git a/animations/Makefile b/animations/Makefile index b9d789a..8d4488c 100644 --- a/animations/Makefile +++ b/animations/Makefile @@ -61,6 +61,10 @@ ifneq (,$(filter y,$(ANIMATION_PLASMA) $(ANIMATION_PSYCHEDELIC))) SRC += fpmath_patterns.c endif +ifeq ($(ANIMATION_BLACKHOLE),y) + SRC += blackhole.c +endif + ifeq ($(ANIMATION_TIME),y) SRC += borg_time.c endif diff --git a/animations/blackhole.c b/animations/blackhole.c new file mode 100644 index 0000000..aa293b4 --- /dev/null +++ b/animations/blackhole.c @@ -0,0 +1,99 @@ +#include +#include "../config.h" +#include "../pixel.h" +#include "../util.h" +#include "../compat/pgmspace.h" +#include "blackhole.h" + +// macro for simplifying flash memory access +#define PGM(x) pgm_read_byte(&(x)) + + +/** + * Integer variant of the sinus function which takes an integer based angle + * (range from 0 to 63) where sin_i(64) corresponds to sin(2 * M_PI) * 64 and + * sin_i(16) corresponds to sin(0.5 * M_PI) * 64 (each excluding the fractional + * part). It uses a lookup table which models one quarter of a full sinus period + * and calculates the rest of the function from that quarter. + * @param angle angle based on an integer (range from 0 to 63) + * @return result of the sinus function normalized to a range from -64 to 64 + */ +static signed char sin_i(unsigned char angle) { + // the aforementioned lookup table + static signed char const sinus_table[] PROGMEM = + {0, 6, 12, 19, 24, 30, 36, 41, 45, 49, 53, 56, 59, 61, 63, 64}; + + // determine correct index for the lookup table depending on the given angle + angle %= 64u; + unsigned char index; + if (angle < 16) { + index = angle; + } else if (angle < 32) { + index = 32 - angle; + } else if (angle < 48) { + index = angle - 32; + } else { + index = 64 - angle; + } + + return (unsigned char)(PGM(sinus_table[index])) * (angle < 32 ? 1 : -1); +} + + +/** + * Integer variant of the cosinus function which takes an integer based angle + * (range from 0 to 63) where cos_i(64) corresponds to cos(2 * M_PI) * 64 and + * cos_i(16) corresponds to cos(0.5 * M_PI) * 64. It uses the sin_i function and + * shifts the given angle by 16 (which corresponds to 90 degrees). + * @param angle angle based on an integer (range from 0 to 63) + * @return result of the cosinus function normalized to a range from -64 to 64 + */ +static signed char cos_i(unsigned char const angle) { + return sin_i(angle + 16); +} + + +#define NUM_CIRCLE 7 + + +/** + * Draws a black hole like pattern (viewed from different perspectives). + */ +void blackhole(void) { + pixel circlePoints[NUM_CIRCLE][8]; + unsigned char add = 0; + signed char firstRadius = 80, helpRadius, angle = 0, x, y; + // initialize data + for (int k = 0; k < 800; k++) { + if (k > 300) + add = k / 16; + helpRadius = firstRadius; + for (unsigned char i = 0; i < NUM_CIRCLE; i++) { + for (unsigned char j = 0; j < 8; j++) { + if (j & 1) { + circlePoints[i][j].x = 64 + + (cos_i(angle + j * 8) * helpRadius) / 64; + circlePoints[i][j].y = 64 + + (sin_i(angle + add + j * 8) * helpRadius) / 64; + + } else { + circlePoints[i][j].x = 64 + + (cos_i(angle + j * 8 + 4) * helpRadius) / 64; + circlePoints[i][j].y = 64 + + (sin_i(angle + add + j * 8 + 4) * helpRadius) / 64; + } + x = circlePoints[i][j].x / 8; + y = circlePoints[i][j].y / 8; + if (x < 16 && y < 16) + setpixel((pixel){x, y}, 3); + } + helpRadius = (helpRadius * 2) / 3; + } + wait(30); + clear_screen(0); + angle++; + firstRadius += 2; + if (firstRadius > 119) + firstRadius = 80; + } +} diff --git a/animations/blackhole.h b/animations/blackhole.h new file mode 100644 index 0000000..bb8c416 --- /dev/null +++ b/animations/blackhole.h @@ -0,0 +1,6 @@ +#ifndef BLACKHOLE_H_ +#define BLACKHOLE_H_ + +void blackhole(void); + +#endif /* BLACKHOLE_H_ */ diff --git a/animations/config.in b/animations/config.in index df35351..cab52d8 100644 --- a/animations/config.in +++ b/animations/config.in @@ -58,6 +58,7 @@ comment "Animations" bool "Plasma" ANIMATION_PLASMA bool "Psychedelic" ANIMATION_PSYCHEDELIC + bool "Black Hole" ANIMATION_BLACKHOLE comment "Special Animations" bool "Test Animations" ANIMATION_TESTS diff --git a/display_loop.c b/display_loop.c index ec39888..1aca977 100644 --- a/display_loop.c +++ b/display_loop.c @@ -18,6 +18,7 @@ #include "animations/28c3.h" #include "animations/fpmath_patterns.h" #include "animations/mherweg.h" +#include "animations/blackhole.h" #ifdef ANIMATION_TIME #include "animations/borg_time.h" #endif @@ -226,6 +227,11 @@ void display_loop(){ break; #endif +#ifdef ANIMATION_BLACKHOLE + case 23: + blackhole(); + break; +#endif #ifdef ANIMATION_TESTS case 31: @@ -276,6 +282,7 @@ void display_loop(){ case 43: menu(); mode = oldOldmode; + break; #else case 42: