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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2013, 21:46   #1
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию График функции разложенной в ряд.

Мне нужно на окне вывести два графика. cos(x+a) и
y_0=pow(x, k)*cos(sdvig+pi*k/2)/factorial(k)(его разложение в ряд).
cos(x+a) выводится без проблем. а вот разложение не хочет и я не знаю как то исправить. я пока винил во всем ряд ибо функция pow(x, k) возрастает быстрее факториала при больших икс. и хотел спросить как сделать масштаб координат чтобы иксы были ну до 10 хотя бы(если меня поняли:D).заранее благодарен)

Код:
//resource.h
#define IDD_PIFAGORUS 101
#define IDC_VALUE1 1000
#define IDC_VALUE2 1001
#define ID_EXIT 1002
#define ID_COUNT 1003
#define ID_CLEAR 1004
#define IDC_STATIC -1

#define IDM_ENTER 1005
#define IDM_EXIT 1006


#include <windows.h>
#include <stdio.h>
#include <math.h>

#include "resource.h"

#define pi 3.14

int factorial(int n) 
{
      return !n ? 1 : n * factorial(n - 1);
}


BOOL Line(HDC hdc, int x1, int y1, int x2, int y2)
{
MoveToEx(hdc, x1, y1, NULL); 
return LineTo(hdc, x2, y2); 
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK PifProc(HWND, UINT, WPARAM, LPARAM);

char szProgName[]="Имя программы";
char szMenu[]="GRAPHMENU";
char szMessage[]="Выберите нужный пункт меню";

double x0,xk,shag,result,sdvig,toch,y,y_0,y_1,Dx,i,j,N; 
int  k,xView,yView;
bool kk=false;
char str[80]="Строка текста";
char Buf[2];
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG lpMsg;


WNDCLASS w; //создаём экземпляр структуры WNDCLASS
 //И начинаем её заполнять
w.lpszClassName=szProgName; 
w.hInstance=hInstance;
w.lpfnWndProc=WndProc;
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(NULL, IDI_APPLICATION);
w.lpszMenuName=szMenu;
w.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(255,255,255));
w.style=NULL; 
w.cbClsExtra=0;
w.cbWndExtra=0;


if(!RegisterClass(&w))
return 0;


hWnd=CreateWindow(szProgName, 
"Ряды",
WS_OVERLAPPEDWINDOW,
100,
100,
1000,
700,
(HWND)NULL, 
(HMENU)NULL,
hInstance,
(LPSTR)NULL);


ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

while(GetMessage(&lpMsg, NULL, 0, 0)) {
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return(lpMsg.wParam);
}


BOOL CALLBACK PifProc(HWND hdlg, UINT messg, WPARAM wParam, LPARAM lParam)
{
switch (messg)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
switch(LOWORD(wParam)) {

case ID_COUNT: 
GetDlgItemText(hdlg, IDC_X0, str, 40);
x0=atof(str)*100;
GetDlgItemText(hdlg, IDC_XK, str, 40);
xk=atof(str)*100;
GetDlgItemText(hdlg, IDC_SDVIG, str, 40);
sdvig=atof(str);
GetDlgItemText(hdlg, IDC_TOCHNOST, str, 40);
toch=atof(str);
Dx=(xk-x0)/400;
kk=true;
EndDialog(hdlg, LOWORD(wParam));
return TRUE;
break;

case ID_CLEAR:
SetDlgItemText(hdlg, IDC_X0, "");
SetDlgItemText(hdlg, IDC_XK, "");
SetDlgItemText(hdlg, IDC_SHAG, "");
SetDlgItemText(hdlg, IDC_SDVIG, "");
break;


case IDM_EXIT:
EndDialog(hdlg, LOWORD(wParam));
return TRUE;

break;

}


break;

case WM_QUIT:
DestroyWindow(hdlg);
break;


default: return false;
}

}




LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; 
static HINSTANCE hInst;
HPEN hPen, hPen1;
PAINTSTRUCT ps;

//Цикл обработки сообщений
switch(messg)
{
case WM_COMMAND:
switch(LOWORD(wParam)){

case IDM_ENTER:		
DialogBox(hInst, (LPCTSTR)IDD_DIALOG1, hWnd, PifProc);
InvalidateRect(hWnd, NULL, FALSE);
break;

//Выход из программы 
case IDM_EXIT: 
DestroyWindow(hWnd);
break;

}
break;

case WM_SIZE:
xView=LOWORD(lParam);
yView=HIWORD(lParam);

break;

case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
SetMapMode(hdc, MM_ISOTROPIC); //логические единицы отображаем, как физические
SetWindowExtEx(hdc, 500,500, NULL); //Длина осей
SetViewportExtEx(hdc, xView, -yView, NULL); //Определяем облась вывода
SetViewportOrgEx(hdc, xView/2, yView/2, NULL); //Начало координат

Line(hdc,0, 200,0,-200);//ось У
Line(hdc, -200,0,200,0);//ось Х

//Делаем перо снова чёрным
hPen=CreatePen(1,1,RGB(0,0,0));
SelectObject(hdc, hPen);

//Наносим деления
for(i=-200; i<200; i+=100)
{
Line(hdc, i, 3,i,-3);
Line(hdc, -3, i,3,i);
itoa(i/100, Buf, 10);
TextOut(hdc, i-5, -5, Buf , strlen(Buf));
TextOut(hdc, -5, i, Buf , strlen(Buf)); 
}

for(i=x0; i<xk; i+=Dx)
	{
	y=100.0*cos(i/10+sdvig);
	hPen=CreatePen(1,2,RGB(255,25,0));
	SelectObject(hdc, hPen);
	MoveToEx(hdc, i, y,NULL);
	LineTo(hdc, i, y);
	}

	for(j=x0; j<xk; j+=Dx){
	hPen1=CreatePen(1,2,RGB(120,0,200));
	SelectObject(hdc, hPen1);
		k=0.0;
		y_1=0;
	while(y_0>toch && k<50);
	{
		y_0=pow(j/10, k)*cos(sdvig+pi*k/2)/factorial(k);
		y_1+=100*y_0;
		k+=1.0;	
	}
	

		MoveToEx(hdc, j, y_1, NULL);
		LineTo(hdc, j, y_1);
}




ValidateRect(hWnd, NULL);
EndPaint(hWnd, &ps);
break;

//Завершение работы окна
case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return(DefWindowProc(hWnd, messg, wParam, lParam));
}
return 0;
}
Sorento2 вне форума Ответить с цитированием
Старый 20.05.2013, 07:45   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Код:
как сделать масштаб координат чтобы иксы были ну до 10 хотя бы(если меня поняли:D).заранее благодарен)
Самое простое - самому посчитать на листочке бумажки (или другим удобным способом) значения y(10) и установить соответствующий масштаб осей.
s-andriano вне форума Ответить с цитированием
Старый 20.05.2013, 09:44   #3
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Хорошо. Масштаб я сделаю. Он делается при помощи SetWindowExtEx, правильно? Возьму ну масштаб один к 100. Как тогда в этом случае нанести деления и рисовать графики? Просто у меня получаются все линии очень большими.

И еще. Скажем возьму я X=6. При подстановки в cos(x+a) все нормально. Но при подстановке в ряд(скажем при n = 6) получается большое число.

Последний раз редактировалось Sorento2; 20.05.2013 в 09:48.
Sorento2 вне форума Ответить с цитированием
Старый 20.05.2013, 11:09   #4
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Вот такой график получается.
aery.JPG
Sorento2 вне форума Ответить с цитированием
Старый 20.05.2013, 13:04   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Sorento2 Посмотреть сообщение
Хорошо. Масштаб я сделаю. Он делается при помощи SetWindowExtEx, правильно? Возьму ну масштаб один к 100. Как тогда в этом случае нанести деления и рисовать графики? Просто у меня получаются все линии очень большими.

И еще. Скажем возьму я X=6. При подстановки в cos(x+a) все нормально. Но при подстановке в ряд(скажем при n = 6) получается большое число.
Я не понимаю, что Вы хотите. Ну получается большое число - и что с того?

Если присутствует существенная разномасштабность, обычно рекомендуется использовать логарифмический масштаб, но это только для положительных величин.

В принципе, построение красивого и информативного графика - это искусство.
Если уж совсем не представляете, что должно быть, нарисуйте нужный график в Excell, поиграйтесь параметрами, подберите оптимальный вариант, а потом найденные параметры используйте в своей программе.
s-andriano вне форума Ответить с цитированием
Старый 20.05.2013, 13:39   #6
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Извините плохо изъясняюсь.
Просто получается, что при больших иксах у меня значение функции через ряд много больше значения самой функции. Поэтому я хочу сделать масштаб. Но когда я делаю масштаб, что точки, что линии рисуются слишком большими.
Sorento2 вне форума Ответить с цитированием
Старый 20.05.2013, 18:40   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А что такое большая линия или большая точка?
s-andriano вне форума Ответить с цитированием
Старый 20.05.2013, 20:51   #8
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Ну с помощью функции SetWindowExtEx, я делаю масштаб 10:1. Ну и соответственно он и рисует мне "пиксели" в десять раз больше(насколько я понимаю).
Я, например, создаю hPen = CreatePen(1,1,RGB(0,0,0)). Так он рисует диаметром не 1, а 10.

А можно как то в этом масштабе нарисовать линию толщиной в обычный пиксель(из старой системы)?
Sorento2 вне форума Ответить с цитированием
Старый 20.05.2013, 22:56   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Так нужно задавать масштаб осей, а не масштаб изображения.
Откуда у Вас взялись коэффициенты 100.0 и 10 в строке?
Код:
	y=100.0*cos(i/10+sdvig);
s-andriano вне форума Ответить с цитированием
Старый 20.05.2013, 23:38   #10
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Если честно сам не знаю(почему 10 появился). 100 потому что у меня размер изображения 500 на 500. а cos ограничен от 1 до -1. А 10 я написал потому что график cos(i+a) не очень правильный получался.
Sorento2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bывести на экран монитора и напечатать таблицу значений аргумента и функции, а также график функции средствами Exel IgorMyakota Помощь студентам 1 24.11.2012 02:46
Построить график функции F(x) на заданном интервале с заданным шагом и вывести значения х и функции F(x) в таблицу в графическом р Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 12.11.2012 21:57
Разложение функции в ряд Dmitry333 Помощь студентам 10 23.01.2012 16:49
Программа определяющия и выводящая на экран в виде таблицы значения функции, разложенной в бесконечный ряд Тейлора на интервале.. Алексей Квашнин Помощь студентам 0 18.12.2011 22:41
ряд Фурье(Delphi,график) menX Помощь студентам 1 23.04.2009 21:26