太空有多少人造卫星:怎样画圆
来源:百度文库 编辑:查人人中国名人网 时间:2024/05/13 18:15:26
是不是编程题?
#include <windows.h>
#include <stdio.h>
#include <math.h>
typedef struct
{
HWND *lphWnd;
DWORD dwExStyle; // extended window style
LPCTSTR lpClassName; // pointer to registered class name
LPCTSTR lpWindowName; // pointer to window name
DWORD dwStyle; // window style
int x; // horizontal position of window
int y; // vertical position of window
int nWidth; // window width
int nHeight; // window height
HMENU hMenu; // handle to menu, or child-window identifier
}childstru;
HANDLE hInst;
HFONT hFont;
HWND MainhWnd,button1,button2,button3,button4;
HDC mDc;
HBITMAP hbmp;
char *titletext="两种画圆算法",*classname="HeLiang";
BOOL InitApplication(HANDLE hInstance);
BOOL InitInstance(HANDLE hInstance,int nCmdShow);
//------------------------------------------------
childstru CldWin[]=
{
{
&button1,
0,// extended window style
"Button",// pointer to registered class name
"Midpoint",// pointer to window name
WS_VISIBLE| WS_CHILD |BS_PUSHBUTTON,// window style
0,// horizontal position of window
0,// vertical position of window
80,// window width
21,// window height
NULL,// handle to menu, or child-window identifier
},
{
&button2,
0,// extended window style
"Button",// pointer to registered class name
"Bresenham",// pointer to window name
WS_VISIBLE| WS_CHILD |BS_PUSHBUTTON,// window style
0,// horizontal position of window
0,// vertical position of window
80,// window width
21,// window height
NULL,// handle to menu, or child-window identifier
},
{
&button3,
0,// extended window style
"Button",// pointer to registered class name
"Clear",// pointer to window name
WS_VISIBLE| WS_CHILD |BS_PUSHBUTTON,// window style
0,// horizontal position of window
0,// vertical position of window
80,// window width
21,// window height
NULL,// handle to menu, or child-window identifier
},
{
&button4,
0,// extended window style
"Button",// pointer to registered class name
"Line",// pointer to window name
WS_VISIBLE| WS_CHILD |BS_PUSHBUTTON,// window style
0,// horizontal position of window
0,// vertical position of window
80,// window width
21,// window height
NULL,// handle to menu, or child-window identifier
},
{
NULL,
0,// extended window style
NULL,// pointer to registered class name
NULL,// pointer to window name
0,// window style
0,// horizontal position of window
0,// vertical position of window
0,// window width
0,// window height
NULL,// handle to menu, or child-window identifier
}
};
//------------------------------------------------
void __fastcall MidLine(HDC hDc,int x0,int y0,int x1,int y1,COLORREF color)
{
int a,b,dt1,dt2,d,x,y,ystp=1;
if(abs(x1-x0)>abs(y1-y0))
{
if(x0>x1)
{
x=x0;x0=x1;x1=x;
y=y0;y0=y1;y1=y;
}
a=y0-y1;
b=x1-x0;
if(a>0){a=-a;ystp=-1;}else ystp=1;
d=(a<<1)+b;
dt1=a<<1;
dt2=(a+b)<<1;
x=x0;
y=y0;
SetPixel(hDc,x,y,color);
while(x<x1)
{
if(d<0)
{
x++;y+=ystp;d+=dt2;
}else
{
x++;
d+=dt1;
}
SetPixel(hDc,x,y,color);
}
}else
{
if(y0>y1)
{
x=x0;x0=x1;x1=x;
y=y0;y0=y1;y1=y;
}
a=x0-x1;
b=y1-y0;
if(a>0){a=-a;ystp=-1;}else ystp=1;
d=(a<<1)+b;
dt1=a<<1;
dt2=(a+b)<<1;
x=x0;
y=y0;
SetPixel(hDc,x,y,color);
while(y<y1)
{
if(d<0)
{
y++;x+=ystp;d+=dt2;
}else
{
y++;
d+=dt1;
}
SetPixel(hDc,x,y,color);
}
}
}
//------------------------------------------------
void __fastcall cirpixel(HDC hDc,int x0,int y0,int x,int y,COLORREF color)
{
SetPixel(hDc,x0+x,y0+y,color);
SetPixel(hDc,x0+y,y0+x,color);
SetPixel(hDc,x0-x,y0+y,color);
SetPixel(hDc,x0+y,y0-x,color);
SetPixel(hDc,x0+x,y0-y,color);
SetPixel(hDc,x0-y,y0+x,color);
SetPixel(hDc,x0-x,y0-y,color);
SetPixel(hDc,x0-y,y0-x,color);
}
//------------------------------------------------
void __fastcall bpixel(HDC hDc,int x0,int y0,int x,int y,COLORREF color)
{
SetPixel(hDc,x0+x,y0+y,color);
SetPixel(hDc,x0-x,y0+y,color);
SetPixel(hDc,x0+x,y0-y,color);
SetPixel(hDc,x0-x,y0-y,color);
}
//------------------------------------------------
void __fastcall BresenhamCircle(HDC hDc,int x0,int y0,int r,COLORREF color)
{
int x,y,dt,dt1,dt2,dr;
x=0;y=r;dt=2-r-r;
while(y>=0)
{
bpixel(hDc,x0,y0,x,y,color);
if(dt<0)
{
dt1=dt+dt+y+y-1;
if(dt1<=0)dr=1;
else dr=2;
}
else if(dt>0)
{
dt2=dt+dt-x-x-1;
if(dt2<=0)dr=2;
else dr=3;
}else dr=2;
switch(dr)
{
case 1: x++;dt+=x+x+1;
break;
case 2: x++;y--;dt+=x+x-y-y-1;
break;
case 3: y--;dt+=1-y-y;
break;
}
}
}
//------------------------------------------------
void __fastcall MidpointCircle(HDC hDc,int x,int y,int r,COLORREF color)
{
int xx,yy,dtx,dty,d;
xx=0;yy=r;dtx=3,dty=2-r-r;d=1-r;
cirpixel(hDc,x,y,xx,yy,color);
while(xx<yy)
{
if(d<0)
{
d+=dtx;dtx+=2;xx++;
}else
{
d+=dtx+dty;dtx+=2;dty+=2;xx++;yy--;
}
cirpixel(hDc,x,y,xx,yy,color);
}
}
//------------------------------------------------
long PASCAL MainWnProc(HWND hWnd,unsigned int Message,unsigned int wParam,long lParam)
{
static HANDLE hDc;
RECT rect;
PAINTSTRUCT ps;
WNDPROC prevWinProc;
int i;
switch(Message)
{
case WM_CREATE:
SendMessage(hWnd,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(true, 0));
i=0;
while(CldWin[i].lphWnd!=NULL)
{
*(CldWin[i].lphWnd)=CreateWindowEx(CldWin[i].dwExStyle,CldWin[i].lpClassName,
CldWin[i].lpWindowName,CldWin[i].dwStyle,CldWin[i].x,CldWin[i].y,
CldWin[i].nWidth,CldWin[i].nHeight,hWnd,CldWin[i].hMenu,hInst,NULL);
SendMessage(*(CldWin[i].lphWnd),WM_SETFONT,(WPARAM)hFont,MAKELPARAM(true, 0));
i++;
}
return 0;
case WM_PAINT:
hDc=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
case WM_SIZE:
GetClientRect(hWnd,&rect);
MoveWindow(button1,rect.right-240,rect.bottom-30,70,21,true);
MoveWindow(button2,rect.right-160,rect.bottom-30,70,21,true);
MoveWindow(button3,rect.right-80,rect.bottom-30,70,21,true);
MoveWindow(button4,rect.right-320,rect.bottom-30,70,21,true);
InvalidateRect(hWnd,NULL,true);
break;
case WM_COMMAND:
if(LOWORD(lParam)==(unsigned short)button1)
{
hDc=GetDC(MainhWnd);
for(int r=200;r>=0;r--)
MidpointCircle(hDc,260,260,r,RGB(255,0,0xff-r));
MidpointCircle(hDc,260,260,250,RGB(255,0,250));
ReleaseDC(MainhWnd,hDc);
}
if(LOWORD(lParam)==(unsigned short)button2)
{
hDc=GetDC(MainhWnd);
for(int r=200;r>=0;r--)
BresenhamCircle(hDc,260,260,r,RGB(255,0xff-r,0));
BresenhamCircle(hDc,260,260,250,RGB(255,250,0));
ReleaseDC(MainhWnd,hDc);
}
if(LOWORD(lParam)==(unsigned short)button4)
{
hDc=GetDC(MainhWnd);
for(int i=0;i<700;i++)
MidLine(hDc,300,200,i,50,RGB(255,0,i*255/700));
for(int i=0;i<700;i++)
MidLine(hDc,300,200,i,350,RGB(i*255/700,255,0));
for(int i=50;i<350;i++)
MidLine(hDc,300,200,0,i,RGB(0,255,i*255/350));
for(int i=50;i<350;i++)
MidLine(hDc,300,200,700,i,RGB(0,i*255/350,255));
ReleaseDC(MainhWnd,hDc);
}
if(LOWORD(lParam)==(unsigned short)button3)
{
InvalidateRect(hWnd,NULL,true);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}
//------------------------------------------------
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
LOGFONT LogFont;
MSG msg;
HDC hDc;
hFont=GetStockObject(DEFAULT_GUI_FONT);
if(!hPrevInstance)
if(!InitApplication(hInstance)) return (FALSE);
if(!InitInstance(hInstance,nCmdShow)) return(FALSE);
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(hFont);
return(msg.wParam);
}
//------------------------------------------------
BOOL InitApplication(HANDLE hInstance)
{
WNDCLASS wc;
wc.style=NULL;
wc.lpfnWndProc=MainWnProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(hInstance,"MAINICON");
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=GetSysColorBrush(COLOR_WINDOW);
wc.lpszMenuName=""; //Name of menu resource in .RC file
wc.lpszClassName=classname; //Name used in call to CreateWindow.
return RegisterClass(&wc);
}
//------------------------------------------------
BOOL InitInstance(HANDLE hInstance,int nCmdShow)
{
HWND hWnd;
hInst=hInstance;
hWnd=CreateWindowEx(WS_EX_APPWINDOW,classname,titletext,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
MainhWnd=hWnd;
if(!hWnd)return(FALSE);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return(TRUE);
}
//------------------------------------------------
记得上小学时老师好像提到过,以手肘为圆心,固定长度内旋,但是没尝试过