2009-11-09 18 views
10

Ich frage mich, ob es irgendwelche guten kostenlosen Grafikbibliotheken für C gibt, die einfach zu benutzen sind? Es ist zum Zeichnen von 2D- und 3D-Graphen und dann Speichern in einer Datei. Es ist auf einem Linux-System und es gibt momentan kein gnuplot auf dem System.Grafikbibliothek in C

Oder wäre es einfacher, in eine andere Sprache zu wechseln, und wenn ja, welche wäre leicht zu erlernen?

+3

Welche Art von Grafiken?2D, 3D, beides? Wie wäre es mit Plattform? Windows, Linux, Mac, tragbar? – Aaron

+0

Können Sie etwas genauer sein, was eine solche Bibliothek tun sollte? Bilder handhaben? Diagramme erstellen? 3D Modellierung? –

+0

Gibt es etwas Spezielles, das Sie planen (z. B. Plotten und Graphen, Bildbearbeitung, Diagramme) oder nur allgemeine Grafiken? Werden Sie diese Grafiken auf dem Bildschirm anzeigen oder in einer Datei speichern? Benötigen Sie 2D-Grafiken oder 3D-Grafiken? – FrustratedWithFormsDesigner

Antwort

2

Um 2D- und 3D-Graphen in C zu plotten, würde ich die Bibliothek DISLIN empfehlen. Sie können Beispiele here oder there sehen.

Der Code ist ziemlich einfach zu bedienen und liefert gute Ergebnisse.

+0

Das sieht gut aus. Danke. –

+2

Sie haben vergessen zu erwähnen, dass Dislin-Lizenzen ziemlich teuer sind. Von der technischen Seite würde ich hinzufügen, dass die Bibliothek in keiner Weise Namespaced ist, die es schwierig macht, in komplexen Szenarien, z. wenn Sie mit Ihrem eigenen Code mischen und die Schnittstellen nicht sehen können. – Andreas

+2

Die Seite sagt "DISLIN ist frei für nicht-kommerzielle Nutzung." Nur meine zwei Cent. – BobbyShaftoe

2

Diese Frage ist ein bisschen vage, "Grafik" ist ein weites Feld. Sie können mit nur einfach SDL ziemlich weit kommen, aber es könnte auch als "zu niedrig" angesehen werden. Sie müssen mehr Anforderungen stellen.

2

Es gibt Clutter. Hier sind ein paar Auszüge aus der About-Seite:

"Clutter ist eine Open-Source-Software-Bibliothek für die Erstellung von schnellen, visuell reichen, tragbaren und animierten grafischen Benutzeroberflächen."

"Clutter zielt darauf ab, unspezifisch zu sein - es implementiert keinen bestimmten User Interface-Stil, sondern bietet eine umfassende generische Grundlage, die die schnelle und einfache Erstellung von Toolkits auf höherer Ebene ermöglicht, die auf spezifische Bedürfnisse zugeschnitten sind."

"Entwickelt in C, mit Sprachbindungen für Perl, Python, C#, C++, Vala und Ruby."

"Szenengraph von 2D-Ebenenelementen, die im 3D-Raum über Position, Gruppierung, Transparenz, Skalierung, Clipping und Drehung manipuliert wurden."

Ich habe es nicht selbst ausprobiert, aber es scheint ziemlich flexibel zu sein, wenn man nach etwas sucht, mit dem man nur herumspielen kann.

0

Die meisten Leute verwenden die gd library für das Rendern von C, aber Sie müssen den "Math Plotten" Teil implementieren.

0

Werfen Sie einen Blick auf PGPLOT. Es ist alt, aber funktioniert gut und sollte in den Repos sein. PLPLOT ist auch eine Option, es ist ähnlich und neueren und sollte auch in den Repos verfügbar sein. Sie sind beide sehr mächtig und können tun, was Sie angegeben haben.

1

Ich empfehle das GUI-Toolkit Qt, gekoppelt mit den Open-Source-Geräten QwtPlot und QwtPlot3D. Es ist in C++ implementiert, einfach zu bedienen, erweiterbar und kostenlos ...

1

Ich habe netpbm Format ein paar Mal verwendet, wenn ich etwas Einfaches brauchte.

So habe ich herausgefunden, dass qsort() (in meiner Implementierung und für die bereitgestellten Daten) eine Zusammenführung Sortierung durchführt!

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

Quellcode:

#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

Ich mag die Cairo library. Es hat eine nette Schnittstelle zu C und kann in vielen Formaten ausgeben.

Verwandte Themen