当前位置: 首页 > news >正文

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用于在命令窗口输出信息 -$():是命令替换的语法。$(...) 会执行括号内的命令,并将其输出捕获为一个字符串&#xff…...

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文件 重点的注意事项和说明…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

uniapp中使用aixos 报错

问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...