凸包[C程序]
来源:互联网 发布:有生日提醒软件 编辑:程序博客网 时间:2024/06/06 16:32
[Windows下MinGW GCC下调试通过]
/*------------------------------------------------------------ HELLOWIN.C -- Displays "Hello, Windows 98!" in client area (c) Charles Petzold, 1998 ------------------------------------------------------------*/#include <stdlib.h>#include <time.h>#include <stdio.h>#include <windows.h>#include <math.h>//------------------------------------------------------------#define num_dot 200struct ddoott{float x; float y; float z;};struct ddoott dot[num_dot];struct ddoott tod[num_dot];int td[num_dot];//------------------------------------------------------------void boarder(HDC);void cross(HDC,int,int,int,COLORREF);// void disptheta(HDC,float*,int,int,int,COLORREF);void line(HDC,int,int,int,COLORREF);float xmul(int,int,int);// void dispinfo(HDC, float,int,int, COLORREF);LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);//--------------------------------------------------------------int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC hdc ; PAINTSTRUCT ps ; RECT rect ; float ix,iy,iz; int i; static int AA[100]; char strbuf[80]; switch (message) { case WM_CREATE: srand((unsigned)time(NULL));// PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; for(i=0;i<num_dot;i++) { dot[i].x=50.0+rand()%400; dot[i].y=50.0+rand()%400; dot[i].z=50.0+rand()%100; } return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; SetTextColor(hdc,RGB(255,192,192)); // DrawText (hdc, TEXT ("Create 100 different dot..."), -1, &rect, // DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; for(i=0;i<num_dot;i++) { // sprintf(strbuf,"%2d\0",i); // TextOut(hdc,dot[i].x-10,dot[i].y-10,strbuf,strlen(strbuf)); cross(hdc,dot[i].x,dot[i].y,1,RGB(0,0,127)); }// MoveToEx(hdc,dot[0].x,dot[0].y,NULL);// for(i=1;i<num_dot;i++) LineTo(hdc,dot[i].x,dot[i].y); boarder(hdc);// for(i=0;i<num_dot;i++)// { // sprintf(strbuf,"%2d\0",i);// TextOut(hdc,dot[i].x-10,dot[i].y-10,strbuf,strlen(strbuf));// } EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;}//-------------------------------------------------------------void boarder(HDC hdc){ int i,j,k,p,q,r; int rtag,qtag,ptag; float low,high; float theta[num_dot]; int ptheta[num_dot]; char strbuf[80]; low=0.0; for(j=i=0;i<num_dot;i++) { if(dot[i].x>low){low=dot[i].x;td[j]=i;} } cross(hdc,dot[td[j]].x,dot[td[j]].y,2,RGB(255,0,0)); for(i=0;i<num_dot;i++) { if(i==td[j])theta[i]=4.0; else theta[i]=2+(dot[i].y-dot[td[j]].y)/sqrt((dot[i].x-dot[td[j]].x)*(dot[i].x-dot[td[j]].x)+(dot[i].y-dot[td[j]].y)*(dot[i].y-dot[td[j]].y)); }// disptheta(hdc,theta,60,5,num_dot,RGB(255,0,0));//sort theta[] for(i=0;i<num_dot-1;i++) { k=i; for(j=i+1;j<num_dot;j++) { if(theta[j]<theta[k])k=j; } low=theta[k];theta[k]=theta[i];theta[i]=low; low=dot[k].x,dot[k].x=dot[i].x,dot[i].x=low; low=dot[k].y,dot[k].y=dot[i].y,dot[i].y=low; }// disptheta(hdc,theta,560,5,num_dot,RGB(0,0,255)); ptag=1; line(hdc,num_dot-1,0,2,RGB(255,0,0)); line(hdc,num_dot-1,num_dot-2,2,RGB(255,128,0)); p=0; q=1; r=2; while(ptag==1) { rtag=1; while(rtag==1) { high=xmul(p,q,r);// line(hdc,p,q,1,RGB(0,255,0));// line(hdc,p,r,1,RGB(0,0,255));// dispinfo(hdc,high,400+q*130,20+20*r,RGB(0,0,255)); if(high>0.0){q=r;r=-1;rtag=0;} r++; if(r==p)r++; if(r==q)r++; if(r==num_dot-1)rtag=-1; }// dispinfo(hdc,rtag,220,20,RGB(0,0,0));// dispinfo(hdc,p,500,20,RGB(0,0,0)); // dispinfo(hdc,q,620,20,RGB(64,0,0)); // dispinfo(hdc,r,740,20,RGB(0,64,0)); if(rtag==-1) { line(hdc,p,q,2,RGB(255,0,0)); p=q;q++;r=0; } if(q==num_dot-1)ptag=-1; } return;}void line(HDC hdc,int p,int q,int width, COLORREF color){ HPEN usepen; usepen=CreatePen(PS_SOLID,width,color); SelectObject(hdc,usepen); MoveToEx(hdc,dot[p].x,dot[p].y,NULL); LineTo(hdc,dot[q].x,dot[q].y); SelectObject(hdc,GetStockObject(BLACK_PEN)); DeleteObject(usepen); return;} void cross(HDC hdc,int cx,int cy,int width,COLORREF color){ HPEN usepen; usepen=CreatePen(PS_SOLID,width,color); SelectObject(hdc,usepen); MoveToEx(hdc,cx-3,cy-3,NULL); LineTo(hdc,cx+3,cy+3); MoveToEx(hdc,cx-5,cy+3,NULL); LineTo(hdc,cx+3,cy-3); SelectObject(hdc,GetStockObject(BLACK_PEN)); DeleteObject(usepen); return; }float xmul(int p,int q,int r){ float ax,ay,bx,by; ax=dot[q].x-dot[p].x; ay=dot[q].y-dot[p].y; bx=dot[r].x-dot[p].x; by=dot[r].y-dot[p].y; return ax*by-bx*ay;}/* void disptheta(HDC hdc,float* theta,int cx,int cy,int n,COLORREF color){ int i; char strbuf[80]; SetTextColor(hdc,color); for(i=0;i<n;i++) { sprintf(strbuf,"i= %3d cos = %7.4f point at (%7.4f , %7.4f); \0",i,theta[i],dot[i].x,dot[i].y); TextOut(hdc,cx,cy+i*18,strbuf,strlen(strbuf)); } return;}void dispinfo(HDC hdc, float info,int x,int y, COLORREF color){ int cx,cy; char strbuf[80]; cx=(x-400)/130;cy=(y-20)/20; sprintf(strbuf, "X(%d,%d): %7.2f\0",cx,cy,info); SetTextColor(hdc,color); TextOut(hdc,x,y,strbuf,strlen(strbuf)); return;}*/
- 凸包[C程序]
- C语言打包解包文件程序
- linux下包监控程序[C语言]
- 纯C语言求点集的凸包程序(含边界提取)
- 纠结的凸包算法程序
- USACO 5.1.1 凸包参考程序
- USACO 5.1.1 凸包参考程序
- 在vs2008下制做c/s程序安装包(中包含第三方控件注册)
- 在vs2008下制做c/s程序安装包(中包含第三方控件注册)
- 基于Linux C的socket抓包程序和Package分析 (一)
- 基于Linux C的socket抓包程序和Package分析 (二)
- c语言基于Linux下用libpcap实现抓包程序
- 制作程序安装包
- 发布jar包程序
- Android抓包程序
- oracle包程序编写
- libpcap 抓包程序
- ios程序安装包
- OpenCV-图像几何变换:旋转,缩放,斜切
- 设计模式心得体会(陆续更新)
- KNOW: Hash Table
- 我说的话能信吗?如今自己也不信,错了该
- Python学习笔记--调试器debugger
- 凸包[C程序]
- 直通车
- java知识系列之线程
- java的POI操作excel文件
- ext2_try_to_allocate_with_rsv解析
- 用C#构建一个简单的采集系统之一-主界面设计
- cocos2d 游戏例子 TiledMap
- 【转并修改】让C程序更高效的10种方法
- SQL 2005数据库中各种对象的判断