MFC图形函数学习09——画多边形函数

devtools/2024/11/20 9:03:24/

       这里所说的多边形是指在同一平面中由多条边构成的封闭图形,强调封闭二字,否则无法进行颜色填充,多边形包括凸多边形和凹多边形。
一、绘制多边形函数
       原型:BOOL Polygon(LPPOINT lpPoints,int nCount);
       参数:LPPOINT lpPoints是由POINT结构体或CPoint对象组成的数组(指针)
                  nCount是数组中顶点的个数
       返回值:绘制成功返回非0数,失败返回0
       说明:
        a.POINT或CPoint数组中每个成员代表多边形的一个顶点;数组成员的顺序即为多边形顶点之间连线顺序,最末一个点与第一个点相连。
        b.当参数2标明的顶点个数少于数组成员个数时,多出来的数组成员将不起作用。
        c.由数组成员构成的多边形顶点不一定都位于图形的顶点位置,也可能在直线上。
        d.Polygon函数是CDC类成员函数,使用时需要CDC类对象或指针调用。
二、多边形颜色填充模式函数
       原型:int SetPolyFillMode(int nPolyFillMode);
       参数:nPolyFillMode有两个值:ALTERNATE(值=1)和WINDING(值=2),默认ALTERNATE。
       返回值:设置成功返回原填充模式;失败返回0。
       说明:
         a.ALTERNATE含义:该模式使用水平扫描线,遇到交点1开始填充,遇到交点2结束填充,接下来遇到交点3继续填充,遇到交点4结束填充,即奇数交点填充开始,偶数交点填充结束。
         b.WINDING含义:该模式扫描线从图形内部向外发射,环绕图形,遇到顺时针绘制的边时计数器加1,遇到逆时针绘制的边时计数器减1,计数器不为0时进行填充。
         c.这个函数也是CDC类的成员函数,使用时需要CDC类对象或指针调用。
         d.案例程序中绘制五角星时使用这个函数进行了填充模式的设置;如不设置的话,中心位置不会进行填充,红色五角星中心会有一块白色区域。结合案例,体会一下WINDING的含义。
三、获取像素点颜色函数
       获取颜色值函数使得我们不必自己定义颜色,而是通过函数获取某一坐标点的颜色值,供绘图使用。
       原型:COLORREF GetPixel(int x,int y) const;
                  COLORREF GetPixel(POINT point) const; 
       参数:int x,int y 拟获取颜色值的坐标点
                  POINT point 用POINT结构体对象表示的坐标点
       返回:获取成功,返回RGB颜色值,需使用COLORREF对象接收;否则返回-1。
       说明:GetPixel函数是CDC类的成员函数,使用时需要CDC类对象或指针调用。
四、绘制多边形案例程序
       利用绘制多边形函数Polygon在自定义坐标系中:沿窗口中心将窗口分为左右两半。(一)在左半边绘制一个的外接圆直径为窗口高度和左半边宽度较小者的80%正五边形,要求正五边形的一个顶点在Y轴的正方向上,正五边形填充红色,边框线型实线、宽度4像素、颜色蓝色。(二)通过隔点连线的方法将正五边形改成五角星,五角星的填充色及边框颜色均为红色,大小及位置与左边图型对称。
       代码及注释如下:

//一、自定义坐标系CRect rect;//定义CRect类对象,这里如果不是取名rect,后边也要相应更改GetClientRect(rect);//将窗口客户区位置、大小信息保存到rect中pDC->SetMapMode(MM_ANISOTROPIC); //模式选择:自定义坐标系pDC->SetWindowExt(rect.Width(), rect.Height()); //设置逻辑窗口尺寸pDC->SetViewportExt(rect.Width(), -rect.Height()); //设置窗口物理尺寸pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//设置原点rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//重置rect的位置	
//二、在窗口左边绘制正五边形#define PI 3.14159int X0 = -rect.Width() / 4; //正五边形顶点内接圆圆心坐标int Y0 = 0;int r = min(rect.Height(), rect.Width() / 2) * 0.8 / 2;//正五边形外接圆半径int x0 = X0, y0 = Y0+r; //正Y方向五边形顶点坐标(第一顶点)int x1 = X0 - r * cos(PI / 2 - PI * 2 / 5), y1 = Y0+r * sin(PI / 2 - PI * 2 / 5); //逆时针第二点int x2 = X0 - r * cos(2 * PI * 2 / 5 - PI / 2), y2 = Y0 - r * sin(2 * PI * 2 / 5 - PI / 2); //逆时针第三点int x3 = X0 + r * cos(3 * PI / 2 - 3 * PI * 2 / 5), y3 = Y0 - r * sin(3 * PI / 2 - 3 * PI * 2 / 5); //逆时针第三点int x4 = X0 + r * cos(PI / 2 - PI * 2 / 5), y4 = Y0 + r * sin(PI / 2 - PI * 2 / 5);//逆时针第五点POINT pentagon[5]; //声明POINT数组pentagon[0].x = x0; pentagon[0].y = y0; //为数组赋值(数组顺序与顶点顺序一致)pentagon[1].x = x1; pentagon[1].y = y1;pentagon[2].x = x2; pentagon[2].y = y2;pentagon[3].x = x3; pentagon[3].y = y3;pentagon[4].x = x4; pentagon[4].y = y4;CPen bluePen(PS_SOLID, 4, 0xff0000); //生成蓝色画笔CPen* oldPen=pDC->SelectObject(&bluePen);//将画笔选入CDCCBrush redBrush(0x0000ff);//生成红色画刷CBrush* oldBrush = pDC->SelectObject(&redBrush);//选入画刷pDC->Polygon(pentagon,5); //绘制五边形pDC->SelectObject(oldPen); //恢复默认画笔
//三、在窗口右边绘制五角星X0 = rect.Width() / 4; //五角星顶点内接圆圆心坐标Y0 = 0;r = min(rect.Height(), rect.Width() / 2) * 0.8 / 2;//正五边形外接圆半径x0 = X0, y0 = Y0 + r; //正Y方向五角星顶点坐标(第一顶点)x1 = X0 - r * cos(PI / 2 - PI * 2 / 5), y1 = Y0 + r * sin(PI / 2 - PI * 2 / 5); //逆时针第二顶点x2 = X0 - r * cos(2 * PI * 2 / 5 - PI / 2), y2 = Y0 - r * sin(2 * PI * 2 / 5 - PI / 2);//逆时针第三顶点x3 = X0 + r * cos(3 * PI / 2 - 3 * PI * 2 / 5), y3 = Y0 - r * sin(3 * PI / 2 - 3 * PI * 2 / 5);//逆时针第四顶点x4 = X0 + r * cos(PI / 2 - PI * 2 / 5), y4 = Y0 + r * sin(PI / 2 - PI * 2 / 5);//逆时针第五顶点pentagon[0].x = x0; pentagon[0].y = y0; //按照隔点连线给数组赋值pentagon[1].x = x2; pentagon[1].y = y2; //数组下标:0  1  2  3  4pentagon[2].x = x4; pentagon[2].y = y4; //顶点位置:一 三 五 二 四(从一开始,与坐标下标差1) pentagon[3].x = x1; pentagon[3].y = y1;pentagon[4].x = x3; pentagon[4].y = y3;COLORREF color=pDC->GetPixel(-rect.Width() / 4, 0); //获得正五边形中心颜色值CPen redPen(PS_SOLID, 4, color);oldPen = pDC->SelectObject(&redPen);pDC->SetPolyFillMode(WINDING); //此处如不进行填充设置,五角星中间仍是白色pDC->Polygon(pentagon, 5); //绘制五角星pDC->SelectObject(oldPen); //恢复默认画笔pDC->SelectObject(oldBrush); //恢复默认画刷

运行结果1(五角星填充模式WINDING)

运行结果2(五角星填充模式:ALTERNATE)


http://www.ppmy.cn/devtools/135433.html

相关文章

研究一下前端列表分页列表数据是怎么传给后端的 后端又是如何处理的

前端表单呈现 我们在前端是用的组件化编程 直接用组件绑定的数据结构 我们在vue里面是绑定的这个表单 searchParams 这个searchParams是定义成一个对象 ref 是 vue中一种灵活绑定数据的方式 我们在官方文档中查看 接下来我们查看一下searchParams对象 const searchParams …

计算机视觉(CV):让机器看懂世界

引言 计算机视觉(Computer Vision, CV)是人工智能的重要领域,致力于让机器能够“看懂”世界。CV技术广泛应用于自动驾驶、医疗影像、安防监控和娱乐领域,正在改变我们的生活方式。 本文将从基本概念、技术方法、应用场景和发展方向…

【高阶数据结构】B树

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是B树,并能简单的模拟实现。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…

计算机组成与原理(2) basic of computer architecture

Instruction Set Architecture (ISA) 和 Hardware System Architecture (HSA) 是计算机体系结构中两个重要的层次,它们各自的职责和作用如下: Instruction Set Architecture (ISA) 定义 ISA是指令集体系结构,是硬件和软件之间的接口。它定义…

移远通信5G RedCap模组RG255C-CN通过中国电信5G Inside终端生态认证

近日,移远通信5G RedCap模组RG255C-CN荣获中国电信颁发的5G Inside终端生态认证证书。这表明,该产品在5G基本性能、网络兼容性、安全特性等方面已经过严格评测且表现优异,将进一步加速推动5G行业终端规模化应用。 中国电信5G Inside终端生态认…

CSS常用尺寸单位有哪些?应用场景?

CSS常用尺寸单位有哪些?应用场景? 像素(px): 应用场景: 用于定义非常具体的屏幕尺寸,尤其是当需要精确控制元素大小时。常用于网页设计中的图像尺寸、字体大小和边框宽度。 百分比(%): 应用场景…

idea关于git插件操作

idea关于git插件操作 一、获取所有的分支列表 二、切换分支 找到要拉取的分支,右键,选择CheckOut,拉取分支代码 三、分支代码合并 例如要将cpq-v4.0.0的代码合并到cpq-v4.1.1的代码上 首先要将代码切换到cpq-v4.1.1上 然后选中要同步代码的分支,cpq-v4.0.0,右键 选中Mer…