Я пишу простую тестовую программу на языке C, которая собирает некоторые данные датчиков, анализирует и отображает их. Данные довольно просты, и у меня есть только последовательный интерфейс консоли. Тем не менее, я хотел бы построить форму волны, используя только моноширинные символы ascii.
Есть ли стандартный рекомендуемый способ сделать что-то подобное?
256 | *
| *
| *
| * *
128 | * *
| * * *
| * ** *
| ** *** * * * **
0 _______________________________
🤔 А знаете ли вы, что...
C можно использовать для создания высокоэффективных и производительных алгоритмов и вычислений.
Это просто пара вложенных циклов.
size_t n = 26;
for ( size_t y = 8; y--; ) {
int miny = ( y + 0 ) * 8;
int maxy = ( y + 1 ) * 8;
for ( size_t x = 0; x < n; ++x ) {
putchar( miny <= samples[ x ] && samples[ x ] < maxy ? '*' : ' ' );
}
putchar( '\n' );
}
Вы можете открыть канал для gnuplot, если он доступен.
#include <stdlib.h>
#include <stdio.h>
int main(void) {
FILE *gnu = popen("gnuplot", "w");
if (!gnu) { perror("gnuplot"); return EXIT_FAILURE; }
fprintf(gnu, "set term dumb\n"
"$Data <<EOD\n"
"10\n10\n70\n10\n10\n10\n"
"100\n130\n160\n230\n260\n200\n"
"160\n130\n100\n10\n10\n10\n60\n"
"70\n80\n60\n20\n10\nEOD\n"
"plot $Data\n");
pclose(gnu);
return EXIT_SUCCESS;
}
Дает мне,
300 +--------------------------------------------------------------------+
| + + + + |
| $Data A |
250 |-+ A +-|
| |
| A |
| |
200 |-+ A +-|
| |
| A A |
150 |-+ +-|
| A A |
| |
100 |-+ A A +-|
| |
| A A A |
| A A |
50 |-+ +-|
| |
| A A A A + A A A + A A |
0 +--------------------------------------------------------------------+
0 5 10 15 20 25
Вы не предоставили подробную информацию о возможностях используемого вами терминала. Например, вам или кому-то, у кого есть доступ, может потребоваться загрузить пакет gnuplot
из вашего менеджера пакетов.
Вот предложение Икегами, адаптированное к моей среде.
void plot_samples(uint8_t *data, int n)
{
const int n_rows = 32;
const int max_val = 256;
const int row_span = max_val/n_rows;
xil_printf("%3d | ", max_val);
for (int col=0; col<n; col++) xil_printf("-");
xil_printf("|\n\r");
int row_min_val;
for (int row=n_rows-1; row>=0; row--){
row_min_val = row*row_span;
xil_printf("%3d | ", row_min_val);
for (int col=0; col<n; col++){
if (data[col] >= row_min_val) {
xil_printf("*");
} else {
xil_printf(" ");
}
}
xil_printf("|\n\r");
}
xil_printf("\n\r");
}