Среда программирования:
CodeBlocks + MinGW
Статья по теме:
Задача — написать программу, которая будет строить изображение (конечного числа шагов) построения Канторова множества, о котором можно узнать в связанной с примером статье.
Функция drCantor является рекурсивной, т.к. дважды в своём теле вызывает сама себя для двух отрезков, полученных делением данного отрезка на три равномерные части и удалением средней. Первоначальный вызов функции — для единичного отрезка [0,1].
Условие для выхода из рекурсии — длина отрезка на очередном шаге. В данном примере изображаются первые десять этапов построения множества.
Код программы:
#include <gtk/gtk.h> #include <cairo.h> //Функция прорисовки отрезков, изображающих Канторово множество void drCantor (float x, float y, float width, cairo_t *cr) { //Поставим условие вызова и прорисовки до отрезков достаточно малой длины, //чтобы рекурсия не была бесконечной if(width >= 0.008){ //Отрезки изображены прямоугольниками для наглядности cairo_rectangle(cr, x, y, width, 12); cairo_fill(cr); //Сдвигаемся вниз y=y+36; //Вызываем функцию для двух полученных отрезков drCantor(x, y, width/3, cr); drCantor(x+width*2/3, y, width/3, cr); } } /* Функция перерисовки содержимого окна */ void on_draw_event (GtkWidget *widget, cairo_t *cr, gpointer data) { drCantor(10, 10, 610, cr); } /* Функция, вызываемая на событие нажатия кнопки */ void button_click (GtkButton *button, gpointer data) { gtk_main_quit(); } /* Основная функция с которой стартует выполнение программы */ int main( int argc, char *argv[]) { /* запустить GTK+ */ gtk_init(&argc, &argv); /* создать новый виджет - окно и установить свойства*/ GtkWidget *window; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 650, 500); gtk_window_set_title(GTK_WINDOW(window), "Cantor"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Событие, которое отрабатывает на закрытие окна */ g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); /* создать виджет - вертикального расположения элементов */ GtkWidget *vbox; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_add(GTK_CONTAINER (window), vbox); /* создать виджет - область для рисования */ GtkWidget *drawing_area; drawing_area = gtk_drawing_area_new(); /* разместить область в верхней части окна*/ gtk_box_pack_start (GTK_BOX(vbox), drawing_area, TRUE, TRUE, 10); /* Событие отрисовки содержимого области */ g_signal_connect(G_OBJECT(drawing_area), "draw", G_CALLBACK(on_draw_event), NULL); /* создать виджет - кнопка */ GtkWidget *button; button = gtk_button_new_with_label("Quit"); gtk_container_set_border_width (GTK_CONTAINER (button), 10); /* разместить кнопку в нижней части окна*/ gtk_box_pack_end (GTK_BOX(vbox), button, FALSE, FALSE, 10); /* Событие, которое отрабатывает на нажатие кнопки */ g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(button_click), NULL); /* отобразить окно и все его виджеты */ gtk_widget_show_all(window); /* передаём управление GTK+ */ gtk_main(); return 0; }
Прикрепленный файл | Размер |
---|---|
Cantor.zip | 18.6 кб |