中点画圆算法的实现
来源:互联网 发布:环形网络结构的优缺点 编辑:程序博客网 时间:2024/05/10 00:59
算法来源于Donald Hearn和M. Pauline Baker合著的神作《计算机图形学》。程序在codeblocks下采用win32 api编程实现。
#include <windows.h>#include <math.h>/* Declare Windows procedure */LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);float Radius (POINT ptBeg, POINT ptEnd);void CircleMidpoint (HDC hdc, int xc, int yc, int rad);void CirclePlotPoints (HDC hdc, int xc, int yc, POINT circPt);void DrawCircle (HDC hdc, POINT ptBeg, POINT ptEnd);static int radius;/* Make the class name into a global variable */char szClassName[ ] = "CodeBlocksWindowsApp";int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow){ HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Code::Blocks Template Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam;}/* This function is called by the Windows function DispatchMessage() */LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static POINT ptBeg, ptEnd; HDC hdc; PAINTSTRUCT ps; switch (message) /* handle the messages */ { case WM_CREATE: radius = 0; break; case WM_LBUTTONDOWN: ptBeg.x = LOWORD (lParam); ptBeg.y = HIWORD (lParam); ptEnd = ptBeg; InvalidateRect (hwnd, NULL, TRUE); break; case WM_MOUSEMOVE: if (wParam & MK_LBUTTON) { hdc = GetDC (hwnd); SelectObject (hdc, GetStockObject (BLACK_PEN)); SetROP2 (hdc, R2_NOTXORPEN); DrawCircle (hdc, ptBeg, ptEnd); ptEnd.x = LOWORD (lParam); ptEnd.y = HIWORD (lParam); DrawCircle (hdc, ptBeg, ptEnd); ReleaseDC (hwnd, hdc); } break; case WM_LBUTTONUP: InvalidateRect (hwnd, NULL, TRUE); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); if(ptEnd.x != ptBeg.x || ptEnd.y != ptEnd.y) { SelectObject(hdc, GetStockObject(BLACK_PEN)); CircleMidpoint(hdc, ptBeg.x, ptBeg.y, radius); } EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0;}float Radius(POINT ptBeg, POINT ptEnd){ return sqrt ((ptEnd.x - ptBeg.x)*(ptEnd.x - ptBeg.x) + (ptEnd.y - ptBeg.y)*(ptEnd.y - ptBeg.y));}void CircleMidpoint (HDC hdc, int xc, int yc, int rad){ POINT circPt; int p = 1 - rad; circPt.x = 0; circPt.y = rad; CirclePlotPoints (hdc, xc, yc, circPt); while (circPt.x < circPt.y) { circPt.x++; if (p < 0) { p += 2*circPt.x + 1; } else { circPt.y--; p += 2*circPt.x + 1 - 2*circPt.y; } CirclePlotPoints (hdc, xc, yc, circPt); }}void CirclePlotPoints (HDC hdc, int xc, int yc, POINT circPt){ SetPixel (hdc, xc + circPt.x, yc + circPt.y, 0); SetPixel (hdc, xc - circPt.x, yc + circPt.y, 0); SetPixel (hdc, xc + circPt.x, yc - circPt.y, 0); SetPixel (hdc, xc - circPt.x, yc -circPt.y, 0); SetPixel (hdc, xc + circPt.y, yc + circPt.x, 0); SetPixel (hdc, xc -circPt.y, yc + circPt.x, 0); SetPixel (hdc, xc + circPt.y, yc - circPt.x, 0); SetPixel (hdc, xc - circPt.y, yc - circPt.x, 0);}void DrawCircle(HDC hdc, POINT ptBeg, POINT ptEnd){ radius = Radius (ptBeg, ptEnd); MoveToEx (hdc, ptBeg.x, ptBeg.y, NULL); LineTo (hdc, ptEnd.x, ptEnd.y); CircleMidpoint (hdc, ptBeg.x, ptBeg.y, radius);}
- 中点画圆算法的实现
- Bresenham 中点画圆算法实现
- 中心点画圆算法 实现
- opencv中使用中点画圆算法
- 圆生成算法---中点画圆法
- 计算机图形学:中点画圆算法
- 中点画椭圆算法
- 中点画直线算法
- 用OpenGL实现 中点画圆法
- 中心点画圆算法
- 中点画圆法
- 中点画圆法
- 中点画圆
- Bresenham画圆算法 与中点画圆法
- 圆生成算法(中点画圆、Bresenham画圆)
- 椭圆生成算法---中点画椭圆法
- 【计算机图形学】中点画圆算法和Bresenham画圆算法
- OpenGL学习之中点画圆算法
- websphere7 linux 命令行安装(静默安装)
- 模块化编程
- android listView头部自定义标签形式
- 2012年需要完成的事情
- Linux下shutdown命令详解
- 中点画圆算法的实现
- C++运算符
- Linux下函数调用堆栈帧的详细解释
- OGRE 1.8 Animation ,动画部分
- Android 开发指南 翻译7 Application Resources: Handling Runtime Changes(未完...)
- Spring中常用的hql查询方法 (getHibernateTemplate())
- 2012年最值得学习的IT视频资料及技术资讯类网站列举
- 从零开始开发iPhone,教你如何在真机调试iPhone应用程序
- 怎样使一个Android应用不被杀死