Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631

Построение графика функции c*cos(x)

06.11.2022, 12:02. Показов 1045. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Думал, что понял, но, как оказалось нет, связано это непонимание с функциями изменения режима отображения. Если я хочу изменить режим отображения на MM_ISOTROPIC например,

Я пишу следующее:
C++
1
2
3
4
SetMapMode(hdc, MM_ISOTROPIC);
        SetWindowExtEx(hdc, cxClient, -cyClient, NULL);
        SetViewportExtEx(hdc, radius, radius, NULL);
        SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL);
Устанавливаю координаты (0, 0) на середину окна cxOrig, cyOrig, хочу нарисовать группу эллипсов radius - радиус, cxClient, cyClient - рабочая область окна.
1)Если вместо SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL); вызвать функцию SetWindowOrgEx(hdc, cxOrig, cyOrig, NULL); то в окне вообще ничего не рисуется, почему?

2)Если я хочу рисовать в цикле, скажем, 10 кругов, то установив режим отображения как указано выше у меня рисуется один круг, почем так
вот код:

Кликните здесь для просмотра всего текста
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
case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
 
        int cxOrig = (cxClient >> 1);
        int cyOrig = (cyClient >> 1);
 
        SetMapMode(hdc, MM_ISOTROPIC);
        SetWindowExtEx(hdc, cxClient, -cyClient, NULL);
        SetViewportExtEx(hdc, radius, radius, NULL);
        SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL);
 
        int scaling = radius;
        for (int i = 0; i < 10; ++i)
        {
            /*hBrush = CreateSolidBrush(RGB((BYTE)rand() % 255,
                                          (BYTE)rand() % 255, 
                                          (BYTE)rand() % 255));*/
 
            //hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
 
            hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
            hOldPen = (HPEN)SelectObject(hdc, hPen);
                
            Ellipse(hdc, -radius, -radius,
                          radius, radius);
            //приращение радиуса, рассчитывал, что таким образом
            //удастся получить координаты для следующего круга.
            radius += scaling;
 
            SelectObject(hdc, hOldPen);
            DeleteObject(hPen);
            //SelectObject(hdc, hOldBrush);
            //DeleteObject(hBrush);
            hPen = hOldPen = NULL;
            hBrush = hOldBrush = NULL;
        }
        EndPaint(hwnd, &ps);


Не ясно почему выводится только один круг.

Если я вызываю функцию SetWindowExtEx(hdc, cxClient, -cyClient, NULL);, то таким образом я задаю некий прямоугольник/квадрат, с которым, в дальнейшем будет вестись работа или нет?

А если, соответственно, вызвать функцию SetViewportExtEx(hdc, radius, radius, NULL);, то это значит, что я задаю некий масштаб отображения, единицы вроде тех, что используются в MM_LOENGLISH... или нет?

----------------------------
Читаю книжку по работе с API и пытаюсь понять смысл функций SetViewport/SetWindowOrgEx.
SetViewportOrgEx смещает начало физической системы координат (ФКС),
SetWindowOrgEx смещает начало логической системы координат (ЛКС). А теперь небольшой код:

C++
1
2
3
4
SetMapMode(hdc, MM_LOENGLISH);
SetViewportOrgEx(hdc, 0, 100,NULL);
Rectangle(hdc, 0,0,500, 300);
Ellipse(hdc, 0,0,500, 300);
Первая путаница, которая возникает у меня – это направление осей этих систем координат. Раз функция SetViewportOrgEx работает с ФКС, значит единицы измерения этой системы координат – пиксели и направление осей слева-направо, СВЕРХУ-вниз. То есть положительное смещение начала координат на 100 пикселей фактически сместит область вывода на 100 пикселей вниз – соответственно будет видна (на величину этого смещения) часть нарисованного круга и эллипса. По аналогии с объяснением выше исследуем вот такой код:

C++
1
2
3
4
SetMapMode(hdc, MM_LOENGLISH);
SetWindowOrgEx(hdc, 0, 100,NULL);
Rectangle(hdc, 0,0,500, 300);
Ellipse(hdc, 0,0,500, 300);
Функция SetWindowOrgEx работает с ЛКС, значит единицы измерения этой системы координат задаются режимом наложения. В нашем случае это MM_LOENGLISH, поэтому единицы измерения – 0,1 мм и направление осей слева-направо, СНИЗУ-вверх. То есть положительное смещение начала координат на 100 единиц поднимет окно на 1 см вверх – соответственно мы должны будет увидеть ту часть области, которая раньше закрывалась верхней границей окна, и опять же увидим часть нарисованного круга и эллипса. Однако моя логика здесь не срабатывает, и я не могу понять почему - вроде все правильно
-------------------------------------------------------------

Хотелось бы разобраться в этой теме.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2022, 12:02
Ответы с готовыми решениями:

Построение графика функции
У меня есть код для построения графика функции cos(x), помогите пожалуйста изменить его под функцию U(x;t)=1/2 при Pi&lt;=x&lt;=2Pi....

Построение графика функции
Доброй Ночи! Нужно построить график функции на основе winAPI. Но проблема в том, что при задании функции график строится неправильно. ...

Построение графика в оконной функции XY-График
Оконная функция всплывающего окна Открываем фаил с данными &quot;Координатами&quot; - Их он выводит на экран в главное окно. По нажатию...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2022, 12:02
Помогаю со студенческими работами здесь

Построение графика функции cos x^2
надо написать программу построения графика функции cos x^2 на вижуал 10-12 С++

Qcustomplot построение графика y = cos(x)
При построении косинусоида график некорректно отображается, в чем проблема? double a =-10; //Начало интервала, где рисуем график...

Вычисление функции на заданном промежутке, и построение графика этой функции
Написать блок-схему и программу вычисления функции на за- данном промежутке с шагом 0.2 и построить график этой функции. Если x&gt;1 ...

Построение графика функции
Помогите, пожалуйста, определить условия для построения графика с помощью графического модуля

Построение графика функции
Помогите, пожалуйста, построить оси координат и график функции f(x) на заданном диапазоне


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru