Новичок
Джуниор
Регистрация: 03.11.2009
Сообщений: 1
|
Построение графика функции по данным из файла
Всем добрый день! Мой к вам вопрос: нужно брать данные для построения функции из файла, в котором содержится массив этих самых данных. Я написала программу, которая работает с файлом данных и в окне строит график функции. Но строит она его неправильно.
Код:
#include <windows.h>
#include <math.h>
#include "KWnd.h"
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DrawDiagram (HWND, HDC);
#define Pi 3.14159265
HANDLE Fp;
OFSTRUCT ofs;
char filename[80];
unsigned long numbytes_ok;
unsigned long size;
unsigned int u[40];//буфер
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ Fp=CreateFile("Данные1.bin", GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (Fp==INVALID_HANDLE_VALUE)
{ exit (1); return(1);}
MSG msg;
KWnd mainWnd("Врем. диагр. напряжения", hInstance, nCmdShow, WndProc);
while (GetMessage(&msg, NULL, 0, 0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
CloseHandle(Fp);}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ HDC hDC;
PAINTSTRUCT ps;
switch (uMsg)
{ case WM_PAINT://перерис.клиентскую область
hDC=BeginPaint(hWnd, &ps);
DrawDiagram(hWnd, hDC);
EndPaint(hWnd, &ps);//освоб. контекст устройства
break;
case WM_DESTROY://разруш. окна
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
} return 0;}
void DrawDiagram (HWND hwnd, HDC hdc)
{ 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; //n Pixels Per Millisec // масшт. коэффициент
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; //ms
const int tMax=40; //ms
const int uMin=-400; //V
const int uMax=400; //V
const int tGridStep=5;
const int uGridStep=100;
int x, y;
char* xMark[]={"0", "5", "10", "15", "20", "25", "30", "35", "40"};
char* yMark[]={"-400", "-300", "-200", "-100", "0", "100", "200", "300", "400"};
//Сетка
HPEN hPen0=CreatePen(PS_SOLID, 1, RGB(0, 160, 0));
HPEN hOldPen=(HPEN)SelectObject(hdc, hPen0);
int v=uMin;//построение сетки по напряжению
int xMin=tMin * nPixPerMs;
int xMax=tMax * nPixPerMs;
for (int i=0; i<9; ++i)
{ y = v * nPixPerVolt;
MoveToEx(hdc, xMin, y, NULL);
LineTo(hdc, xMax, y);
TextOut(hdc, xMin-40, y+8, yMark[i], strlen(yMark[i]));
v+=uGridStep; }
int t = tMin;//сетка по времени
int yMin = uMin * nPixPerVolt;
int yMax = uMax * nPixPerVolt;
for (i=0; i<9; ++i)
{ x = t * nPixPerMs;
MoveToEx (hdc, x, yMin, NULL);
LineTo(hdc, x, yMax);
TextOut(hdc, x-6, yMin-10, xMark[i], strlen(xMark[i]));
t+=tGridStep; }
//Ось "х"
HPEN hPen1=CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen1);
MoveToEx(hdc, 0, 0, NULL);
LineTo(hdc, xMax, 0);
static LOGFONT lf;
lf.lfPitchAndFamily=FIXED_PITCH | FF_MODERN;//шаг и семейство шрифта
lf.lfItalic=TRUE;//закрашиваем курсивный шрифт
lf.lfWeight=FW_BOLD;//жирность шрифта
lf.lfHeight=20;//высота шрифта в логич. ед.
lf.lfCharSet=DEFAULT_CHARSET;//код набора символа=1
lstrcpy ((LPSTR)&lf.lfFaceName, "Arial");
HFONT hFont0=CreateFontIndirect(&lf);
HFONT hOldFont=(HFONT) SelectObject(hdc, hFont0);
SetTextColor(hdc, RGB(0, 0, 200));
TextOut(hdc, xMax+10, 10, "t (ms)", 6);
//Ось "у"
MoveToEx(hdc, 0, yMin, NULL);
LineTo(hdc, 0, yMax);
TextOut(hdc, -10, yMax+30, "u (V)", 5);
//График
HPEN hPen2=CreatePen(PS_SOLID, 5, RGB(200, 0, 100));
SelectObject(hdc, hPen2);
int tStep=1;
double radianPerMs = 2 * Pi / 20;//масштабный коэффициент
const double uAmplit=311.17; //volt
t = tMin;
MoveToEx(hdc, 0, 0, NULL);
while (t<=tMax) //кусочно-линейная аппрокс. sin(x)
{ReadFile(Fp, &u, 1, &numbytes_ok, NULL);
v = uAmplit * sin(u[t] * radianPerMs);
LineTo(hdc, t * nPixPerMs, u[t] * nPixPerVolt);//соединяем предыд. и текущее знач.
t+=tStep; }
//Заголовок
char* title="Диагр. напряж. перем. тока";
lf.lfItalic=FALSE;
lf.lfWeight=FW_BOLD;
lf.lfHeight=35;
HFONT hFont1=CreateFontIndirect(&lf);
SelectObject(hdc, hFont1);
SetTextColor(hdc, RGB(0, 200, 0));
TextOut(hdc, 0, yMax+70, title, strlen(title));
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldFont);
}
Помогите, пожалуйста, разобраться!
Последний раз редактировалось Pr.AvivA; 04.11.2009 в 18:05.
|