2D-Grafiken in C



  • Hallo Leute, ich weiss diese Frage wird vermutlich einige nervern:

    Vorerst ich weiss um Graphiken zu entwickeln brauch ich Gui-Libs wie Gtk etc.

    Trotzdem frage ich:

    Was mach ich wenn ich einfach nur ganz billige 2D Grafiken wie Funktionen oder Flächen "zeichnen" möchte?

    Später würdens viell auch kleine 3d Graphiken, die müssen jedoch nicht mal drehbar sein.

    Hab mal von ner compilereigenen dos.h (glaub bei bloodshed cpp) gehört, wo ich einfach nur die Koordinaten eingeben muss und es werden Geraden gezeichnet.

    Genau so etwas suche ich.

    Ist mir egal ob systemabhäbgig oder compilerabhängig besser wäre aba nicht compilerabhängig.

    Gibts viell Kits die es einem beginner etwas einfacher machen?

    Toll wären einfach libs ohne dass ich mich gleich in gui programmierung einarbeiten muss (was ich mir ja bereits angesehen habe, wo mich aber erst später einarbeiten möchte)

    Ihr würdet mir sehr helfen, thx im voraus



  • bzw wie kann ich in gtk Graphen zeichnen?

    Ist das schwer?



  • Also deine Frage gehört ins Froum Andere GUIs - Qt, GTK+, wxWidgets.

    bzw wie kann ich in gtk Graphen zeichnen?
    Ja das geht.

    Ist das schwer?
    Naja, das kommt wohl darauf an was man mit schwer meint.
    Aber gtk erfordert eine gewisse Einarbeitungszeit, erst recht für jemand der sich noch nicht in C auskennt.
    Also wenn du nur etwas auf die schnelle machen willst dann rate ich dir von gtk ab.



  • Also ich beherrsche (manches halt nur theoretisch) die C-Grundlagen, und bin auch bereit mich länger in gtk einzuarbeiten.

    Würde mich aber freuen wenn ich ein RAD finde, oder es einfacher wäre, da diese Zeichnungen ja noch nicht wirklich komplex sind sondern eher sehr einfach sind.



  • Also hier ist ein Beispiel wie man in Gtk zeichnet:

    #include <gtk/gtk.h>
    
    gboolean on_drawingarea1_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
    
    int main (int argc, char *argv[])
    {
      GtkWidget *window1;
      GtkWidget *drawingarea1;
    
      gtk_set_locale ();
      gtk_init (&argc, &argv);
    
      window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title (GTK_WINDOW (window1), "window1");
      drawingarea1 = gtk_drawing_area_new ();
      gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea1), 200,200);
      gtk_container_add (GTK_CONTAINER (window1), drawingarea1);
      gtk_signal_connect (GTK_OBJECT (drawingarea1), "expose_event",GTK_SIGNAL_FUNC (on_drawingarea1_expose_event),drawingarea1);
    
      gtk_widget_show_all( window1 );
    
      gtk_main ();
      return 0;
    }
    
    gboolean on_drawingarea1_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
    {
      GdkGC *gc = gdk_gc_new(widget->window);
      GdkColormap *colormap = gdk_window_get_colormap (widget->window);
      GdkColor red, green;
    
      red.red = 0xffff;
      red.green = 0;
      red.blue = 0;
      gdk_color_alloc (colormap, &red);
    
      green.red = 0;
      green.green = 0xffff;
      green.blue = 0;
      gdk_color_alloc (colormap, &green);
    
      gdk_gc_set_foreground (gc,&red);
      gdk_draw_rectangle(widget->window, gc, TRUE, 10, 10, 100, 100);
    
      gdk_gc_set_foreground (gc,&green);
      gdk_draw_rectangle(widget->window, gc, TRUE, 110, 110, 60, 60);
    
      gdk_draw_line(widget->window,widget->style->black_gc,0,100,180,100);
    
      return TRUE;
    }
    

    Das Programm ist zwar nicht kompllet aber funktioniert.
    Ich vermute mal das dieses Beispiel dir kompliziert vorkommen mag, obwohl es eigentlich nicht ist.
    Aber wenn du fragen hast dann poste sie einfach.



  • Danke für dein Beispiel, da ich mir gtk schon etwas angesehen habe versteh ich in etwa was der code macht könntest du mir den zweiten Teil (Block) viell etwas genauer erklären?

    Wäre sehr nett, danke.

    Noch eine Frage: Kann ich zwischen den gtk anweisungen eig C code schreiben?

    Oder is gtk ne komplett eigene, wenn auch an C angelehnte Sprache?

    Wie sind da die Verhältnisse?



  • c-newling schrieb:

    Noch eine Frage: Kann ich zwischen den gtk anweisungen eig C code schreiben?

    Ja, wieso solltest du das nicht können?

    c-newling schrieb:

    Oder is gtk ne komplett eigene, wenn auch an C angelehnte Sprache?

    Nein, gtk ist eine in C geschriebene Library.

    Greetz, Swordfish



  • zweiten Teil (Block) viell etwas genauer erklären?

    Du meinst Fuonnktion on_drawingarea1_expose_event.
    Naja ich versuche es:
    Diese Funktion ist mit dem expose-event verknüpft, wenn man expose-event nicht mit einer solchen Funktion verknüpft(mit gtk_signal_connect in gtk-1.2) wird Zeichnen fehlschlagen.

    gboolean on_drawingarea1_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
    {
    /*Zeiger auf graphics context und colormap 
      von dem Widget auf dem gezeichnet wird holen 
      Diese Strukturen sind Teile eines Widgets*/
      GdkGC *gc = gdk_gc_new(widget->window);
      GdkColormap *colormap = gdk_window_get_colormap (widget->window);
    
    /*Zwei Farben erstellen*/
      GdkColor red, green;
    
      red.red = 0xffff;
      red.green = 0;
      red.blue = 0;
    /*rot zum colormap hinzufuegen*/
      gdk_color_alloc (colormap, &red);
    
      green.red = 0;
      green.green = 0xffff;
      green.blue = 0;
      gdk_color_alloc (colormap, &green);
    
    /*aktuelle Vordergrundfarbe auf rot setzen */
      gdk_gc_set_foreground (gc,&red);
    
    /*Viereck zeichnen*/
      gdk_draw_rectangle(widget->window, gc, TRUE, 10, 10, 100, 100);
    
    /*aktuelle Vordergrundfarbe auf gruen setzen */
      gdk_gc_set_foreground (gc,&green);
      gdk_draw_rectangle(widget->window, gc, TRUE, 110, 110, 60, 60);
    
    /*Eine Linie zeichnen in schwarzer Farbe zeichnen
      diese Farbe muss nicht erstelt werden weil sie bereits Voirhanden ist*/
      gdk_draw_line(widget->window,widget->style->black_gc,0,100,180,100);
    
    /*Diese Funktion soll TRUE zurueckgeben, warum das so ist, weiss ich nicht 
      so wird es jeden jedenfalls im Beispiel in der Dokumentation gemacht*/
      return TRUE;
    }
    

    c-newling und ich wie schon gesagt das ist alles C, erkundige dich noch mal über Compiler, Linker, Funktions-Bibliotheken, Header-Dateien.



  • Danke, das is ziemlich hilfreich! Ich werd mir das noch genaue ansehen.

    Nur eine Frage noch:

    Was ist wenn ich noch nicht weiss wo die Linie ist kann ich statt den 4 Zahlen 4 Variablen reinschreiben??



  • Ja.
    Aber deine Frage sagt mir, das du ein gutes C-Buch lesen willst.

    Greetz, Swordfish



  • was soll das wida heissen?

    Ich frage nur ganz genau weil ich sicher gehen will, dass es sich hier nicht anders verhält (und gehe dafür das risiko ein den falschen Eindruck zu vermitteln)

    Ich beherrsche die C Grundlagen....



  • Würdest du die Grundlagen von C beherrschen, so solltest du erkennen, dass es sich zB. bei

    gdk_draw_line( widget->window, widget->style->black_gc, 0, 100, 180, 100 );
    

    um einen Funktionsaufruf handelt, und du wüsstest, dass du auch

    int x = 0, y = 100, x1 = 180, y1 = 100;
    gdk_draw_line( widget->window, widget->style->black_gc, x, y, x1, y1 );
    

    schreiben könntest.

    Greetz, Swordfish



  • he ich will mich hier gar nicht mit dir anlegen und hab auch keine Lust zum streiten aba wie gesagt

    Ich weiss das.

    Was ich eben noch nicht so begriffen habe waren die Verhältnisse zwischen C und gtk.

    Ich weiss das, nur ich frage lieber ganz genau nach ob es sich auch hier genauso verhält.

    ....



  • gtk ist ein gui system, welches man als library in C benutzen kann. so verhaelt sich das.



  • user89 schrieb:

    he ich will mich hier gar nicht mit dir anlegen und hab auch keine Lust zum streiten [...]

    Ich - für mein Empfinden - streite auch nicht mit dir.

    @c.rackwitz:

    Schön gesagt 😉

    Greetz, Swordfish



  • Hallo Leute, hab was gefunden was meinen Ansprüchen entspricht und auch einfach zu handhaben ist.

    die lib graphics.h

    trotzdem thx an alle


Anmelden zum Antworten