Существует ли рекомендуемый способ отображения данных с использованием символов ascii?

Я пишу простую тестовую программу на языке C, которая собирает некоторые данные датчиков, анализирует и отображает их. Данные довольно просты, и у меня есть только последовательный интерфейс консоли. Тем не менее, я хотел бы построить форму волны, используя только моноширинные символы ascii.

Есть ли стандартный рекомендуемый способ сделать что-то подобное?

256  |           *
     |          *
     |            *
     |         *   *
128  |        *     *
     |       *       *       *  
     |   *                 ** *
     | ** ***         * * *    **
  0  _______________________________    

🤔 А знаете ли вы, что...
C можно использовать для создания высокоэффективных и производительных алгоритмов и вычислений.


121
3

Ответы:

Решено

Это просто пара вложенных циклов.

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");
}