MFC图形函数学习09——画多边形函数
这里所说的多边形是指在同一平面中由多条边构成的封闭图形,强调封闭二字,否则无法进行颜色填充,多边形包括凸多边形和凹多边形。
一、绘制多边形函数
原型: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)

相关文章:
MFC图形函数学习09——画多边形函数
这里所说的多边形是指在同一平面中由多条边构成的封闭图形,强调封闭二字,否则无法进行颜色填充,多边形包括凸多边形和凹多边形。 一、绘制多边形函数 原型:BOOL Polygon(LPPOINT lpPoints,int nCount); 参数&#x…...
GaussianDreamer: Fast Generation from Text to 3D Gaussians——点云论文阅读(11)
此内容是论文总结,重点看思路!! 文章概述 本文提出了一种快速从文本生成3D资产的新方法,通过结合3D高斯点表示、3D扩散模型和2D扩散模型的优势,实现了高效生成。该方法利用3D扩散模型生成初始几何,通过噪声…...
k8s篇之控制器类型以及各自的适用场景
1. k8s中控制器介绍 在 Kubernetes 中,控制器(Controller)是集群中用于管理资源的关键组件。 它们的核心作用是确保集群中的资源状态符合用户的期望,并在需要时自动进行调整。 Kubernetes 提供了多种不同类型的控制器,每种控制器都有其独特的功能和应用场景。 2. 常见的…...
Node.js 笔记(一):express路由
代码 建立app.js文件,代码如下: const express require(express) const app express() const port 3002app.get(/,(req,res)>{res.send(hello world!)})app.listen(port,()>{console.log(sever is running on http://localhost:${port}) })问…...
bash笔记
0 $0 是脚本的名称,$# 是传入的参数数量,$1 是第一个参数,$BOOK_ID 是变量BOOK_ID的内容 1 -echo用于在命令窗口输出信息 -$():是命令替换的语法。$(...) 会执行括号内的命令,并将其输出捕获为一个字符串ÿ…...
mongoDB副本集搭建-docker
MongoDB副本集搭建-docker 注:在进行副本集搭建前,请先将服务部署docker环境并正常运行。 #通过--platform指定下载镜像的系统架构 在这我用的是mongo:4.0.28版本 arm64系统架构的mongo镜像 docker pull --platformlinux/arm64 mongo:4.0.2#查看镜像是…...
Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能
Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能 引言 在现代 web 开发中,RESTful API 已成为应用程序之间进行通信的标准方式。Python 提供了多种框架来帮助开发者快速搭建 RESTful API 服务,其中 Flask 和 FastAPI 是最受欢迎的两个框架。本…...
CentOS操作系统下安装Nacos
CentOS下安装Nacos 前言 这在Centos下安装配置Nacos 下载Linux版Nacos 首先到Nacos的 Github页面,找到所需要安装的版本 也可以右键复制到链接,然后通过wget命令进行下载 wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-ser…...
C++设计模式之适配器模式与桥接模式,装饰器模式及代理模式相似点与不同点
适配器模式、桥接模式、装饰器模式和代理模式在形式上有一些相似之处,因为它们都涉及到对类的功能或接口的修改、增强或转换。然而,它们在动机和目的上有着显著的不同。以下是对这些模式相似点和不同点的清晰说明: 相似点: 结构…...
ThreadLocal 和 Caffeine 缓存是两种不同的缓存机制,它们在用途和实现上有明显的区别
ThreadLocal 和 Caffeine 缓存是两种不同的缓存机制,它们在用途和实现上有明显的区别: ThreadLocal 缓存: ThreadLocal 提供了线程局部变量的功能,每个线程可以访问自己的局部变量,而不会与其他线程冲突。ThreadLocal …...
Django实现智能问答助手-进一步完善
扩展 增加问答数据库,通过 Django Admin 添加问题和答案。实现更复杂的问答逻辑,比如使用自然语言处理(NLP)库。使用前端框架(如 Bootstrap)增强用户界面 1.注册模型到 Django Admin(admin.py…...
【Linux】开发工具make/Makefile、进度条小程序
Linux 1.make/Makefile1.什么是make和Makefile?2.stat命令3.Makefile单个文件的写法4.Makefile多个文件的写法 2.进度条1.回车\r、换行\n2.缓冲区3.进度条1.倒计时程序2.进度条程序 1.make/Makefile 1.什么是make和Makefile? 一个工程中的源文件不计其…...
深度学习三大框架对比与实战:PyTorch、TensorFlow 和 Keras 全面解析
深度学习框架的对比与实践 引言 在当今深度学习领域,PyTorch、TensorFlow 和 Keras 是三大主流框架。它们各具特色,分别满足从研究到工业部署的多种需求。本文将通过清晰的对比和代码实例,帮助你了解这些框架的核心特点以及实际应用。 1. 深…...
Leetcode206.反转链表(HOT100)
链接: 我的代码: class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* p head;ListNode*res new ListNode(-1);while(p){ListNode*k res->next;res->next p;p p->next;res->next->next k;}return res->…...
怎么做好白盒测试?
白盒测试 一、什么是白盒测试?二、白盒测试特点三、白盒测试的设计方法1、逻辑覆盖法1、测试设计方法—语句覆盖a、用例设计如下:b、语句覆盖的局限性 2、测试设计方法—判定覆盖a、测试用例如下:b、判定覆盖的局限性 3、测试设计方法—条件覆…...
【神经网络基础】
神经网络基础 1.损失函数1.损失函数的概念2.分类任务损失函数-多分类损失:3.分类任务损失函数-二分类损失:4.回归任务损失函数计算-MAE损失5.回归任务损失函数-MSE损失6.回归任务损失函数-Smooth L1损失 2.网络优化方法1.梯度下降算法2.反向传播算法(BP算法)3.梯度下降优化方法…...
实战 | C#中使用YoloV8和OpenCvSharp实现目标检测 (步骤 + 源码)
导 读 本文主要介绍在C#中使用YoloV8实现目标检测,并给详细步骤和代码。 详细步骤 【1】环境和依赖项。 需先安装VS2022最新版,.NetFramework8.0,然后新建项目,nuget安装 YoloSharp,YoloSharp介绍: https://github.com/dme-compunet/YoloSharp 最新版6.0.1,本文…...
debian 如何进入root
debian root默认密码, 在Debian系统中,安装完成后,默认情况下root账户是没有密码的。 你可以通过以下步骤来设置或更改root密码: 1.打开终端。 2.输入 sudo passwd root 命令。 3.当提示输入新的root密码时,输入你想要的密码…...
短视频矩阵系统:智能批量剪辑、账号管理新纪元!
在当今快节奏的数字化时代,短视频已经成为人们获取信息和娱乐的主要途径。 然而,对于创作者和企业来说,如何高效地管理多个短视频账号并保持内容的质量和一致性,成为了一个令人头疼的问题。 短视频矩阵系统就是为了解决这一难题…...
【SpringMVC - 1】基本介绍+快速入门+图文解析SpringMVC执行流程
目录 1.Spring MVC的基本介绍 2.大致分析SpringMVC工作流程 3.SpringMVC的快速入门 首先大家先自行配置一个Tomcat 文件的配置 配置 WEB-INF/web.xml 创建web/login.jsp 创建com.ygd.web.UserServlet控制类 创建src下的applicationContext.xml文件 重点的注意事项和说明…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
