Построить график функции с++ (WinAPi)

224
01 апреля 2019, 08:00

Стоит задача:построить график функции на координатной плоскости при помощи WInApi. С WinApi сталкиваюсь первый раз. Пробовал пока строить без осей координат,лишь бы график появился. Использовал SetPixel ,но не получилось.

Вот код,который пишу в разделе WM_PAINT

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
for (int i =300; i < 400; i++)
{
    int y;
    y= i * i*i - 10 * i*i - 3 * i + 59;
    SetPixel(hdc,i+50,y,RGB(0,100,255));
}
EndPaint(hWnd, &ps);

Выводит 4 точки,надеюсь заметите их.

Что я делаю не так?Может я в корне не правильно подхожу к построению на WinAPi ?

Answer 1

Тут явно отсутствует проверка на то, что получившиеся координаты x y остаются в пределах окна. Первое же значение y при i = 300 будет 26099159. Соответственно тут надо делать масштабирование чтоб они влезали в нужный диапазон.

Answer 2

Я начинающий, поэтому могу ошибаться. В y записывается нормализированное значение от 0 до 1. В данном случае используется отсчет от верхнего левого края окна и ось y направлена вниз. В функции SetPixel +200 отвечает за смещение начала графика вниз(при 0 график будет начинаться на верхней границе окна и в данном случае расти вверх, т.е. его не будет видно). Умножение на -1 делает график растущим вверх. 500 это коэффициент, который я подобрал эмпирическим путем.

        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        for(int i = 300; i <= 400; ++i)
        {
            double y = (double)(i * i * i - 10 * i * i - 3 * i + 59 - 26099159)/(62398859-26099159);
            SetPixel(hdc, i, (int)(y*(-1*500)+200), RGB(0,100,255));
        }
        EndPaint(hwnd, &ps);
Answer 3

1 Найти минимальные и максимальные значения аргумента (это просто края отрезка X0, X1) и функции на заданном отрезке

2 Рассчитать коэффициенты для преобразования значений в координаты, исходя из размеров прямоугольника вывода

  Y_Coeff = (Y_Max - Y_Min) /  (Func_Max - Func_Min)

3 Для графического режима по умолчанию MM_TEXT Y-ось направлена вниз, поэтому координаты для Y = F(X):

Y_Coord = YMax - (Y-  Func_Min)* Y_Coeff
X_Coord = XMin + (X - X0) * X_Coeff

4 Чтобы лучше было видно, рисовать с помощью LineTo

READ ALSO
Как изменить свойства файла С++

Как изменить свойства файла С++

Нужно удалять файлы, в том числе и файлы "Только чтение"Если в свойствах стоит галочка "Только чтение", то через remove() удалить не получается

169
Как поставить библиотеку С++ без или с Cmake

Как поставить библиотеку С++ без или с Cmake

Я нашел оболочку для curl и пытаюсь ее "собрать" Что я сделал:

160
Написать метод объединения строк

Написать метод объединения строк

Собственно само задание звучит так:

154