Построить график функций, заданной явно : 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;
}

Объяснение кода листинга программы

  1. Объяснение кода: В данном коде используется библиотека GTK+ для создания графического интерфейса. Основная функция в коде - expose_event_callback, она обрабатывает событие expose для виджета drw. Эта функция рисует график функции y=1/x^2 на области виджета drw. В функции main создается окно win, добавляется область для рисования drw, и подключается обработчик события expose для drw. Затем окно и все его содержимое отображаются с помощью gtk_widget_show_all(win). И, наконец, запускается основной цикл GTK+ с помощью gtk_main().
  2. Список переменных и их значений:
    • 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 - функции, используемые для настройки и отображения окна и его содержимого.
  3. Задача: Задача данного кода - построить график функции y=1/x^2 на области для рисования drw. Это достигается путем отрисовки линий между точками с координатами (x, 1/x^2), где x изменяется от -1 до 1 с шагом 0.01.
  4. Возможные ошибки:
    • Код может не работать, если библиотека GTK+ не установлена или не подключена.
    • Код может не работать, если область для рисования drw имеет размеры, отличные от WIDTH и HEIGHT.
    • Код может не работать, если функция y=1/x^2 не является непрерывной и не определена для x=0.
    • Код может не работать, если некорректно установлены размеры области для рисования drw с помощью gtk_widget_set_size_request(drw, WIDTH, HEIGHT).

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы