vc中画图???
我想画下面两个函数的图,但是不对,大家帮我改一下。
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+lnA
A取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)太小.看不到啊???
问题点数:20、回复次数:6Top
1 楼tondayong1981(bryan)回复于 2005-04-02 15:07:21 得分 0
对于有的函数即使我把x变大在除以一个数使x(-1,1)那函数的值怎么办呢??Top
2 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-04-02 15:49:44 得分 3
图形放大,将参数设小就可以
SetWindowExtEx(hdc,3,2,NULL);Top
3 楼Mackz(在相互)回复于 2005-04-03 17:12:02 得分 17
CPen Pen(PS_INSIDEFRAME, 2, RGB(0, 255, 0));
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();
Top
4 楼Mackz(在相互)回复于 2005-04-03 17:13:04 得分 0
这是我试过的,拷贝到CView::OnDraw()里面就可以了。
为什么不用MFC?简单。Top
5 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-04-03 17:13:55 得分 0
LineTo中需要整数,可*100,如
LineTo(hdc,x*100,y*100);Top
6 楼Mackz(在相互)回复于 2005-04-03 17:53:11 得分 0
忘了件事,要用fabs(),不是abs()。Top




