Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 15
1

Операция объединения для графических примитивов

26.05.2015, 20:38. Просмотров 883. Ответов 3
Метки нет (Все метки)

Есть задача: создать систему классов, реализующих графические примитивы (круг, треугольник, квадрат) на плоскости с реализацией операций над множествами (объединение, пересечение, разность).
Все выполняемо, кроме самого главного.
Не могу понять как сделать такую функцию, которая бы строила новую фигуру по результату операции. Допустим есть два круга, для которых выполняется операция объединения. Функция получит координаты двух фигур и выполнит объединение, но вернуть то нужно будет совсем не круг и даже не примитив. Как можно написать такую функцию? На примере, допустим, кругов.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2015, 20:38
Ответы с готовыми решениями:

Рисование графических примитивов
Приложение, которое читает данные из файла о координатах и размерах различных графических...

отображение графических примитивов
не подскажите как нарисовать круг, треугольник и домик. Ищу в интернете не как не могу найти(

Хранение, вывод и изменение графических примитивов
Здравствуйте! Помогите новичку организовать хранение, вывод и изменение графических примитивов....

Что использовать для рисования примитивов
Ребят подскажите на чем можно программно порисовать? желательно на с++ в 12 визуалке для WinForm....

Реализация двойной буферизации для рисования графических примитивов
Решил я значит порисовать всяких кружков-квадратиков, а они мерцают. Убрал эффект наполовину,...

3
Grrr
0 / 0 / 1
Регистрация: 26.05.2015
Сообщений: 2
26.05.2015, 21:31 2
Лучший ответ Сообщение было отмечено FatSlowpoke как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <Windows.h>
#include <tchar.h>
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPTSTR cmd, int mode)
{
    const TCHAR szClassMainName[] = _T("Main");
    HWND  hWnd;
    MSG   msg;
    WNDCLASS wc;
 
    wc.style            = CS_VREDRAW | CS_HREDRAW;
    wc.lpfnWndProc      = WndProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = szClassMainName;
 
    if (!RegisterClass(&wc))
        return 1;
 
    hWnd = CreateWindow(szClassMainName, _T(""), WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL);
 
    if (!hWnd)
      return 1;
 
    ShowWindow(hWnd, mode);
    UpdateWindow(hWnd); 
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC  hDC;
    PAINTSTRUCT ps;
 
    static int   clientWidth,  clientHeight;
    static HPEN   pen = NULL;
    static HBRUSH  brush = NULL;
 
    RECT  rectangle = {-50, 50, 50, -50};
    RECT  circle = {-20, 20, 150, -150};
    HRGN  region1, region2;
 
    switch (message)
    {
        case WM_CREATE:
            pen   = CreatePen(PS_INSIDEFRAME, 1, RGB(0,128,0));
            brush = CreateSolidBrush(RGB(0,0,128));
            break;
 
        case WM_SIZE:
            clientWidth  = LOWORD(lParam);
            clientHeight = HIWORD(lParam);
            break;
 
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
 
            SetMapMode(hDC, MM_ANISOTROPIC);
            SetWindowExtEx(hDC, clientWidth, -clientHeight, NULL);
            SetViewportExtEx(hDC, clientWidth, clientHeight, NULL);
            SetViewportOrgEx(hDC, clientWidth/2, clientHeight/2, NULL);
 
            SelectObject(hDC, pen);
            SelectObject(hDC, brush);
 
            region1 = CreateRectRgnIndirect(&rectangle);
            region2 = CreateEllipticRgnIndirect(&circle);
            CombineRgn(region1, region1, region2, RGN_XOR);
            FillRgn(hDC, region1, brush);
 
            DeleteObject(region1);
            DeleteObject(region2);
            EndPaint(hWnd, &ps);
            break;
 
        case WM_DESTROY:
            DeleteObject(pen);
            DeleteObject(brush);
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
Изображения
 
Grrr
0 / 0 / 1
Регистрация: 26.05.2015
Сообщений: 2
26.05.2015, 21:40 3
Регион — это область экрана, представляющая собой комбинацию прямоугольников, полигонов и эллипсов.
Регионы можно использовать для заливки сложных фигур, а также для установки области отсечения, т. е. области вывода.
0
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 15
26.05.2015, 22:50  [ТС] 4
Огромное спасибо, пойду прикручу к классам с:

Добавлено через 1 час 7 минут
А возможна ли реализация подобного алгоритма без использования WinAPI, в консольном приложении?
Наглядное представление не так уж обязательно, главное принцип
0
26.05.2015, 22:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2015, 22:50

Основные методы для рисования графических примитивов в Windows Forms
Назвать основные методы для рисования графических примитивов (Windows Forms)

Библиотека C для рисования графических примитивов в буфер или файл
Коллеги, подскажите, пожалуйста ответ на мой вопрос! У меня такая задача - рисовать различные...

Использование графических примитивов для создания статических и динамических изображений
Здравствуйте! А кто-то уже делал нечто подобное в Делфи? Лично у меня фантазии вообще нету, дабы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru