我想画下面两个函数的图,但是不对,大家帮我改一下。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)太小.看不到啊???

解决方案 »

  1.   

    图形放大,将参数设小就可以
    SetWindowExtEx(hdc,3,2,NULL);
      

  2.   

    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();
      

  3.   

    这是我试过的,拷贝到CView::OnDraw()里面就可以了。为什么不用MFC?简单。
      

  4.   

    LineTo中需要整数,可*100,如
    LineTo(hdc,x*100,y*100);
      

  5.   

    忘了件事,要用fabs(),不是abs()。