Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 75
1

Рисование анимированного графика Синусоиды

09.01.2011, 23:49. Показов 3134. Ответов 4
Метки нет (Все метки)

В общем делала курсовую и нашла на одном форуме программку, она рисует анимированный график. Мне в курсовике как раз нужна похожая штука, но вот в чем проблема, програмка сделана в Вижале c++ 6.0, а на моем 2010 года не пашет. часть ошибок я убрала, остались несколько и я не знаю что с ними делать((
программа:

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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
// Синусоида.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
 
 
#include <windows.h>
#include <math.h>
#include < stdio.h >
#include < stdlib.h >
 
 
 
 
#define Pi 3.14159265
 
void DrawDiagram(HWND hwnd, HDC hdc, int offset){
 
RECT rect;
GetClientRect(hwnd, &rect);
const int xVE = rect.right - rect.left;
const int yVE = rect.bottom - rect.top;
const int xWE = xVE;
const int yWE = yVE;
double nPixPerVolt = yVE / 1000.0;
double nPixPerMs = xVE / 60.0;
 
SetMapMode(hdc, MM_ISOTROPIC);
SetWindowExtEx(hdc, xWE, yWE, NULL);
SetViewportExtEx(hdc, xVE, -yVE, NULL);
SetViewportOrgEx(hdc, 10*nPixPerMs, yVE/2, NULL);
 
const int tMin = 0;
const int tMax = 40;
const int uMin = -400;
const int uMax = 400;
const int tGridStep = 5;
const int uGridStep = 100;
int x, y;
int u = uMin;
int xMin = tMin * nPixPerMs;
int xMax = tMax * nPixPerMs;
 
const char* xMark[] = {"0", "5","10", "15","20","25","30","35","40"};
const char* yMark[] = {"-40", "-30","-20","-10","0","10", "20","30","40"};
 
 
HPEN hPen0 = CreatePen(PS_SOLID, 1, RGB(0, 160, 0));
HPEN hOldPen = (HPEN)SelectObject(hdc, hPen0);
 
for(int i = 0; i < 9; ++i) {
    y = u * nPixPerVolt;
    MoveToEx(hdc, xMin, y, NULL); //перемещаемся в заданную точку
    LineTo(hdc, xMax, y); //рисуем туда линию
    TextOut(hdc, xMin-40, y+8,_T(yMark[i]), strlen(_T(yMark[i]))); //выводим текст
    u += uGridStep;
}
 
 
 
int t = tMin;
int yMin = uMin * nPixPerVolt;
int yMax = uMax * nPixPerVolt;
 
 
 
for(int a = 0; a < 9; ++a) {
    x = t * nPixPerMs;
    MoveToEx(hdc, x, yMin, NULL); //перемещаемся в заданную точку
    LineTo(hdc, x, yMax); //рисуем туда линию
    TextOut(hdc, x, yMin-10,_T(xMark[a]), strlen(_T(xMark[a]))); //выводим текст
    t += tGridStep;
}
 
 
 
 
HPEN hPen1 = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); //создаем кисть
SelectObject(hdc, hPen1);
 
 
 
 
MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, xMax, 0);
MoveToEx(hdc, 0, yMin, NULL); LineTo(hdc, 0, yMax);
 
 
 
HPEN hPen2 = CreatePen(PS_SOLID, 5, RGB(200, 0, 100));
SelectObject(hdc, hPen2);
 
 
 
 
int tStep = 1; //задаем шаг графика
double radianPerx = 2 * Pi / 30;  
const double uAmplit = 250; //задаем амплитуду
t = tMin;
MoveToEx(hdc, 0, ((uAmplit * sin(t * radianPerx - offset)) * nPixPerVolt), NULL); //вычисляем начальную точку
while(t <= tMax) {  //до достижения максимального значения х
    u = uAmplit * sin(t * radianPerx - offset); //вычисляем синус и точку, куда рисовать линию
    LineTo(hdc, t * nPixPerMs, u * nPixPerVolt); //рисуем линию
    t += tStep;
}
SelectObject(hdc, hOldPen);
}
 
 
 
 
 
LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        PAINTSTRUCT ps;  //структура для рисования
    HDC hdc;  //дескриптор устройства (монитор)
    RECT rect;  //область, где рисовать
    static int offset = 0;  //смещение для синусоиды
    SetTimer(hWnd, 1, 200, NULL);  //устанавливаем таймер обновления рисунка
    switch (message)  //обрабатываем сообщения ос
    {
        case WM_TIMER:   // если сообщение - сработал таймер, то...
            GetClientRect(hWnd, &rect);  //получаем рабочую область
            InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной
            UpdateWindow(hWnd); //перерисовываем окно
            ++offset; //меняем значение смещения синусоиды
            break;
        case WM_PAINT:   // если сообщение - перерисовать окно, то...
            hdc = BeginPaint(hWnd, &ps); //получаем дескриптор устройства
            DrawDiagram(hWnd, hdc, offset); //рисуем синусоиду
            EndPaint(hWnd, &ps); //заканчиваем рисование
            break;
        case WM_DESTROY: // если сообщение - уничтожить окно, то...
            PostQuitMessage(0); //посылаем "прощальное" сообщение операционке
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam); //обработка всех других сообщений
   }
   return 0;
}
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
 
 
TCHAR szTitle[] =_T("Осциллограф");
TCHAR szWindowClass[] =_T("oscill");
 
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 
 
HWND hWnd;
MSG msg;
WNDCLASSEX wcex;
 
 
 
 
 
wcex.cbSize = sizeof(WNDCLASSEX);  //размер структуры 
wcex.style = CS_HREDRAW | CS_VREDRAW; //задаем стиль окна, подробнее смотрите в MSDN
wcex.lpfnWndProc = (WNDPROC)WindowProcedure;  //указываем оконную процедуру
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;  //указываем дескриптор приложениея
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);  //устанавливаем иконку приложения по умолчанию
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //устанавливаем курсор по умолчанию
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //задаем цвет окна
wcex.lpszMenuName = 0;     //меню окна - нет меню
wcex.lpszClassName = szWindowClass;  //указываем класс окна
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);  //загружаем иконку окна
 
 
if(!RegisterClassEx(&wcex))
{
    MessageBox(hWnd,_T( "Ошибка регистрации класса окна"),_T( "Ошибка"), IDI_ERROR || MB_OK);
    return 1;
}
 
 
 
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
if(!hWnd)
{
    MessageBox(hWnd,_T("Ошибка создания окна"),_T( "Ошибка"), IDI_ERROR || MB_OK); //в случае чего - говорим об ошибке
    return 1;
}
 
 
 
ShowWindow(hWnd, nCmdShow);
 
 
 
while(GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
 
 
return msg.wParam;
}

ошибки выдает такие
LxMark: необъявленный идентификатор
LyMark: необъявленный идентификатор


как их объявить я не знаю, уже по разному крутила (
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2011, 23:49
Ответы с готовыми решениями:

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

Рисование графика заданной функции на заданном интервале
Вот есть программа для рисования графика косинуса от 0 до 2 пи #include &lt;windows.h&gt; #include...

Рисование графика функции при выборе в меню
мне нужно что бы по нажатию на соответствующую клавишу меню, рисовался мат график. как нарисовать...

Рисование графика синусоиды в диалоговом окне
Как нарисовать во времени график синусоиды на элементе диалогового окна Picture? Программу...

4
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.01.2011, 00:26 2
код прекрасно компилируется в 10-й студии
0
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 75
10.01.2011, 00:31  [ТС] 3
Maxwe11, у вас не выдает ошибок и рисует график??
тогда я не знаю в чем тут ошибка, у меня выдает все вышеперечисленное(
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.01.2011, 01:56 4
попробуйте вот проект который у скомпилировался4.rar
1
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 75
10.01.2011, 02:03  [ТС] 5
Maxwe11, да, работает))спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2011, 02:03

Графика: график синусоиды
ВОТ ПРОГРАММА: uses GraphABC; var y0,t0,y1,t1,k,i: integer; y,t: real; begin...

Создание графика синусоиды
Как в delphi написать программу, чтобы она рисовала график синусоиды, причем я сам задаю самую...

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

Рисование графика: обработка новых входящих данных и движение графика на форме
Подскажите каким способом можно вывести график частью главного окна программы, при чем график...


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

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

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