Графическая библиотека на С - PullRequest
14 голосов
/ 09 ноября 2009

Мне было интересно, есть ли какие-нибудь хорошие бесплатные графические библиотеки для C, которые просты в использовании? Это для построения 2D и 3D графиков, а затем сохранить в файл. Это в системе Linux, и сейчас в системе нет gnuplot.

Или было бы проще переключиться на другой язык, и если да, то какой из них будет легко выучить?

Ответы [ 8 ]

5 голосов
/ 10 ноября 2009

Мне нравится Каирская библиотека . Он имеет приятный интерфейс для C и может выводить во многих форматах.

3 голосов
/ 09 ноября 2009

Для построения 2D и 3D графиков на языке C я рекомендую библиотеку DISLIN Вы можете увидеть примеры здесь или там .

Код довольно прост в использовании и дает хорошие результаты.

2 голосов
/ 09 ноября 2009

Я использовал формат netpbm несколько раз, когда мне было нужно что-то простое.

Вот как я узнал, что qsort() (в моей реализации и для предоставленных данных) выполняет сортировку слиянием!

qsort

Исходный код:

#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;
}
2 голосов
/ 09 ноября 2009

Там Беспорядок . Вот несколько фрагментов со страницы about:

"Clutter - это библиотека программного обеспечения с открытым исходным кодом для создания быстрых, визуально насыщенных, портативных и анимированных графических пользовательских интерфейсов."

«Clutter стремится быть неконкретным - он не реализует какой-либо конкретный стиль пользовательского интерфейса, а скорее предоставляет богатую общую основу, которая облегчает быстрое и простое создание наборов инструментов более высокого уровня, приспособленных к конкретным потребностям».

"Разработано в C, с привязками к языку для Perl, Python, C #, C ++, Vala и Ruby."

"Граф сцены многослойных элементов интерфейса 2D, управляемых в трехмерном пространстве с помощью положения, группировки, прозрачности, масштабирования, отсечения и поворота."

Я сам не пробовал, но это кажется довольно гибким, если вы ищете что-то, чтобы просто поиграть.

2 голосов
/ 09 ноября 2009

Этот вопрос немного расплывчат, «графика» - это широкое поле. Вы можете продвинуться довольно далеко, используя просто SDL , но это также можно считать "слишком низким уровнем". Вам необходимо предоставить больше требований.

1 голос
/ 09 ноября 2009

Я рекомендую Qt GUI инструментарий в сочетании с QwtPlot и QwtPlot3D с открытым исходным кодом. Он реализован на C ++, прост в использовании, расширяем и бесплатен ...

0 голосов
/ 09 ноября 2009

Посмотрите на PGPLOT. Он старый, но прекрасно работает и должен быть в репозиториях. PLPLOT также является опцией, она похожа и новее и должна быть легко доступна в репозиториях. Они оба очень мощные и могут делать то, что вы указали.

0 голосов
/ 09 ноября 2009

Большинство людей используют библиотеку gd для рендеринга из C, но вы должны реализовать часть "математическое построение".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...