Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
f1ff
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
1

Как нарисовать плавный график?

22.04.2015, 19:56. Просмотров 711. Ответов 5
Метки нет (Все метки)

Соседние точки графика соединяю вертикальными линиями. Из-за этого он плохо выглядит.
Что нужно изменить, для того чтобы график был плавным?

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
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC             hDC;
    PAINTSTRUCT     ps;
 
    static Point    center;
    static int      cxClient,  cyClient;
 
    
    switch (iMsg)
    {
        case WM_SIZE:
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
 
            center.x = cxClient/2;
            center.y = cyClient/2;
 
            return 0;
 
 
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
 
            // Ось X
            MoveTo(hDC, 0, cyClient/2);
            LineTo(hDC, cxClient, cyClient/2);
 
            // Ось Y
            MoveTo(hDC, cxClient/2, 0);
            LineTo(hDC, cxClient/2, cyClient);
            
            // y = x^2
            // Правая ветвь
            MoveTo(hDC, center.x, center.y);
            for (int x=center.x;  x<cxClient;  ++x)
            {
                LineTo(hDC, x, center.y - (x-center.x)*(x-center.x) );
            }
 
            // Левая ветвь
            MoveTo(hDC, center.x, center.y);
            for (int x=center.x;  x>=0;  --x)
            {
                LineTo(hDC, x, center.y - (center.x-x)*(center.x-x) );
            }
 
 
            EndPaint(hWnd, &ps);
            return 0;
 
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
 
 
    return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
0
Миниатюры
Как нарисовать плавный график?   Как нарисовать плавный график?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2015, 19:56
Ответы с готовыми решениями:

Нарисовать график прямой у=х
прошу о помощи. Я в программировании нуль . Мне нужно написать прогу на win 32...

Нарисовать график функции y=tg(x) WinAPI
Я не могу понять как нарисовать график функции y=tg(x) с помощью WINAPI.У меня...

Плавный гуишный процесс (без загруза CPU)
Нужно реализовать плавный гуишный процесс. Например, процесс игры, где что-то...

Как нарисовать линию
Добрый вечер. #define ID_CH1 1 #define ID_CH2 2 #define ID_CH3 3 #define...

Как нарисовать окружность?
Как нарисовать окружность?

5
zss
Модератор
Эксперт С++
7461 / 6837 / 4317
Регистрация: 18.12.2011
Сообщений: 18,087
Завершенные тесты: 1
22.04.2015, 19:59 2
Для проведения прямых используется метод Брезенхема.
Я думаю, он уже реализован в функции LineTo.
Поэтому, вряд ли Вы сможете получить лучший результат.
1
IrineK
Заблокирован
22.04.2015, 20:26 3
В данной ситуации будет выглядеть несколько лучше, если задать меньший масштаб по Х ("расширить" по Х).
1
f1ff
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
22.04.2015, 20:29  [ТС] 4
zss, может другим способом нарисовать?
Тут нашел одну программу для вывода синусоиды. Даже при увеличении график получается плавным.
Но я не могу понять алгоритм работы Не знаю как к своей программе это применить.

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
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{ 
    static int      cxClient, cyClient;
    HDC             hdc;
    int             i;
    PAINTSTRUCT     ps;
    POINT           pt[NUM]; // #define NUM 1000
    
    switch(iMsg)
    {
        case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        return 0;
 
        
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        MoveToEx(hdc, 0, cyClient / 2, NULL);
        LineTo (hdc, cxClient, cyClient / 2);
    
        for(i = 0; i < NUM; i++)
        {
            pt[i].x = i * cxClient / NUM;
            pt[i].y =(int)(cyClient / 2 * (1 - sin(TWOPI * i / NUM)));
        }
    
        Polyline(hdc, pt, NUM);
        return 0;
    
    
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
0
Миниатюры
Как нарисовать плавный график?   Как нарисовать плавный график?  
f1ff
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
22.04.2015, 20:41  [ТС] 5
IrineK, как задать меньший масштаб по X?
0
IrineK
Заблокирован
22.04.2015, 20:52 6
Нужен масштабирующий множитель, который используют при выводе, домножая на него актуальное значение координаты.
1
22.04.2015, 20:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2015, 20:52

Как нарисовать человечика?
Добрый день. Подскажите, как нарисовать улыбающегося человечика с волосиками...

Как нарисовать текст по координатам?
Есть dc 600 на 400 нужно наисовать текст по координатам например 350 на 140,...

Как нарисовать текст без фона?
Мне нужно нарисовать в dc текст, но без фона например функция DrawTextW...


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

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

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