vc中画图???

tongdayong1981 2005-04-02 03:02:27
我想画下面两个函数的图,但是不对,大家帮我改一下。

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)太小.看不到啊???
...全文
225 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingrain213 2010-05-31
  • 打赏
  • 举报
回复
我画了一个图,怎样在原来的基础上删掉原图重新循环画新图呢、?
菜牛 2005-04-03
  • 打赏
  • 举报
回复
忘了件事,要用fabs(),不是abs()。
vcmute 2005-04-03
  • 打赏
  • 举报
回复
LineTo中需要整数,可*100,如
LineTo(hdc,x*100,y*100);
菜牛 2005-04-03
  • 打赏
  • 举报
回复
这是我试过的,拷贝到CView::OnDraw()里面就可以了。

为什么不用MFC?简单。
菜牛 2005-04-03
  • 打赏
  • 举报
回复
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();
vcmute 2005-04-02
  • 打赏
  • 举报
回复
图形放大,将参数设小就可以
SetWindowExtEx(hdc,3,2,NULL);
tongdayong1981 2005-04-02
  • 打赏
  • 举报
回复
对于有的函数即使我把x变大在除以一个数使x(-1,1)那函数的值怎么办呢??

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧