Graphics library in C

2020-02-25 07:40发布

I was wondering if there were any good free graphics libraries for C that are easy to use? It's for plotting 2d and 3d graphs and then saving to a file. It's on a Linux system and there's no gnuplot on the system right now.

Or would it just be simpler to switch to another language, and if so which one would be easy to learn?

标签: c graphics
8条回答
ら.Afraid
2楼-- · 2020-02-25 07:50

I like the Cairo library. It has a nice interface to C and it can output in many formats.

查看更多
做个烂人
3楼-- · 2020-02-25 07:54

To plot 2D and 3D graphs in C I would recommend the library DISLIN. You can see examples here or there.

The code is pretty easy to use and gives nice results.

查看更多
欢心
4楼-- · 2020-02-25 07:57

I've used netpbm format a few time when I needed something simple.

That's how I found out that qsort() (in my implementation and for the data provided) performs a merge sort!

qsort

Source code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ARRAY_SIZE 20
#define MAX_VALUE 10

unsigned char arr[ARRAY_SIZE];

void print_array(const void *left, const void *right) {
  static int imgs = 0;
  int k, j;
  FILE *img;
  char fname[100];
  char rgb[100];

  if (++imgs > 9999) return;
  sprintf(fname, "img/img%04d.ppm", imgs);
  /* create image in "img/" directory */
  img = fopen(fname, "w");
  if (img) {
    fprintf(img, "P3\n%d %d\n255\n", ARRAY_SIZE, MAX_VALUE);
    for (j=0; j<MAX_VALUE; j++) {
      for (k=0; k<ARRAY_SIZE; k++) {
        int colour = 0;
        if (left && left == arr+k) colour = 2;
        if (right && right == arr+k) colour = 2;
        if (arr[k] == MAX_VALUE - j - 1) colour = 1;
        switch (colour) {
          default: sprintf(rgb, "%d %d %d", 255, 255, 255); break;
          case 1: sprintf(rgb, "%d %d %d", 0, 0, 0); break;
          case 2: sprintf(rgb, "%d %d %d", 255, 0, 0); break;
        }
        }
        fprintf(img, "%s\n", rgb);
      }
    }
    fclose(img);
  } else {
    perror("img fopen");
  }
}

int cmp(const void *left, const void *right) {
  const unsigned char a = *(const unsigned char*)left;
  const unsigned char b = *(const unsigned char*)right;

  print_array(left, right);
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}

int main(void) {
  int k;
  unsigned int seed = 0; /* or time(0) */

  srand(seed);
  for (k=0; k<ARRAY_SIZE; k++) {
    arr[k] = rand() % MAX_VALUE;
  }
  print_array(NULL, NULL);
  qsort(arr, (size_t)ARRAY_SIZE, sizeof *arr, cmp);
  print_array(NULL, NULL);
  /* use imagemagick to convert group of files to .gif */
  system("convert -delay 0"
         " img/img*.ppm"
         " -loop 1 img/libc-qsort2.gif");
  /* remove .ppm files */
  system("rm img/" "*ppm"); /* ... my editor does not like a
                                   slash and a star together,
                                   even inside quotes */

  return 0;
}
查看更多
啃猪蹄的小仙女
5楼-- · 2020-02-25 07:58

I recommend the Qt GUI toolkit, coupled with the open-source QwtPlot and QwtPlot3D. It's implemented in C++, easy-to-use, extensible, and free...

查看更多
Lonely孤独者°
6楼-- · 2020-02-25 08:03

Most people use the gd library for rendering from C but you must implement the "math plotting" part.

查看更多
来,给爷笑一个
7楼-- · 2020-02-25 08:12

This question is a bit vague, "graphics" is a wide field. You can get pretty far using just plain SDL, but it might also be considered "too low-level". You need to provide more requirements.

查看更多
登录 后发表回答