Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2022, 03:42   #1
Darklight
Пользователь
 
Регистрация: 08.07.2022
Сообщений: 29
По умолчанию График функций

Возникла проблема с выводом функции
DWORD WINAPI Draw(HDC hdc) {
...
} /вот в этом промежутке

Код:
#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <clocale>
#include <iostream>
#include <iomanip>
#include <cmath>
WCHAR szTitle[] = L"Conhoid";
WCHAR szWindowClass[] = L"ConhoidWndClass";

//координаты окна
const int WND_X = 500;
const int WND_Y = 50;
const int WND_W = 400;
const int WND_H = 400;

ATOM MyRegisterClass(HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI Draw(HDC hdc);

DWORD WINAPI Run(LPVOID lpThreadParameter)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    HWND hCon = GetConsoleWindow();
    RECT rc;
    MSG msg;

    MyRegisterClass(hInstance); //инициализация класса окна 
    GetWindowRect(hCon, &rc); //получаем положение окна консоли     

    //создаем окно
    HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_BORDER, rc.left + WND_X, rc.top + WND_Y, WND_W, WND_H, hCon,
        nullptr, hInstance, nullptr);

    SetWindowLong(hWnd, GWL_STYLE, 0); //убираем строку заголовка

    if (hWnd == nullptr)
    {
        printf("Error CreateWindow\n");
        return 0;
    }

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    //запуск цикла обработки сообщений
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);

    return RegisterClassExW(&wcex);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    switch (message)
    {
    case WM_PAINT:

        PAINTSTRUCT ps;
        hdc = BeginPaint(hWnd, &ps);
        Draw(hdc);
        EndPaint(hWnd, &ps);

        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

double myfun(double x, double eps)
{
    int i = 1;
    double s = 0;
    double an;
    do
    {
        an = cos(i * x) / i;
        s += an;
        i++;
    } while (fabs(an) > eps);
    return s;
}


DWORD WINAPI Draw(HDC hdc) {

    double eps = 1e-6;
    double xmin = M_PI / 5.;
    double xmax = 9. * xmin + eps;
    double y, x;
    int n = 16;
    double h = (xmax - xmin) / (n - 1.);
    float x0, y0;
    double f = -3;

    x = myfun(x, eps);
    y = -log(fabs(2. * sin(x / 2.)));
    x0 = x;
    y0 = y;
    SelectObject(hdc, GetStockObject(WHITE_PEN));
    MoveToEx(hdc, 300 + x, 50 + y, nullptr);

    while (f <= 3) {
    x = myfun(x, eps);
    y = -log(fabs(2. * sin(x / 2.)));

        if (abs(y - y0) < 1000) {
            LineTo(hdc, 300 + x, 50 + y);
        }
        else {
            MoveToEx(hdc, 300 + x, 50 + y, nullptr);
        }

        f += h;
        x0 = x; y0 = y;
    }

    return 0;
}

int main()
{
    setlocale(LC_ALL, "RUSSIAN");
    DWORD dwStream = 1;
    HANDLE hStream, drawStream;

    drawStream = CreateThread(NULL, 0, Run, &dwStream, 0, &dwStream);
    double eps = 1e-6;
    double xmin = M_PI / 5.;
    double xmax = 9. * xmin + eps;
    int n = 16;
    double h = (xmax - xmin) / (n - 1.);
    std::cout << std::string(57, '=') << std::endl;
    std::cout << "|  x  ||            s           ||          y           |" << std::endl;
    std::cout << std::string(57, '=') << std::endl;
    for (double x = xmin; x <= xmax; x += h)
    {
        double s = myfun(x, eps);
        double y = -log(fabs(2. * sin(x / 2.)));
        std::cout << std::fixed << std::setprecision(3) << "|" << x
            << "||\t" << std::setprecision(6) << s
            << "\t||\t" << y << "\t|" << std::endl;
    }
    std::cout << std::string(57, '=') << std::endl;
    std::cin.get();
    _getch();
    return 0;
}
Darklight вне форума Ответить с цитированием
Старый 24.07.2022, 10:13   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

  1. Чему равен an при входе в цикл do в myfunc?
  2. Чему равен x при первом вызове myfunc из Draw?
  3. Для отображения графика стоит поступить так:
    • Определить область вывода графика: например, rect(300, 0, 300 + 300 = 600, 0 + 100 = 100); zero = (100 - 0) / 2 = 50; left = 600 - 300 = 300
    • Рассчитать dx при переходе от одного пикселя к другому: dx = (xmax - xmin) / (600 - 300)
    • Рассчитать dy при переходе от одного пикселя к другому: dy = (100 - 0) / (ymax - ymin)
    • Вычислять значения пикселей в точках, которые совпадают с дискретными значениями пикселей: x = x + 1; y = zero + dy * func(xmin + (x - left) * dx)

P.S. Я не читал всю программу. Только функции myfunc и Draw. Возможно, что есть еще ошибки подобные тем, что я перечислил в п. 1 и 2
P.P.S Функцию Draw не обязательно объявлять как WINAPI. Она не является callback функцией. Это обычная подфункция в вашей программе, а значит тип вызова этой функции может отличаться от того, который использует callback функция WndProc.

Последний раз редактировалось macomics; 24.07.2022 в 10:46.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
График Функций noisor Паскаль, Turbo Pascal, PascalABC.NET 1 02.11.2014 16:28
График функций. Avvakymova Паскаль, Turbo Pascal, PascalABC.NET 0 10.05.2011 19:23
построить график функций antowaxxx Microsoft Office Excel 2 21.10.2010 13:55
Построить график функций? zoza1 Общие вопросы Delphi 4 01.07.2009 15:28
График функций Estrella Помощь студентам 3 23.10.2007 13:24