Program z fraktalami.

Program z fraktalami.
IS
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
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:

Kopiuj
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ę :)

edytowany 1x, ostatnio: Isild
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:5 minut
  • Lokalizacja:Szczecin
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)


edytowany 1x, ostatnio: kq
IS
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
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:

Kopiuj
 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:

Kopiuj
 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:

Kopiuj
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ć?

Kopiuj
 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?

edytowany 3x, ostatnio: Isild
IS
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

Nikt na prawdę nie wie?

rafal__
  • Rejestracja:prawie 19 lat
  • Ostatnio:około rok
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...
edytowany 1x, ostatnio: rafal__
IS
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

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

Kopiuj
 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

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

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

Kopiuj
    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ń

Kopiuj
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);
} 
edytowany 1x, ostatnio: Isild

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.