2009-11-09 2 views
10

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

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

+3

Какой тип графики?2D, 3D, оба? Как насчет платформы? Windows, Linux, Mac, портативный? – Aaron

+0

Можете ли вы быть более конкретным, что должна делать такая библиотека? Обрабатывать изображения? Создать диаграммы? 3D-моделирование? –

+0

Есть ли что-то конкретное, что вы планируете делать (например, построение графика и графическое изображение, манипулирование изображениями, диаграммы) или просто графику общего назначения? Собираетесь ли вы отображать эти графики на экране или сохранять в файл? Вам нужна 2D-графика или 3D-графика? – FrustratedWithFormsDesigner

ответ

2

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

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

+0

Это выглядит хорошо. Спасибо. – 2009-11-09 15:49:49

+2

Вы забыли упомянуть, что лицензии на лицензию довольно дороги. С технической стороны я бы добавил, что библиотека не является пространством имен каким-либо образом, что затрудняет ее использование в сложных сценариях, например. когда вы смешиваете свой собственный код и не видите интерфейсы. – Andreas

+2

На сайте говорится: «DISLIN является бесплатным для некоммерческого использования». Только мои два цента. – BobbyShaftoe

2

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

2

Clutter. Вот несколько фрагментов со страницы:

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

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

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

«Сцена-график слоистых 2D-интерфейсных элементов, управляемых в трехмерном пространстве посредством положения, группировки, прозрачности, масштабирования, обрезки и вращения».

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

0

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

0

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

1

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

1

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

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

qsort http://i37.tinypic.com/2rnwhnp.gif

код Источник:

#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

Мне нравится Cairo library. Он имеет хороший интерфейс для C, и он может выводиться во многих форматах.

Смежные вопросы