Основные графические примитивы в C

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Введение в графику на C

Графика на языке программирования C может показаться сложной задачей для новичков, но с правильным подходом и инструментами это становится вполне выполнимо. В этой статье мы рассмотрим основные графические примитивы, такие как точки, линии, прямоугольники и круги, и научимся их рисовать с помощью библиотеки SDL (Simple DirectMedia Layer). SDL — это кроссплатформенная библиотека, которая предоставляет низкоуровневый доступ к аудио, клавиатуре, мыши и графике. Она широко используется для разработки игр и мультимедийных приложений благодаря своей простоте и гибкости.

Кинга Идем в IT: пошаговый план для смены профессии

Инициализация графического режима

Прежде чем мы сможем начать рисовать, нам нужно инициализировать графический режим. Для этого мы будем использовать SDL. Убедитесь, что у вас установлена библиотека SDL и подключена к вашему проекту. Это можно сделать, скачав библиотеку с официального сайта SDL и следуя инструкциям по установке для вашей операционной системы.

c
Скопировать код
#include <SDL2/SDL.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        printf("SDL_Init Error: %s\n", SDL_GetError());
        return 1;
    }

    SDL_Window *win = SDL_CreateWindow("Graphics in C", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (win == NULL) {
        printf("SDL_CreateWindow Error: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (ren == NULL) {
        SDL_DestroyWindow(win);
        printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    // Your drawing code will go here

    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

Этот код инициализирует SDL, создает окно и рендерер, который мы будем использовать для рисования. В конце мы очищаем ресурсы и завершаем работу с SDL. Важно помнить, что правильная инициализация и завершение работы с библиотекой помогут избежать утечек памяти и других проблем.

Рисование точек и линий

Теперь, когда у нас есть окно и рендерер, мы можем начать рисовать. Начнем с самых простых примитивов — точек и линий. Эти базовые элементы помогут вам понять, как работает рендеринг в SDL и как управлять цветами и координатами.

Рисование точек

Для рисования точки в SDL используется функция SDL_RenderDrawPoint. Эта функция позволяет указать координаты точки и цвет, в который она будет окрашена.

c
Скопировать код
SDL_SetRenderDrawColor(ren, 255, 0, 0, 255); // Red color
SDL_RenderDrawPoint(ren, 320, 240); // Draw point at the center of the window
SDL_RenderPresent(ren); // Update the screen
SDL_Delay(2000); // Wait for 2 seconds

В этом примере мы устанавливаем цвет рисования на красный с помощью SDL_SetRenderDrawColor, затем рисуем точку в центре окна и обновляем экран, чтобы увидеть результат. Функция SDL_Delay позволяет нам задержать выполнение программы на 2 секунды, чтобы мы могли увидеть нарисованную точку.

Рисование линий

Для рисования линий используется функция SDL_RenderDrawLine. Линии могут быть полезны для создания более сложных графических элементов и форм.

c
Скопировать код
SDL_SetRenderDrawColor(ren, 0, 255, 0, 255); // Green color
SDL_RenderDrawLine(ren, 100, 100, 540, 380); // Draw line from (100, 100) to (540, 380)
SDL_RenderPresent(ren); // Update the screen
SDL_Delay(2000); // Wait for 2 seconds

В этом примере мы устанавливаем цвет рисования на зеленый и рисуем линию от точки (100, 100) до точки (540, 380). Как и в случае с точкой, мы обновляем экран и задерживаем выполнение программы, чтобы увидеть результат.

Создание прямоугольников и кругов

Теперь перейдем к более сложным примитивам — прямоугольникам и кругам. Эти фигуры часто используются в графических приложениях для создания интерфейсов, кнопок и других элементов.

Рисование прямоугольников

Для рисования прямоугольников используется функция SDL_RenderDrawRect или SDL_RenderFillRect для заполненных прямоугольников. Прямоугольники могут быть полезны для создания рамок, кнопок и других элементов интерфейса.

c
Скопировать код
SDL_Rect rect;
rect.x = 200;
rect.y = 150;
rect.w = 240;
rect.h = 180;

SDL_SetRenderDrawColor(ren, 0, 0, 255, 255); // Blue color
SDL_RenderDrawRect(ren, &rect); // Draw rectangle
SDL_RenderPresent(ren); // Update the screen
SDL_Delay(2000); // Wait for 2 seconds

В этом примере мы создаем структуру SDL_Rect, задаем координаты верхнего левого угла и размеры прямоугольника, затем устанавливаем цвет рисования на синий и рисуем прямоугольник. Как и в предыдущих примерах, мы обновляем экран и задерживаем выполнение программы.

Рисование кругов

SDL не предоставляет встроенной функции для рисования кругов, поэтому нам придется написать свою функцию. Круги могут быть полезны для создания различных графических элементов, таких как кнопки, индикаторы и другие элементы интерфейса.

c
Скопировать код
void DrawCircle(SDL_Renderer *renderer, int32_t centreX, int32_t centreY, int32_t radius) {
    const int32_t diameter = (radius * 2);

    int32_t x = (radius – 1);
    int32_t y = 0;
    int32_t tx = 1;
    int32_t ty = 1;
    int32_t error = (tx – diameter);

    while (x >= y) {
        //  Each of the following renders an octant of the circle
        SDL_RenderDrawPoint(renderer, centreX + x, centreY – y);
        SDL_RenderDrawPoint(renderer, centreX + x, centreY + y);
        SDL_RenderDrawPoint(renderer, centreX – x, centreY – y);
        SDL_RenderDrawPoint(renderer, centreX – x, centreY + y);
        SDL_RenderDrawPoint(renderer, centreX + y, centreY – x);
        SDL_RenderDrawPoint(renderer, centreX + y, centreY + x);
        SDL_RenderDrawPoint(renderer, centreX – y, centreY – x);
        SDL_RenderDrawPoint(renderer, centreX – y, centreY + x);

        if (error <= 0) {
            ++y;
            error += ty;
            ty += 2;
        }

        if (error > 0) {
            --x;
            tx += 2;
            error += (tx – diameter);
        }
    }
}

SDL_SetRenderDrawColor(ren, 255, 255, 0, 255); // Yellow color
DrawCircle(ren, 320, 240, 100); // Draw circle at the center with radius 100
SDL_RenderPresent(ren); // Update the screen
SDL_Delay(2000); // Wait for 2 seconds

Эта функция рисует круг, используя алгоритм Брезенхема для окружностей. Мы устанавливаем цвет рисования на желтый и вызываем функцию DrawCircle, чтобы нарисовать круг в центре окна с радиусом 100 пикселей. Как и в предыдущих примерах, мы обновляем экран и задерживаем выполнение программы.

Завершение работы и очистка ресурсов

После того как мы закончили рисовать, важно правильно завершить работу и очистить все использованные ресурсы. Это включает в себя уничтожение рендерера и окна, а также завершение работы с SDL. Правильное завершение работы с библиотекой поможет избежать утечек памяти и других проблем.

c
Скопировать код
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();

Эти шаги помогут избежать утечек памяти и других проблем, связанных с неправильным завершением работы программы. Убедитесь, что вы всегда очищаете ресурсы после их использования.

Теперь вы знаете, как инициализировать графический режим, рисовать точки, линии, прямоугольники и круги в C с использованием SDL. Продолжайте экспериментировать и улучшать свои навыки! 🚀

Графика в C может показаться сложной, но с правильными инструментами и подходом вы сможете создавать удивительные вещи. Не бойтесь экспериментировать и пробовать новые методы. Удачи в ваших графических проектах!

Читайте также