Program z fraktalami.

0

Witam, aktualnie próbuję napisać program do generowania fraktali w gtk.
Napisałem sobie już wstępnie prawie cały interfejs programu oraz algorytm do obliczania fraktala, ale zawsze muszą się znaleźć jakieś problemy.

Stworzyłem okno do wprowadzania liczby zespolonej, oraz wybrania wzoru.
Stworzyłem również przycisk generuj, chciałbym żeby po jego naciśnięciu włączyło się nowe okno(w moim przypadku nowa funkcja void z nowym oknem, zawierający pole z wygenerowanym fraktalem).
Do stworzenia combo boxa z wzorami użyłem:

combo = gtk_combo_box_text_new();
    gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), NULL, "Wzor 1.");
    gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), NULL, "Wzor 2.");
    gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), NULL, "Wzor 3.");
    gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 1);
    gtk_container_add(GTK_CONTAINER(kontener), combo);

Mój problem polega na tym, że nie wiem jak przekazać wybrany wzór, wpisaną liczbe zespoloną do kolejnego okna, oraz stworzenia w nowym oknie obszaru w którym wygeneruje się fraktal, oraz jak ten fraktal wygenerować.

Bardzo proszę o pomoc, oraz dokładne wytłumaczenie, ponieważ jestem zielony w tej sprawie, oraz nie jestem specjalistą w używaniu wskaźników, cały czas się jeszcze uczę :)

0

Z tego co opisujesz chcesz przekazać liczbę zespoloną i funkcję. Poczytaj dowolny tutorial o wskaźnikach (w tym na funkcje), przekaż liczbę przez wartość i wskaźnik do funkcji jako parametry do funkcji tworzącej nowe okienko. (zakładam, że to poprawna praktyka w GTK)

0

Chodzi mi o te kluczowe sprawy:
1. Liczbe zespoloną podaję w dwóch oknach w RE i IM, to jest wpisywanie w stringu tak? Chcę ją z pomocą atoi zamienić na int i przesłać do nowej funkcji.
Takim sposobem mam zadeklarowane wprowadzanie funkcji:

 wejscieRE = gtk_entry_new();
    gtk_container_add(GTK_CONTAINER(kontener), wejscieRE);
    gtk_widget_set_size_request(wejscieRE, 10, 10); 

po tym mam przekazać do funkcji *wejscieRE i *wejscieIM?

2. Z tym combo boxem nie wiem jak jest, w tym kodzie co napisałem, to po wybraniu jakiegoś wzoru wybór użytkownika jest gdzieś zapisany?

3. Przycisk do generowania utworzyłem tak:

 g_signal_connect(G_OBJECT(generuj), "clicked", G_CALLBACK(obszar_generowania),(gpointer)etykieta);

Czy ta opcja jest poprawna do przekazywania tych wskaźników? Jeśli tak to gdzie mam dodać bo jak wprowadzałem coś takiego:

g_signal_connect(G_OBJECT(generuj), "clicked", G_CALLBACK(obszar_generowania(wejscieRE)),(gpointer)etykieta);

to nie działa ;/

Nagłówek funkcji miał by tak wyglądać?

 void obszar_generowania(GtkWidget *wejscieRE, GtkWidget *wejsceIM, (i ten wybór wzoru, nie wiem jak go przekazać), gpointer etykieta);

Edit. nie zauważyłem, że wpisałem mój kod jako błąd ortograficzny i nie było go widać.

Jeszcze mam pytanko dy rysowania w GDA(GtkDrawningArea), jeśli mój program np liczy piksel biały i czarny czyli 1 i 0, to jaka komenda zamieni te obliczenia na piksel biały i czarny oraz wstawi go do GDA?

0

Nikt na prawdę nie wie?

0

Ja gtk dotykałem dawno temu i niezbyt specjalnie polubiłem. Skupię się na reszcie, co do 3 to nie jestem pewien, tak na logikę.
1.

  • Dlaczego na int, nie na double?
  • w jaki sposób masz zapisane te "wzory" w kodzie? Opisz dokładniej

przykład tutaj: http://zetcode.com/gui/gtk2/gtkevents/:

  • do g_signal_connect masz przekazać 3 argumenty: twój przycisk, funkcja zwrotna o sygnaturze void (GtkWidget , gpointer) oraz gpointer z dodatkowymi danymi. gpointer to void, więc trzeba dodatkowo castować. Możesz zrobić tak, że jako data podajesz swoje całe okno poprzez G_OBJECT(window), potem w callbacku castować to na odpowiedni typ, wyciągnąć wartości z wejścieRE, wejścieIM, combo i dalej odpalić już funkcję odpowiedzialną za rysowanie. Nie pamiętam gtk, więc nie podam szczegółów...
0

Co do przekazywania danych do funkcji generuj to sobie zrobiłem taką strukturę:

 typedef struct rysunek{
int wzor;
double RE;
double IM;
int rozdzielczosc;
}rysunek;
...
    struct rysunek *dane;

    dane = malloc(sizeof(rysunek));//tak to później deklaruję

Przekazuje je tak

    g_signal_connect(G_OBJECT(generuj), "clicked", G_CALLBACK(obszar_generowania), dane); 

Tylko nie wiem jak mam przekazać dane z wpisanego okienka do struktury

    GtkWidget *wejscieRE;

....

    wejscieRE = gtk_entry_new(); //to jest moje wejscie
    gtk_container_add(GTK_CONTAINER(kontener), wejscieRE);
    gtk_widget_set_size_request(wejscieRE, 10, 10);
....

   dane->RE = atof(wejscieRE);//niby tak sie przypisuje tą wartość, ale mi nie działa, jak wyświetlam ich wartosc w kolejnej funkcji to jest 0,0000000
 

Z tymi wzorami mi chodziło, że jak zostanie wybrany np pierwszy wzór, to przypisuje ten wybór do struktury i później w następnej funkcji robię to if'ami że jeżeli to to licz ten wzór, jeżeli inny to licz ten drugi.
na razie mam jeden wzór. na razie bardziej mi chodzi o to żeby uzyskać to gdzie jest zapisywany wybór z combo box'a i z wejscia IM i RE.
I moim główym problemem są piksele, czy jest jakaś funkcja że np ciąg 00011010100110010101001010 zamienia na piksele białe i czarne?

Mój obszar do generowania wygląda na razie nijak i jest to jeden wielki obiekt badań

void obszar_generowania(GtkWidget *widget, rysunek *dane)
{
    GtkWidget *okno;
    GtkWidget *kontener_vbox;
    GtkWidget *obszar_rysunkowy;

    okno = g_object_new ( GTK_TYPE_WINDOW, "window-position", GTK_WIN_POS_CENTER, "title", "Frak, wygenerowany fraktal.", NULL );
    g_signal_connect ( okno, "close", G_CALLBACK (gtk_main_quit), NULL );

    kontener_vbox = g_object_new( GTK_TYPE_VBOX, "spacing", 15, NULL );
    gtk_container_add( GTK_CONTAINER( okno ), kontener_vbox );

    obszar_rysunkowy = gtk_drawing_area_new ();
    gtk_box_pack_start ( GTK_BOX(kontener_vbox), obszar_rysunkowy, TRUE, TRUE, 0 );

    gtk_widget_show_all ( okno );
    printf("%d %f %f %d\n", *dane);
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1