我想画下面两个函数的图,但是不对,大家帮我改一下。l n(1+u|x|)
公式F(x)=sgn(x) ---------------
ln(1+u)
画图时采用μ=255。
对于下面公式
Ax
y=sgn(x)---------- 0<|x|<=1/A
1+lnA 1+ln( A|x|)
y=sgn(x)---------- 1/A<|x|<=1
1+lnAA取87.56
Sgn(x)为x的极性,即x为+,sgn(x)为+
X为-,sgn(x)为-X为-1~1的值//μ_curve
#include<windows.h>
#include<math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
double A=87.56;
double u=255;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreIntance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
char lpszClassName[]="曲线";
char lpszTitle[]="draw_A_curve"; //窗口类的定义
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=lpszClassName;
wndclass.lpszMenuName=NULL;
wndclass.style=0; //-------以下进行窗口的注册-------------//
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return false; } //创建窗口
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
double x,y;
double i;
HPEN hPen;
PAINTSTRUCT ps;
switch(message)
{case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetMapMode(hdc,MM_ANISOTROPIC);
SetWindowExtEx(hdc,300,300,NULL);
SetViewportExtEx(hdc,300,200,NULL);
SetViewportOrgEx(hdc,300,150,NULL);
hPen=CreatePen(PS_INSIDEFRAME,2,RGB(0,255,0));
SelectObject(hdc,hPen);
for(i=-1;i<1;i=i+0.01)
{
if(i==0)
MoveToEx(hdc,0,0,NULL);
else
{
x=x+0.01;
if(abs(x)>0 && abs(x)<1/A && x<0)
y=-A*x/(1+log(A));
else if(abs(x)>0 && abs(x)<1.0/A && x>0)
y=A*x/(1+log(A));
else if(abs(x)>1.0/A && abs(x)<1.0 && x>0)
y=(1+log(A*abs(x)))/(1+log(A));
else if(abs(x)>1.0/A && abs(x)<1.0 && x<0)
y=-(1+log(A*abs(x)))/(1+log(A));
LineTo(hdc,x,y);
//MoveToEx(hdc,x,y,NULL);
}
}
hPen=CreatePen(PS_INSIDEFRAME,2,RGB(255,0,0));
SelectObject(hdc,hPen);
for(i=0;i<1;i++)
{
if(i==0)
{
x=0;
y=0;
MoveToEx(hdc,x,y,NULL);
}
else
{
x=x+0.01;
y=log(1+u*x)/log(1+u);
LineTo(hdc,x,y);
//MoveToEx(hdc,x,y,NULL);
}
}
EndPaint(hwnd, &ps);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
哪儿错了,还有怎么把图形放大,因为比如y=sinx中的值(-1.1)太小.看不到啊???
公式F(x)=sgn(x) ---------------
ln(1+u)
画图时采用μ=255。
对于下面公式
Ax
y=sgn(x)---------- 0<|x|<=1/A
1+lnA 1+ln( A|x|)
y=sgn(x)---------- 1/A<|x|<=1
1+lnAA取87.56
Sgn(x)为x的极性,即x为+,sgn(x)为+
X为-,sgn(x)为-X为-1~1的值//μ_curve
#include<windows.h>
#include<math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
double A=87.56;
double u=255;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreIntance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
char lpszClassName[]="曲线";
char lpszTitle[]="draw_A_curve"; //窗口类的定义
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=lpszClassName;
wndclass.lpszMenuName=NULL;
wndclass.style=0; //-------以下进行窗口的注册-------------//
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return false; } //创建窗口
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
double x,y;
double i;
HPEN hPen;
PAINTSTRUCT ps;
switch(message)
{case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetMapMode(hdc,MM_ANISOTROPIC);
SetWindowExtEx(hdc,300,300,NULL);
SetViewportExtEx(hdc,300,200,NULL);
SetViewportOrgEx(hdc,300,150,NULL);
hPen=CreatePen(PS_INSIDEFRAME,2,RGB(0,255,0));
SelectObject(hdc,hPen);
for(i=-1;i<1;i=i+0.01)
{
if(i==0)
MoveToEx(hdc,0,0,NULL);
else
{
x=x+0.01;
if(abs(x)>0 && abs(x)<1/A && x<0)
y=-A*x/(1+log(A));
else if(abs(x)>0 && abs(x)<1.0/A && x>0)
y=A*x/(1+log(A));
else if(abs(x)>1.0/A && abs(x)<1.0 && x>0)
y=(1+log(A*abs(x)))/(1+log(A));
else if(abs(x)>1.0/A && abs(x)<1.0 && x<0)
y=-(1+log(A*abs(x)))/(1+log(A));
LineTo(hdc,x,y);
//MoveToEx(hdc,x,y,NULL);
}
}
hPen=CreatePen(PS_INSIDEFRAME,2,RGB(255,0,0));
SelectObject(hdc,hPen);
for(i=0;i<1;i++)
{
if(i==0)
{
x=0;
y=0;
MoveToEx(hdc,x,y,NULL);
}
else
{
x=x+0.01;
y=log(1+u*x)/log(1+u);
LineTo(hdc,x,y);
//MoveToEx(hdc,x,y,NULL);
}
}
EndPaint(hwnd, &ps);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
哪儿错了,还有怎么把图形放大,因为比如y=sinx中的值(-1.1)太小.看不到啊???
解决方案 »
- 請教下MfcEditbrowse 控件的使用方法
- MFC动态创建表
- CTreeCtrl类中相应鼠标单击弹出对话框的功能
- 进程驻留在内存中不能退出。
- 求助,请各位高手帮忙,不胜感激,急急急!!
- 为什么我接收到的数据显示是乱码?
- 一个hook程序的问题(非常严重)
- 我想让treectrl的提示信息多行显示。不知道谁可以帮我。
- 请问在用GetPrivateProfileString函数时,要读取的ini文件正在变动时会出现什么情况
- 我用特殊的方法用TrackPopupMenu函数弹出了菜单,但无法去掉,大家有什么好的建议?
- 如何在控制台程序中使用定时器
- 如何用new动态申请二维数组,然后又如何用delete释放所有内存
SetWindowExtEx(hdc,3,2,NULL);
CPen *pPenOld = pDC->SelectObject(&Pen);
double A = 87.56;
double A1 = 1.0 / A;
double u = 255;
CRect rcClient;
GetClientRect(rcClient);
double xR = (double)rcClient.Width() / 2.0;
double yR = (double)rcClient.Height() / 2.0;
int xPos, yPos;
double x = -1.0, y = -1.0;
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
pDC->MoveTo(xPos, yPos);
for(x = -1.0; x < 1.0; x +=0.01)
{
if ((abs(x) > 0.0) && (abs(x) < A1) && (x < 0.0))
y = -A * x / (1 + log(A));
else if (abs(x) > 0.0 && abs(x) < A1 && x > 0.0)
y = A * x / (1 + log(A));
else if (abs(x) > A1 && abs(x) < 1.0 && x > 0.0)
y =(1 + log(A * abs(x))) / (1 + log(A));
else if (abs(x) > A1 && abs(x) < 1.0 && x < 0.0)
y = -(1 + log(A * abs(x))) / (1 + log(A));
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
pDC->LineTo(xPos, yPos);
}
x = 0.0;
y = 0.0;
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
pDC->MoveTo(xPos, yPos);
pDC->SelectObject(pPenOld);
Pen.DeleteObject();
Pen.CreatePen(PS_INSIDEFRAME, 2, RGB(255,0,0));
pPenOld = pDC->SelectObject(&Pen);
for(x = 0.0; x < 1.0; x +=0.01)
{
y = log(1 + u * x) / log(1 + u);
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
pDC->LineTo(xPos, yPos);
}
pDC->SelectObject(pPenOld);
Pen.DeleteObject();
LineTo(hdc,x*100,y*100);