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

WINDING方式不能填充所有内部区域的图形的例子

 
阅读更多

Polygon函数和多边形填充模式:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static int cxChar,cxCaps,cyChar,cxClient,cyClient;
	 TCHAR szBuffer[10];
	 HDC hdc;
	 int i;
	 RECT rect;
	 PAINTSTRUCT ps;
	 TEXTMETRIC tm;
	 HPEN hPen;
	 HPEN hPen1,hPen2,hPen3;
	 LOGPEN logpen;
	 HBRUSH hbrush;
	int x,y;
	POINT apt[10];
	static POINT aptFigure[10]={10,70,50,70,50,10,90,10,90,50,
								30,50,30,90,70,90,70,30,10,30};
	 switch(message){
		case WM_CREATE:
			hdc=GetDC(hwnd);
			GetTextMetrics(hdc,&tm);
			cxChar=tm.tmAveCharWidth;
			cxCaps=(tm.tmPitchAndFamily&1?3:2)*cxChar/2;
			cyChar=tm.tmHeight+tm.tmExternalLeading;
			
			ReleaseDC(hwnd,hdc);
			return 0;
		case WM_SIZE:
				cxClient=LOWORD(lParam);
				cyClient=HIWORD(lParam);
				return 0;
		case WM_PAINT:
			hdc=BeginPaint(hwnd,&ps);
			//GetClientRect(hwnd,&rect);
			
			/*SetBkColor(hdc,RGB(255,0,0));
			SetBkMode(hdc,TRANSPARENT);
			SetBkMode(hdc,OPAQUE);
			hPen=CreatePen(PS_DOT,1,0);
			SelectObject(hdc,hPen);
			Rectangle(hdc,100,100,300,200);*/
			
			/*hbrush=(HBRUSH)GetStockObject(GRAY_BRUSH);
			SelectObject(hdc,hbrush);
			SelectObject(hdc,GetStockObject(NULL_PEN));
			Rectangle(hdc,120,120,220,220);
			Rectangle(hdc,100,100,200,200);
			Ellipse(hdc,500,500,300,200);*/

			SelectObject(hdc,GetStockObject(GRAY_BRUSH));
			for(i=0;i<10;++i){
				apt[i].x=cxClient*aptFigure[i].x/200;
				apt[i].y=cyClient*aptFigure[i].y/100;
			}

			SetPolyFillMode(hdc,ALTERNATE);
			Polygon(hdc,apt,10);

			for(i=0;i<10;++i){
				apt[i].x+=cxClient/2;
			}

			SetPolyFillMode(hdc,WINDING);
			Polygon(hdc,apt,10);


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


分享到:
评论

相关推荐

    图形学填充算法

    在计算机图形学中,填充算法是一项关键的技术,用于将用户绘制的二维图形内部填充成特定的颜色或图案。这里我们主要探讨的是如何利用Microsoft Foundation Classes (MFC) 库来实现这个功能。MFC 是 Microsoft 提供的...

    计算机图形多边形的画法和填充

    3. 非归零规则(Non-Zero Winding Rule)和偶数规则(Even-Odd Rule):这两种方法用于判断点是否在多边形内部,是实现多边形边缘的重要策略。 二、多边形填充 填充多边形主要有以下几种算法: 1. 深度优先搜索...

    QT实现多边形填充算法

    在计算机图形学中,多边形填充是一种基本的算法,用于在屏幕上绘制封闭的多边形内部区域。QT是一个流行的跨平台应用程序开发框架,它提供了丰富的图形用户界面(GUI)功能,包括支持自定义图形绘制。本文将详细介绍...

    种子填充多边形

    种子填充,也称为扫描线填充或区域填充,是计算机图形学中的一个重要概念,主要用于在屏幕上绘制闭合图形,如多边形。这个算法通常应用于图像处理、计算机绘图软件和游戏开发等领域。在这个过程中,一个或多个人工...

    多边形边缘填充算法 计算机图形学 案例代码

    这种算法通常用于填充内部像素,使得多边形看起来更加完整和连续。有几种经典的填充算法,其中包括扫描线算法、 Flood Fill 和 DDA(Digital Differential Analyzer)等。 1. 扫描线算法:这是一种基于逐行填充的...

    图形学实验三多边形填充(源码+文档)

    5. **填充规则**:学习不同的填充规则,如非零环绕规则(Non-zero winding rule)和奇偶规则(Even-Odd rule),以确定像素是否位于多边形内部。 6. **优化**:探讨如何通过优化算法来提高填充速度,例如使用...

    扫描线填充程序

    扫描线填充算法是一种在计算机图形学中用于填充二维图形内部区域的方法。在计算机屏幕上,图形通常由像素点组成,而扫描线填充就是通过水平线(扫描线)来追踪图形内部的像素,从而达到填充效果。这种方法广泛应用于...

    多边形填充

    在计算机图形学中,"多边形填充"是一项基本且重要的技术,用于在屏幕上渲染具有内部颜色的多边形。这种技术广泛应用于游戏开发、3D建模、图像处理等领域。在C++编程环境中实现多边形填充,需要对算法有深入的理解...

    图形函数库,绘制直线段、任意圆弧、椭圆弧、多边形区域的颜色填充和阴影填充,仅调用画点函数

    4. **颜色填充多边形区域**:通常采用扫描线填充算法,如Flood Fill或Winding Number Rule。Flood Fill从一个种子点开始,沿着相邻像素的颜色边界扩散,直到整个区域被填满。Winding Number Rule则通过计算每一点到...

    MFC画直线、圆、椭圆、矩形、填充等

    - `SetPolyFillMode`可以改变填充规则,如WINDING和ALTERNATE。 - `IntersectClipRect`和`ExcludeClipRect`可用于限制绘图区域。 通过这些基本的绘图函数,你可以结合MFC的事件处理机制,在窗口上响应用户的交互...

    多边形扫描填充算法 用数字填充

    在计算机图形学中,多边形扫描填充算法是一种常见的技术,用于在屏幕上或者图像中以数字形式填充一个闭合的多边形区域。这个过程通常分为几个关键步骤,包括边界框计算、扫描线处理和像素填充。下面我们将详细探讨...

    c# .net 实现任意多边形的泛洪填充

    在C# .NET环境下,实现任意多边形的泛洪填充是一项常见的图形处理任务,它涉及到计算机图形学和算法设计。泛洪填充是一种图像处理技术,用于将...通过理解和应用这些知识点,我们可以创建一个功能完备的图形填充工具。

    计算机图形学实验二多边形有效边表填充算法

    7. 继续扫描:直到扫描线达到屏幕的顶部,填充所有多边形。 在实验中,你可能会使用C++或类似语言编写代码,并用Debug模式运行程序来测试和调试算法。Test.sln可能是Visual Studio的解决方案文件,.vs是VS的工作区...

    判断点在地图闭合区域内还是外算法

    在GIS(地理信息系统)和计算机图形学中,判断一个点是否位于地图闭合区域内的算法是十分关键的。这个算法通常被应用于各种场景,比如地图应用中的定位、碰撞检测、地理围栏等。这里我们将详细探讨这个算法的核心...

    多边形填充软件

    总的来说,这款基于MFC的多边形填充软件融合了计算机图形学的基本理论与实践,通过提供直观的用户交互方式,让非专业人士也能轻松理解和应用多边形填充算法。对于学习计算机图形学或者进行图形相关开发的人员来说,...

    计算机图形学课后作业

    还有其他算法如Even-Odd Rule或Winding Number Rule来判断点是否在多边形内部,以决定是否填充该点。 4. **线段裁剪**:线段裁剪是图形学中的重要部分,通常用于处理视口限制或图形的可见性。Sutherland-Hodgman...

    aa.rar_扫描线填充

    在计算机图形学中,扫描线填充是一种常见的用于绘制多边形内部的方法,它基于二维坐标系统中的水平线(扫描线)来完成填充任务。这个过程可以被广泛应用于各种图形用户界面、图像处理软件以及游戏开发中。"aa.rar_...

    判断一个点是否在封闭图形区域内.zip

    4. **像素填充算法**:在像素级别的图像处理中,可以使用Bresenham线算法或扫描转换算法,结合颜色填充来判断点是否在图形内部。 5. **OpenGL/图形库支持**:在更高级别的图形编程中,如使用OpenGL或其他图形库,...

    改进的有效边表算法--计算机图形学

    对于标签中提到的“区域填充”,这通常指的是根据某种规则(如非零 winding rule 或者evenodd rule)对图形内部进行像素填充,以区分图形与背景。 至于压缩包内的"RegionFill"文件,这很可能是包含实现该算法的源...

    【Qt】2D绘图之填充规则.rar

    当从一个点出发,沿着图形的边沿移动,如果经过的边的数量的奇偶性不为零,那么这个点就被认为在填充区域内。例如,一个简单的三角形,无论它的边如何曲折,只要起点和终点之间的边数量不同,就会被填充。 2. 偶数...

Global site tag (gtag.js) - Google Analytics