Построить график функций, заданной явно : 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д