mirror of
https://github.com/AngelJumbo/lavat.git
synced 2024-11-16 12:46:39 +00:00
Added -C to make the metaballs bounce right off the ede of the terminal
This commit is contained in:
parent
7ee3cde487
commit
fdf6408cae
65
lavat.c
65
lavat.c
@ -6,18 +6,22 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
int dx;
|
int dx;
|
||||||
int dy;
|
int dy;
|
||||||
} Ball;
|
} Ball;
|
||||||
|
|
||||||
static char *custom = NULL;
|
static char *custom = NULL;
|
||||||
static short color = TB_DEFAULT;
|
static short color = TB_DEFAULT;
|
||||||
static int nballs = 10;
|
static int nballs = 10;
|
||||||
static short speedMult = 1;
|
static short speedMult = 1;
|
||||||
static short rim = 0;
|
static short rim = 0;
|
||||||
|
static short contained = 0;
|
||||||
static float radius = 100;
|
static float radius = 100;
|
||||||
|
|
||||||
int parse_options(int argc, char *argv[]);
|
int parse_options(int argc, char *argv[]);
|
||||||
void print_help();
|
void print_help();
|
||||||
|
|
||||||
@ -43,9 +47,12 @@ int main(int argc, char *argv[]) {
|
|||||||
int maxX = tb_width();
|
int maxX = tb_width();
|
||||||
int maxY = tb_height() * 2;
|
int maxY = tb_height() * 2;
|
||||||
int speed = (((1 / (float)(maxX + maxY)) * 5000000) + 50000) / speedMult;
|
int speed = (((1 / (float)(maxX + maxY)) * 5000000) + 50000) / speedMult;
|
||||||
radius = radius / (float)(maxX * maxY); //(float)(maxX > maxY ? maxX : maxY);
|
radius = (radius * radius + (float)(maxX * maxY)) / 15000;
|
||||||
|
|
||||||
float innerRadius = radius * (1 + (float)(0.25 * rim));
|
int margin = contained ? radius * 6 : 0;
|
||||||
|
|
||||||
|
float sumConst = 0.0225;
|
||||||
|
float sumConst2 = sumConst * (1 + (float)(0.25 * rim));
|
||||||
|
|
||||||
char *custom2 = custom;
|
char *custom2 = custom;
|
||||||
|
|
||||||
@ -54,8 +61,8 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < nballs; i++) {
|
for (int i = 0; i < nballs; i++) {
|
||||||
balls[i].x = rand() % maxX;
|
balls[i].x = rand() % (maxX - 2 * margin) + margin;
|
||||||
balls[i].y = rand() % maxY;
|
balls[i].y = rand() % (maxY - 2 * margin) + margin;
|
||||||
balls[i].dx = (rand() % 2 == 0) ? -1 : 1;
|
balls[i].dx = (rand() % 2 == 0) ? -1 : 1;
|
||||||
balls[i].dy = (rand() % 2 == 0) ? -1 : 1;
|
balls[i].dy = (rand() % 2 == 0) ? -1 : 1;
|
||||||
}
|
}
|
||||||
@ -65,10 +72,12 @@ int main(int argc, char *argv[]) {
|
|||||||
// move balls
|
// move balls
|
||||||
for (int i = 0; i < nballs; i++) {
|
for (int i = 0; i < nballs; i++) {
|
||||||
|
|
||||||
if (balls[i].x + balls[i].dx >= maxX || balls[i].x + balls[i].dx < 0)
|
if (balls[i].x + balls[i].dx >= maxX - margin ||
|
||||||
|
balls[i].x + balls[i].dx < margin)
|
||||||
balls[i].dx *= -1;
|
balls[i].dx *= -1;
|
||||||
|
|
||||||
if (balls[i].y + balls[i].dy >= maxY || balls[i].y + balls[i].dy < 0)
|
if (balls[i].y + balls[i].dy >= maxY - margin ||
|
||||||
|
balls[i].y + balls[i].dy < margin)
|
||||||
balls[i].dy *= -1;
|
balls[i].dy *= -1;
|
||||||
|
|
||||||
balls[i].x += balls[i].dx;
|
balls[i].x += balls[i].dx;
|
||||||
@ -85,39 +94,41 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
for (int k = 0; k < nballs; k++) {
|
for (int k = 0; k < nballs; k++) {
|
||||||
int y = j * 2 + j2;
|
int y = j * 2 + j2;
|
||||||
sum[j2] += 1 / ((float)((i - balls[k].x) * (i - balls[k].x) +
|
sum[j2] += (radius * radius) /
|
||||||
|
((float)((i - balls[k].x) * (i - balls[k].x) +
|
||||||
(y - balls[k].y) * (y - balls[k].y)));
|
(y - balls[k].y) * (y - balls[k].y)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!custom) {
|
if (!custom) {
|
||||||
if (sum[0] > radius) {
|
if (sum[0] > sumConst) {
|
||||||
if (sum[1] > radius) {
|
if (sum[1] > sumConst) {
|
||||||
tb_printf(i, j, color | TB_BOLD, 0, "█");
|
tb_printf(i, j, color | TB_BOLD, 0, "█");
|
||||||
} else {
|
} else {
|
||||||
tb_printf(i, j, color | TB_BOLD, 0, "▀");
|
tb_printf(i, j, color | TB_BOLD, 0, "▀");
|
||||||
}
|
}
|
||||||
} else if (sum[1] > radius) {
|
} else if (sum[1] > sumConst) {
|
||||||
tb_printf(i, j, color | TB_BOLD, 0, "▄");
|
tb_printf(i, j, color | TB_BOLD, 0, "▄");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rim) {
|
if (rim) {
|
||||||
if (sum[0] > innerRadius) {
|
if (sum[0] > sumConst2) {
|
||||||
if (sum[1] > innerRadius) {
|
if (sum[1] > sumConst2) {
|
||||||
tb_printf(i, j, color, 0, "█");
|
tb_printf(i, j, color, 0, "█");
|
||||||
} else {
|
} else {
|
||||||
tb_printf(i, j, color | TB_BOLD, color, "▄");
|
tb_printf(i, j, color | TB_BOLD, color, "▄");
|
||||||
}
|
}
|
||||||
} else if (sum[1] > innerRadius) {
|
} else if (sum[1] > sumConst2) {
|
||||||
tb_printf(i, j, color | TB_BOLD, color, "▀");
|
tb_printf(i, j, color | TB_BOLD, color, "▀");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (sum[0] > radius) {
|
if (sum[0] > sumConst) {
|
||||||
tb_printf(i, j, color | TB_BOLD, 0, custom2);
|
tb_printf(i, j, color | TB_BOLD, 0, custom2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rim) {
|
if (rim) {
|
||||||
if (sum[0] > innerRadius) {
|
if (sum[0] > sumConst2) {
|
||||||
tb_printf(i, j, color, 0, custom);
|
tb_printf(i, j, color, 0, custom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -143,7 +154,7 @@ int parse_options(int argc, char *argv[]) {
|
|||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
return 1;
|
return 1;
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt(argc, argv, ":c:s:r:R:b:F:h")) != -1) {
|
while ((c = getopt(argc, argv, ":c:s:r:R:b:F:Ch")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'c':
|
case 'c':
|
||||||
if (strcmp(optarg, "red") == 0) {
|
if (strcmp(optarg, "red") == 0) {
|
||||||
@ -197,6 +208,9 @@ int parse_options(int argc, char *argv[]) {
|
|||||||
case 'F':
|
case 'F':
|
||||||
custom = optarg;
|
custom = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'C':
|
||||||
|
contained = 1;
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
print_help();
|
print_help();
|
||||||
return 0;
|
return 0;
|
||||||
@ -217,20 +231,23 @@ void print_help() {
|
|||||||
printf(
|
printf(
|
||||||
"Usage: lavat [OPTIONS]\n"
|
"Usage: lavat [OPTIONS]\n"
|
||||||
"OPTIONS:\n"
|
"OPTIONS:\n"
|
||||||
" -c COLOR Set color. Available colours: red, blue, yellow, "
|
" -c <COLOR> Set color. Available colours: red, blue, yellow, "
|
||||||
"green, cyan and magenta. \n"
|
"green, cyan and magenta. \n"
|
||||||
" Besides those colors the default one is the normal"
|
" Besides those colors the default one is the normal"
|
||||||
" foreground of your terminal.\n"
|
" foreground of your terminal.\n"
|
||||||
" -s SPEED Set the speed, from 1 to 5. (default 1)\n"
|
" -s <SPEED> Set the speed, from 1 to 5. (default 1)\n"
|
||||||
" -r RADIUS Set the radius of the metaballs, from 1 to 10. "
|
" -r <RADIUS> Set the radius of the metaballs, from 1 to 10. "
|
||||||
"(default: 5)\n"
|
"(default: 5)\n"
|
||||||
" -R RIM Set a \"rim\" for each metaball, sizes from 1 to 5. "
|
" -R <RIM> Set a rim for each metaball, sizes from 1 to 5."
|
||||||
"(default: none)\n"
|
"(default: none)\n"
|
||||||
" This option does not work with the default color\n"
|
" This option does not work with the default "
|
||||||
" -b NBALLS Set the number of metaballs in the simulation, from "
|
"color.\n"
|
||||||
"2 to 20. (default: 10)\n"
|
" -b <NBALLS> Set the number of metaballs in the simulation, "
|
||||||
" -F CHARS Allows for a custom set of chars to be used\n"
|
"from 2 to 20. (default: 10)\n"
|
||||||
|
" -F <CHARS> Allows for a custom set of chars to be used\n"
|
||||||
" Only ascii symbols are supported for now, "
|
" Only ascii symbols are supported for now, "
|
||||||
"wide/unicode chars may appear broken.\n"
|
"wide/unicode chars may appear broken.\n"
|
||||||
|
" -C Make metaballs bounce right off the edge of the "
|
||||||
|
"terminal.\n"
|
||||||
" -h Print help.\n");
|
" -h Print help.\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user