`
java-mans
  • 浏览: 11413361 次
文章分类
社区版块
存档分类
最新评论

绘图(直线,曲线)例子

 
阅读更多

画数学函数:

#include<windows.h>
#include<math.h>
#define NUM 1000
#define TWOPI (2*3.14159)

LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
	static TCHAR szAppName[]=TEXT("leidemingzi");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	 
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_HELP);
	wndclass.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WindowProc;
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;

	if(!RegisterClass(&wndclass)){
		MessageBox(NULL,TEXT("the program require windows NT"),szAppName,MB_YESNO);
		return 0;
	}
	hwnd=CreateWindow(
  szAppName,  // registered class name
  TEXT("this is title"), // window name
  WS_OVERLAPPEDWINDOW,        // window style
  CW_USEDEFAULT,                // horizontal position of window
  CW_USEDEFAULT,                // vertical position of window
  CW_USEDEFAULT,           // window width
  CW_USEDEFAULT,          // window height
  NULL,      // handle to parent or owner window
  NULL,          // menu handle or child identifier
  hInstance,  // handle to application instance
  NULL       // window-creation data
);
	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)

{
	static int cxClient,cyClient;
	HDC hdc;
	int i;
	PAINTSTRUCT ps;
	POINT apt[NUM];

	switch(uMsg){
		case WM_SIZE:
			cxClient=LOWORD(lParam);
			cyClient=HIWORD(lParam);
			return 0;
		case WM_PAINT:
			hdc=BeginPaint(hwnd,&ps);

			MoveToEx(hdc,0,cyClient/2,NULL);
			LineTo(hdc,cxClient,cyClient/2);

			for(i=0;i<NUM;++i){
				apt[i].x=i*cxClient/NUM;
				apt[i].y=(int)(cyClient/2*(1-sin(TWOPI*i/NUM)));//数学不会太差都应该可以算出来

			}
			Polyline(hdc,apt,NUM);//PolyBezier(hdc,apt,NUM);

			//Rectangle(hdc,100,100,500,400); //画一个矩形
			//RoundRect(hdc,100,100,500,400,100,75);//画一个圆角矩形倒数第二个参数=(xright-xleft)/4 倒数第一参数=(buttom-top)/4
			//Ellipse(hdc,100,100,500,400);//画一个椭圆
			//Arc(hdc,100,100,500,400,300,200,400,360);//画椭圆曲线
			//Chord(hdc,100,100,500,400,300,200,400,360);//画弓形
			//Pie(hdc,100,100,500,400,300,200,400,360);//画扇形
			
			/*Rectangle(hdc,cxClient/8,cyClient/8,7*cxClient/8,7*cyClient/8);//下面这一段代码画的是什么呢?调试下吧
			MoveToEx(hdc,0,0,NULL);
			LineTo(hdc,cxClient,cyClient);

			MoveToEx(hdc,0,cyClient,NULL);
			LineTo(hdc,cxClient,0);

			Ellipse(hdc,cxClient/8,cyClient/8,7*cxClient/8,7*cyClient/8);

			RoundRect(hdc,cxClient/4,cyClient/4,3*cxClient/4,3*cyClient/4,cxClient/4,cyClient/4);*/

			

			EndPaint(hwnd,&ps);
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


其他 什么矩形,圆矩形...自己把注释去掉,自己调试吧。

下面是一个贝赛样曲线:

#include <windows.h>
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("Bezier") ;
     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 ("Program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Bezier Splines"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
     
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

void DrawBezier (HDC hdc, POINT apt[])
{
     PolyBezier (hdc, apt, 4) ;
     
     MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;
     LineTo   (hdc, apt[1].x, apt[1].y) ;
     
     MoveToEx (hdc, apt[2].x, apt[2].y, NULL) ;
     LineTo   (hdc, apt[3].x, apt[3].y) ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static POINT apt[4] ;
     HDC          hdc ;
     int          cxClient, cyClient ;
     PAINTSTRUCT  ps ;
     
     switch (message)
     {
     case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          
          apt[0].x = cxClient / 4 ;
          apt[0].y = cyClient / 2 ;
          
          apt[1].x = cxClient / 2 ;
          apt[1].y = cyClient / 4 ;
          
          apt[2].x =     cxClient / 2 ;
          apt[2].y = 3 * cyClient / 4 ;
          
          apt[3].x = 3 * cxClient / 4 ;
          apt[3].y =     cyClient / 2 ;
          
          return 0 ;

     case WM_LBUTTONDOWN:
     case WM_RBUTTONDOWN:
     case WM_MOUSEMOVE:
          if (wParam & MK_LBUTTON || wParam & MK_RBUTTON)
          {
               hdc = GetDC (hwnd) ;
               
               SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
               DrawBezier (hdc, apt) ;
               
               if (wParam & MK_LBUTTON)
               {
                    apt[1].x = LOWORD (lParam) ;
                    apt[1].y = HIWORD (lParam) ;
               }
               
               if (wParam & MK_RBUTTON)
               {
                    apt[2].x = LOWORD (lParam) ;
                    apt[2].y = HIWORD (lParam) ;
               }
               
               SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
               DrawBezier (hdc, apt) ;
               ReleaseDC (hwnd, hdc) ;
          }
          return 0 ;
          
     case WM_PAINT:
          InvalidateRect (hwnd, NULL, TRUE) ;
          
          hdc = BeginPaint (hwnd, &ps) ;
          
          DrawBezier (hdc, apt) ;
          
          EndPaint (hwnd, &ps) ;
          return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

结果如下(鼠标左键右键可以控制弧度)


分享到:
评论

相关推荐

    matlab离散点连成的两曲线的交点-intersections.m

     思路一:既然matlab曲线绘图是通过有序离散点依次连线形成,也就是说,通过“以直代曲”的过程,那么曲线交点无非就是离散点(结点)或者两线段交点。这比上面直接用交点附近的结点替代交点的方法要精确得多了。而...

    OpenGL绘制图形(包含20多个基本例子)

    OpenGL绘制图形(包含20多个基本例子)。直线,圆,椭圆,球体,曲线,曲面等基础图形的绘制。

    HTML5 canvas 绘图例子(圣诞树)

    《HTML5高级程序设计》教程中 关于讲解Canvas 的案例源代码。包括曲线,直线,阴影,渐变,画字等

    VC DrawCli氏量绘图,填充、直线等效果集

    摘要:VC/C++源码,图形处理,氏量绘图 DrawCli源码,综合了氏量绘图、画圆形、椭圆形、三角形等多种规则的图形,可填充图案、绘制直线、曲线、设置图形组合顺序等各种画图功能,确实是不错的绘图例子。

    多媒体开发与编程-于永彦-源代码

    2.8.3 一个绘制橡皮筋直线的例子 思考题 第3章 基于0penGL的图形绘制 3.1 0penGL概述 3.1.1 0penGL功能 3.1.2 0penGL特点 3.1.3 0penGL工作机理 3.1.4 0penGL基本语法 3.2 0penGL函数库 3.2.1 基本库 3.2.2...

    基于QGraphicsView实现的画图软件

    画图软件,基于QGraphicsView实现,可画直线,矩形,椭圆,圆角矩形,不规则多边形,曲线等等基本功能,并且可编辑这些图形,代码封装完毕,可简单移植到项目中使用。

    CAD计算机辅助设计.pptx.pptx

    基本绘图命令 基本绘图命令 line 直线, circle 画圆, rectang 矩形, polygen 正多边形, pline 多义线, arc 弧, ellipse 椭圆, spline 样条曲线, hatch 图案填充 其他命令 block 建块, insert 插入块 text 文本, ...

    QT 绘图函数

    QPainterPath 可以通过连接基本的图形单元元素来确定任意的矢量形状,包括:直线、椭圆、多边形、弧形、贝赛尔曲线等。 首先使用 QPainter ::moveto() 来确定图形的起点,然后通过 cubicTo() 来确定绘制的线路。前 ...

    计算机图形学王汝传1-4章课后作业参考答案.doc

    尽管显示器产生的只是 一些短直线的线段,但当直线段很短时,连成的曲线看起来还是光滑的. 描点法:把显示屏幕分成有限个可发亮的离散点,每个离散点叫做一个像素,屏幕上 由像素点组成的阵列称为光栅,曲线的绘制过程...

    Java图形填充实例.rar

    JAva对绘制出的图形进行填充的一个例子,包括了图形绘制和图形填充两个模块功能的演示,  super.paintComponent(g); //调用父类的绘制组件方法  Graphics2D g2D = (Graphics2D)g;  setBackground(Color.white)...

    visio教程PDF

    17.6.2 直线—曲线连接器 17.6.3 图形连接器 17.7 同时连接多个图形 17.8 拖动时连接图形 17.9 激活Snap&Glue工具栏 17.10 跳线与布线 17.11 小结 第18章 快速安排图形格局 18.1 快速安排图形...

    Visio 2000 技术大全

    17.6.2 直线—曲线连接器 17.6.3 图形连接器 17.7 同时连接多个图形 17.8 拖动时连接图形 17.9 激活Snap&Glue工具栏 17.10 跳线与布线 17.11 小结 第18章 快速安排图形格局 ...

    GSP5.exe

    “画线工具”有三种线段、直线和射线,选中后在绘图窗口中进行画图即。 例3 制作验证三角形的三边的垂直平分线相交于一点的课件(初步进行作图练习) 圆 画圆有3种方法 用画圆工具作圆;通过两点作圆;用圆心与半径...

    MATLAB 7_0实用指南 (上册)

    次曲面 11.2.3样条曲面 11.2.4用给定数据绘图 t12.5非均匀采样数据的曲面图 11.2.6表面图绘制的数据格式问题 11.3多边形对象模型 11.3.1patch函数 11.3.2用patch函数创建面片 11.4消隐控制...

    windows 程序设计中文版

    5.2.4 设备的尺寸 5.2.5 色彩ABC 5.2.6 设备环境属性 5.2.7 保存设备环境 5.3 点和线的绘制 5.3.1 设定像素 5.3.2 直线 5.3.3 边框绘制函数 5.3.4 贝塞尔样条曲线 5.3.5 使用现有画笔 5.3.6 创建、选择和删除画笔 ...

    VTK User's Guide(中文完整版)

    4.12 特殊绘图类-----------------------------------------------------------------------------------44 尺度棒 X-Y绘制 边界盒轴 标记数据 4.13 变换数据-----------------------------------------------...

Global site tag (gtag.js) - Google Analytics