Построить график функций, заданной явно : y= 1/(x^2) - C (СИ)
Формулировка задачи:
Должна быть построена прямоугольная система координат (подписаны оси, начало координат, единичный отрезок), координатная сетка .Ось абсцисс горизонтальна, и направлена слева направо ,ось ординат вертикальна и направлена снизу вверх .
Решение задачи: «Построить график функций, заданной явно : y= 1/(x^2)»
textual
Листинг программы
#include <gtk/gtk.h>
#define WIDTH 600
#define HEIGHT 600
gboolean expose_event_callback(GtkWidget * widget, GdkEventExpose * event, gpointer data) {
int i;
double x, y;
cairo_t * cr = gdk_cairo_create(gtk_widget_get_window(widget));
cairo_set_source_rgb(cr, 1., 1., 1.);
cairo_rectangle(cr, 0., 0., (double)WIDTH, (double)HEIGHT);
cairo_fill(cr);
cairo_set_source_rgb(cr, 0., 0., 0.);
cairo_move_to(cr, WIDTH / 2., 5.);
cairo_line_to(cr, WIDTH / 2., HEIGHT - 5.);
cairo_set_line_width(cr, 2.);
cairo_stroke(cr);
cairo_move_to(cr, WIDTH / 2., 5.);
cairo_line_to(cr, WIDTH / 2. - 5., 10.);
cairo_stroke(cr);
cairo_move_to(cr, WIDTH / 2., 5.);
cairo_line_to(cr, WIDTH / 2. + 5., 10.);
cairo_stroke(cr);
cairo_move_to(cr, 5., HEIGHT - 20.);
cairo_line_to(cr, WIDTH - 5., HEIGHT - 20.);
cairo_stroke(cr);
cairo_move_to(cr, WIDTH - 5., HEIGHT - 20.);
cairo_line_to(cr, WIDTH - 10., HEIGHT - 15.);
cairo_stroke(cr);
cairo_move_to(cr, WIDTH - 5., HEIGHT - 20.);
cairo_line_to(cr, WIDTH - 10., HEIGHT - 25.);
cairo_stroke(cr);
cairo_set_line_width(cr, .5);
for ( i = 20; i <= HEIGHT - 20; i += 20 ) {
cairo_move_to(cr, i, HEIGHT - 25);
cairo_line_to(cr, i, HEIGHT - 15);
cairo_stroke(cr);
}
for ( i = HEIGHT - 40; i >= 20; i -= 20 ) {
cairo_move_to(cr, WIDTH / 2. - 5, i);
cairo_line_to(cr, WIDTH / 2. + 5, i);
cairo_stroke(cr);
}
cairo_set_source_rgb(cr, 1., 0., 0.);
cairo_move_to(cr, WIDTH / 2. + 40, 40);
cairo_set_font_size(cr, 20.);
cairo_show_text(cr, "Y");
cairo_move_to(cr, WIDTH - 60, HEIGHT - 60);
cairo_show_text(cr, "X");
cairo_set_line_width(cr, 2.);
cairo_set_source_rgb(cr, 0., 0., 1.);
cairo_move_to(cr, WIDTH / 2. - ( WIDTH / 2. - 20 ), ( HEIGHT - 41. ));
for ( x = -1.; x < 0; x += 0.01 ) {
y = 1. / (x * x);
cairo_line_to(cr, WIDTH / 2. + ( WIDTH / 2. - 20 ) * x, ( HEIGHT - 40. ) - y);
}
cairo_stroke(cr);
for ( x = .01; x < 1.; x += 0.01 ) {
y = 1. / (x * x);
cairo_line_to(cr, WIDTH / 2. + ( WIDTH / 2. - 20 ) * x, ( HEIGHT - 40. ) - y);
}
cairo_stroke(cr);
cairo_destroy(cr);
return TRUE;
}
int main(int argc, char ** argv) {
gtk_init(&argc, &argv);
GtkWidget * win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(win), "Drawing example 2.0");
gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
//gtk_widget_set_size_request(win, 300, 300);
GtkWidget * drw = gtk_drawing_area_new();
gtk_widget_set_size_request(drw, WIDTH, HEIGHT);
gtk_container_add(GTK_CONTAINER(win), drw);
g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(drw), "expose_event", G_CALLBACK(expose_event_callback), NULL);
gtk_widget_show_all(win);
gtk_main();
return 0;
}
Объяснение кода листинга программы
- Объяснение кода:
В данном коде используется библиотека GTK+ для создания графического интерфейса.
Основная функция в коде -
expose_event_callback, она обрабатывает событиеexposeдля виджетаdrw. Эта функция рисует график функцииy=1/x^2на области виджетаdrw. В функцииmainсоздается окноwin, добавляется область для рисованияdrw, и подключается обработчик событияexposeдляdrw. Затем окно и все его содержимое отображаются с помощьюgtk_widget_show_all(win). И, наконец, запускается основной цикл GTK+ с помощьюgtk_main(). - Список переменных и их значений:
WIDTHиHEIGHT- размеры области для рисования в пикселях.win- окно, созданное с помощьюgtk_window_new(GTK_WINDOW_TOPLEVEL).drw- область для рисования, созданная с помощьюgtk_drawing_area_new().i- переменная счетчика, используемая в цикле для отрисовки сетки.xиy- координаты на области для рисования.cr- объект типаcairo_t, используемый для рисования на области для рисования.cairo_set_source_rgb,cairo_set_line_width,cairo_move_to,cairo_line_to,cairo_stroke,cairo_set_font_size,cairo_show_text,cairo_set_line_width,cairo_set_source_rgb,cairo_move_to,cairo_line_to,cairo_stroke- функции, используемые для рисования на области для рисования.gtk_main_quit- функция, вызываемая при уничтожении окнаwin.gtk_widget_set_size_request,gtk_container_add,g_signal_connect,g_signal_connect_data,gtk_widget_show_all,gtk_main- функции, используемые для настройки и отображения окна и его содержимого.
- Задача:
Задача данного кода - построить график функции
y=1/x^2на области для рисованияdrw. Это достигается путем отрисовки линий между точками с координатами(x, 1/x^2), гдеxизменяется от-1до1с шагом0.01. - Возможные ошибки:
- Код может не работать, если библиотека GTK+ не установлена или не подключена.
- Код может не работать, если область для рисования
drwимеет размеры, отличные отWIDTHиHEIGHT. - Код может не работать, если функция
y=1/x^2не является непрерывной и не определена дляx=0. - Код может не работать, если некорректно установлены размеры области для рисования
drwс помощьюgtk_widget_set_size_request(drw, WIDTH, HEIGHT).