Removed the 'history' dead code and consolidated the pixel antialiasing
code.
This commit is contained in:
parent
44696fff16
commit
866496d88d
54
2pend.c
54
2pend.c
@ -7,8 +7,6 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#define HISTORY_LEN 8
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
double a, p;
|
double a, p;
|
||||||
} pendulum_t;
|
} pendulum_t;
|
||||||
@ -43,7 +41,18 @@ static state_t step(state_t state, state_t derivative, double dt)
|
|||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw(state_t state, int color)
|
static inline void draw_pix(double x, double y, int W, int H, double *prev)
|
||||||
|
{
|
||||||
|
double b = sqrt(2*((x-floor(x+.5))*(x-floor(x+.5)) + (y-floor(y+.5))*(y-floor(y+.5))));
|
||||||
|
int ix = (int)x, iy = (int)y;
|
||||||
|
if (b > prev[iy*W+ix] && b > .1) {
|
||||||
|
prev[iy*W+ix] = b;
|
||||||
|
int color = color_ramp[(int)(sizeof(color_ramp)/sizeof(int) * b)];
|
||||||
|
tb_change_cell(ix, iy, ' ', 0, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void draw(state_t state)
|
||||||
{
|
{
|
||||||
// TODO: properly walk along cells
|
// TODO: properly walk along cells
|
||||||
int W = tb_width(), H = tb_height();
|
int W = tb_width(), H = tb_height();
|
||||||
@ -52,31 +61,17 @@ static void draw(state_t state, int color)
|
|||||||
double x = W/2, y = H/2;
|
double x = W/2, y = H/2;
|
||||||
double step = 0.25;
|
double step = 0.25;
|
||||||
for (double p = 0; p <= len*L1; p += step) {
|
for (double p = 0; p <= len*L1; p += step) {
|
||||||
double b = (sqrt(2*((x-floor(x+.5))*(x-floor(x+.5)) + (y-floor(y+.5))*(y-floor(y+.5)))));
|
draw_pix(x, y, W, H, brightness);
|
||||||
if (b > brightness[(int)y*W+(int)x]) brightness[(int)y*W+(int)x] = b;
|
draw_pix(x+1.0, y, W, H, brightness);
|
||||||
b = (sqrt(2*((x+1.-floor(x+1.5))*(x+1.-floor(x+1.5)) + (y-floor(y+.5))*(y-floor(y+.5)))));
|
|
||||||
if (b > brightness[(int)y*W+(int)x+1]) brightness[(int)y*W+(int)x+1] = b;
|
|
||||||
//tb_change_cell((int)x, (int)y, ' ', 0, color);
|
|
||||||
x += step*cos(state.p1.a + M_PI/2)*2;
|
x += step*cos(state.p1.a + M_PI/2)*2;
|
||||||
y += step*sin(state.p1.a + M_PI/2);
|
y += step*sin(state.p1.a + M_PI/2);
|
||||||
}
|
}
|
||||||
for (double p = 0; p <= len*L2; p += step) {
|
for (double p = 0; p <= len*L2; p += step) {
|
||||||
double b = (sqrt(2*((x-floor(x+.5))*(x-floor(x+.5)) + (y-floor(y+.5))*(y-floor(y+.5)))));
|
draw_pix(x, y, W, H, brightness);
|
||||||
if (b > brightness[(int)y*W+(int)x]) brightness[(int)y*W+(int)x] = b;
|
draw_pix(x+1.0, y, W, H, brightness);
|
||||||
b = (sqrt(2*((x+1.-floor(x+1.5))*(x+1.-floor(x+1.5)) + (y-floor(y+.5))*(y-floor(y+.5)))));
|
|
||||||
if (b > brightness[(int)y*W+(int)x+1]) brightness[(int)y*W+(int)x+1] = b;
|
|
||||||
//tb_change_cell((int)x, (int)y, ' ', 0, color);
|
|
||||||
x += step*cos(state.p2.a + M_PI/2)*2;
|
x += step*cos(state.p2.a + M_PI/2)*2;
|
||||||
y += step*sin(state.p2.a + M_PI/2);
|
y += step*sin(state.p2.a + M_PI/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int y=0; y<H; y++) for (int x=0; x<W; x++) {
|
|
||||||
double b = brightness[y*W+x];
|
|
||||||
if (b > 0) {
|
|
||||||
color = color_ramp[(int)(sizeof(color_ramp)/sizeof(int) * b)];
|
|
||||||
tb_change_cell((int)x, (int)y, ' ', 0, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(brightness);
|
free(brightness);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,16 +85,12 @@ int main(int argc, char **argv) {
|
|||||||
tb_select_output_mode(TB_OUTPUT_256);
|
tb_select_output_mode(TB_OUTPUT_256);
|
||||||
|
|
||||||
state_t state;
|
state_t state;
|
||||||
state_t history[HISTORY_LEN];
|
|
||||||
|
|
||||||
randomize:
|
randomize:
|
||||||
state.p1.a = M_PI/2 + M_PI*(double)rand()/RAND_MAX;
|
state.p1.a = M_PI/2 + M_PI*(double)rand()/RAND_MAX;
|
||||||
state.p2.a = M_PI/2 + M_PI*(double)rand()/RAND_MAX;
|
state.p2.a = M_PI/2 + M_PI*(double)rand()/RAND_MAX;
|
||||||
state.p1.p = 0;
|
state.p1.p = 0;
|
||||||
state.p2.p = 0;
|
state.p2.p = 0;
|
||||||
for (int i=0; i<HISTORY_LEN; i++) {
|
|
||||||
history[i] = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
tb_clear();
|
tb_clear();
|
||||||
@ -116,18 +107,7 @@ int main(int argc, char **argv) {
|
|||||||
state.p1.p += dt/6.*(k1.p1.p + 2.*k2.p1.p + 2.*k3.p1.p + k4.p1.p);
|
state.p1.p += dt/6.*(k1.p1.p + 2.*k2.p1.p + 2.*k3.p1.p + k4.p1.p);
|
||||||
state.p2.p += dt/6.*(k1.p2.p + 2.*k2.p2.p + 2.*k3.p2.p + k4.p2.p);
|
state.p2.p += dt/6.*(k1.p2.p + 2.*k2.p2.p + 2.*k3.p2.p + k4.p2.p);
|
||||||
}
|
}
|
||||||
for (int i=0; i<HISTORY_LEN-1; i++) {
|
draw(state);
|
||||||
history[i] = history[i+1];
|
|
||||||
}
|
|
||||||
history[HISTORY_LEN-1] = state;
|
|
||||||
/*
|
|
||||||
for (int i=0; i<HISTORY_LEN; i++) {
|
|
||||||
//draw(history[i], color_ramp[((i+1)*(sizeof(color_ramp)/sizeof(int)))/(HISTORY_LEN+1)]);
|
|
||||||
draw(history[i], color_ramp[((i+1)*(sizeof(color_ramp)/sizeof(int)/2))/(HISTORY_LEN+1)]);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
draw(state, 231);
|
|
||||||
//draw(state, 7);
|
|
||||||
tb_present();
|
tb_present();
|
||||||
usleep(60000);
|
usleep(60000);
|
||||||
struct tb_event ev;
|
struct tb_event ev;
|
||||||
|
Loading…
Reference in New Issue
Block a user