Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42

Создать графическое поле точек

03.04.2015, 12:35. Показов 1778. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Нужно создать поле точек типа a[i][j]=k, где i,j - значения по двум осям, k - определенные значения. Поле должно быть цветным, где каждому значению соответствует определенный цвет, как показано на рисунке.
Миниатюры
Создать графическое поле точек  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2015, 12:35
Ответы с готовыми решениями:

Друзья, подскажите, как в классе создать константное поле, ссылочное поле и объектное поле?
Препод на защите лабораторной по классам дал задание большое. В общем-то все пункты я знаю как делать, кроме этого. Вот что такое...

Создать класс с полями (поле 1, поле 2) и методами (конструктор, функция обработки полей)
Всем привет, нужно помощь, я самостоятельно изучаю программирование, наткнулся на лабораторную в интернете по теме "Классы", до...

Графическое поле таблицы база данных
Здравствуйте. В таблице(Database Desktop) имеется поле типа Graphic. Каким образом загрузить в него изображение? На форме таблица...

14
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.04.2015, 12:57
Массив не подходит, что ли?
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
03.04.2015, 13:07  [ТС]
В смысле массив не подходит? Я просто не знаю, какой компонент использовать для задания такого поля, и как на него вывести этот массив, да еще так, чтобы он был цветной
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.04.2015, 13:11
А ты какими средствами интерфейс программируешь? Библиотеки, чистый WinAPI?
0
21 / 21 / 12
Регистрация: 08.01.2015
Сообщений: 66
03.04.2015, 13:16
Берёте где-нибудь в интернете пример готового winapi приложения, типа просто пустое окно. В цикле обработке сообщений ловите WM_PAINT - там запускаете цикл с SetPixel(контекст окна, Х, У, цвет) который будет рисовать поле.
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
03.04.2015, 13:17  [ТС]
Стандартными компонентами из Tool Palette
0
21 / 21 / 12
Регистрация: 08.01.2015
Сообщений: 66
03.04.2015, 13:21
MFC или .NET? Или, прости господи, C++ Builder?
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
03.04.2015, 13:26  [ТС]
Именно C++ Builder
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
03.04.2015, 13:26
Цитата Сообщение от Robar Посмотреть сообщение
цикл с SetPixel(контекст окна, Х, У, цвет)
и ждешь до пенсии пока нарисует
SetPixel очень медленная функция
лучше создать контекст в памяти и использовать ButBlt
0
21 / 21 / 12
Регистрация: 08.01.2015
Сообщений: 66
03.04.2015, 13:34
Не помню быдлер(вам в соотв. раздел), вроде в Делфи было типа такого -
На форме смотрите событие onPaint или типа того, в аргументах события должен прилетать Canvas - на нем и рисуете.

Добавлено через 6 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
и ждешь до пенсии пока нарисует
SetPixel очень медленная функция
лучше создать контекст в памяти и использовать ButB
Ну не до пенсии, но в принципе согласен. Просто в данном случае не хотелось усложнять.
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
03.04.2015, 14:24  [ТС]
а с помощью Fire Monkey такое не делается?

Добавлено через 44 минуты
Вообще по-моему не все поняли задачу, или я плохо ее объяснил.
Попробую еще раз:
Есть массив, например:
a[0][0]=70 a[1][0]=60
a[0][1]=80 a[1][1]=50
a[0][2]=120 a[1][2]=40
a[0][4]=150 a[1][3]=35
Нужно на поле создать своего рода цветное поле, как на рисунке выше, где
каждому значению будет соответствовать свой цвет, например максимальному 150 будет соответствовать красный, минимальному 35 синий. Все остальное, что в промежутках - промежуточные цвета (есть специальная технология, вроде HSB, или как-то так, не мне вам объяснять). Между точками линейной интерполяцией нужно строить промежуточные значения, с соответствующими цветами.
Вопросы следующие:
1. Какой компонент служит для рисования такой графифи? В моем понимании это что-то типа TImage
2. Какими функциями выводить значения. Видимо что-то типа SetPixel
3.Как присвоить значениям, а главное промежуточным значениям соответсвтующие цвета, которыми нужно окрашивать пиксели поля
4. Может быть для этого всего есть более продвинутые приемы, чем рисование пикселей.
Программа написана в C++ Builder, тема здесь соответствующая.
5. Может быть можно для этого использовать Fire Monkey? Как?

Прошу учесть, что я новичок, и, если вам не трудно, то объяснять более подробно.
0
21 / 21 / 12
Регистрация: 08.01.2015
Сообщений: 66
03.04.2015, 14:30
rekord522,
Посмотрите тут - Краткое руководство по работе с классом TCanvas для начинающих
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,647
Записей в блоге: 6
03.04.2015, 16:17
Как вариант использовать затенение вершин полигонов в OpenGL. Сам когда-то так создавал температурные поля. Тем более это самый быстрый в плане отрисовки графики способ.
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
06.04.2015, 09:21  [ТС]
Ilot, а можно какой-нибудь пример, чтобы понятно было, с чего начать?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,647
Записей в блоге: 6
06.04.2015, 09:48
rekord522, возьмите за основу дефолтный проект из CodeBlocks:
Кликните здесь для просмотра всего текста
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <windows.h>
#include <gl/gl.h>
 
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
void DisableOpenGL(HWND, HDC, HGLRC);
 
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    WNDCLASSEX wcex;
    HWND hwnd;
    HDC hDC;
    HGLRC hRC;
    MSG msg;
    BOOL bQuit = FALSE;
 
    /* register window class */
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_OWNDC;
    wcex.lpfnWndProc = WindowProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "GLSample";
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);;
 
 
    if (!RegisterClassEx(&wcex))
        return 0;
 
    /* create main window */
    hwnd = CreateWindowEx(0,
                          "GLSample",
                          "OpenGL Sample",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          256,
                          256,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
 
    ShowWindow(hwnd, nCmdShow);
 
    /* enable OpenGL for the window */
    EnableOpenGL(hwnd, &hDC, &hRC);
 
    /* program main loop */
    while (!bQuit)
    {
        /* check for messages */
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            /* handle or dispatch messages */
            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else
        {
            /* OpenGL animation code goes here */
 
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            glPushMatrix();
            glBegin(GL_TRIANGLES);
 
                glColor3f(1.0f, 0.0f, 0.0f);   glVertex2f(0.0f,   1.0f);
                glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);
                glColor3f(0.0f, 0.0f, 1.0f);   glVertex2f(-0.87f, -0.5f);
 
            glEnd();
            glPopMatrix();
            SwapBuffers(hDC);
            Sleep (1);
        }
    }
 
    /* shutdown OpenGL */
    DisableOpenGL(hwnd, hDC, hRC);
 
    /* destroy the window explicitly */
    DestroyWindow(hwnd);
 
    return msg.wParam;
}
 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
        break;
 
        case WM_DESTROY:
            return 0;
 
        case WM_KEYDOWN:
        {
            switch (wParam)
            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                break;
            }
        }
        break;
 
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
 
    return 0;
}
 
void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC)
{
    PIXELFORMATDESCRIPTOR pfd;
 
    int iFormat;
 
    /* get the device context (DC) */
    *hDC = GetDC(hwnd);
 
    /* set the pixel format for the DC */
    ZeroMemory(&pfd, sizeof(pfd));
 
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                  PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
 
    iFormat = ChoosePixelFormat(*hDC, &pfd);
 
    SetPixelFormat(*hDC, iFormat, &pfd);
 
    /* create and enable the render context (RC) */
    *hRC = wglCreateContext(*hDC);
 
    wglMakeCurrent(*hDC, *hRC);
}
 
void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hwnd, hDC);
}


Единственное, что вам остается это построить сетку и в каждой вершине найти значение температуры. Далее написать функцию переводящую диапазон значений температуры в диапазон цветов и в итоге подставить их в функцию glColor3f. Для справки функция glVertex2f(float x, float y) рисует точку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2015, 09:48
Помогаю со студенческими работами здесь

Создать графическое приложение
Подскажите как это сделать и как вообще эта штука работает? P.S гуглил, много гуглил - ничего не понял.

Создать графическое изображение
Желательно, как можно проще написать код.

Создать графическое изображение в паскале

Заданы n точек. Создать матрицу, элементами которой являются расстояния между каждой парой точек
Добрый день. Очень срочная нужен код программы на C#, но проблема в том что я его только осваиваю и уровня не хватает а времени нет, и...

На плоскости заданы своими координатами n точек. Создать массив размером n(n-1), элементами которого является расстояние от каждой из точек до n-1 др.
Помогите пожалуйста решить! Пожалуйста! На плоскости заданы своими координатами n точек. Создать массив размером n(n-1), элементами...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru