c#画五角星

news2024/11/26 2:29:41

c#画一个五角星,最重要的就是计算哪些坐标点出来,也是最难的一部分,这要涉及到一些数学方面的知识.对数学坐标知识不是很熟的人,如果想学画图,我建议多去看一下数学书,对我们写程序的人来说是没有什么坏处可言的.

想学习的朋友可以一起学习,我觉得分享学习是一种快乐,所以把自己的一些心得分享给大家,我本人也是走了很多的弯路,所以也不希望一些朋友做一些吃力不讨好的事.

废话不多说,先看一下效果图吧:

 

 

效果还可以吧,至少长得很像五角星,当然你也可以说不像,可能我的口味和你的不同,不过我们的目的都是一样的,就是怎么算这些坐标出来并且把他画出来.

好,现在我们开始来分析问题(在此之前,我建议不懂极坐标的朋友先看看极坐标方面的一些知识,因为算法的核心问题主要在这里.):

程序分析步骤:

1.画一个五角星,需要先确定五角星的十个点,有朋友可能问:"为什么是十个点而不是五个点呢?",这种问题希望没有学过c#的人都会知道,确定一个五角星需要十个点,多边形嘛!

2.如何获得我们所需要的十个点呢?反问自己,经常反问自己可以解决很多问题.要想确定十个点,你可以观察一下图形,或自己画一下,看一下图形的特点(中心对称图形),对于中心对称图形,就可以确定其中心点,其他所有的点都是围绕着这个中心点转的,我们可以根据三个条件来确定我们想要得到的点:

  1.中心点

  2.中心点到目标点的距离

  3.目标点和X轴(水平距离)的夹角

现在我们可以写一个GetPoint的方法来获得目标点,代码如下:

/// <summary>
        /// 获得五角星的各个点
        /// </summary>
        /// <param name="ptCenter">中心点坐标</param>
        /// <param name="length">距离中心点的长度</param>
        /// <param name="angle">和水平方向的夹角</param>
        /// <returns></returns>
        public PointF GetPoint(PointF ptCenter, double length, double angle)
        {
            return new PointF(
                (float)(ptCenter.X + length * Math.Cos(angle)),
                (float)(ptCenter.Y + length * Math.Sin(angle)));
        }

 方法很简单,返回一个目标点,这个算是核心的一个方法,理解了这个方法,接下来的都迎刃而解.既然能够得到一个点当然也能够得到一系列的点,所以我们还可以写一个获得一系列点的方法GetPoints,代码如下:

/// <summary>
        /// 返回一个坐标的数组
        /// </summary>
        /// <param name="ptCenter">中心点</param>
        /// <param name="length">距离中心点的长度</param>
        /// <param name="angles">两点之间的夹角</param>
        /// <returns></returns>
        public PointF[] GetPoints(PointF ptCenter, double length, params double[] angles)
        {
            PointF[] points = new PointF[angles.Length];
            for (int i = 0; i < points.Length; i++)
            {
                points[i] = GetPoint(ptCenter,length,angles[i]);
            }
            return points;
        }

 从我们的代码中可以看到一个角度的参数(double angle),所以我们就需要确定目标点和X轴(水平距离)的夹角,我们还是让代码来说话吧!

/// <summary>
        /// 获得所有角度的数组
        /// </summary>
        /// <param name="startAngle">开始的角度</param>
        /// <param name="pointed">个数</param>
        /// <returns></returns>
        public double[] GetAngles(double startAngle,int pointed)
        {
            double[] angles = new double[pointed];
            angles[0] = startAngle;
            for (int i = 1; i < angles.Length; i++)
            {
                angles[i] =angles[i-1] + GetAngleLength(pointed);
            }
            return angles;
        }
        /// <summary>
        /// 获得角度的增量
        /// </summary>
        /// <param name="pointed"></param>
        /// <returns></returns>
        public double GetAngleLength(int pointed)
        {
            return 2*Math.PI/pointed;
        }

 

可以看到我们定义了两个方法,想要确定目标点和X轴(水平距离)的夹角,就要确定多少个角(pointed),还有你的起始角的位置(startAngle,中心点之上的那个点),然后确定角度的增量就可以计算出所有的角度了!

3.万事俱备,只欠一个DrawStar的方法,先看一下代码:

/// <summary>
        /// 画五角星
        /// </summary>
        /// <param name="pointed">多少个角</param>
        /// <param name="e">Graphics参数</param>
        public void DrawStar(int pointed,PaintEventArgs e)
        {
            Graphics g = e.Graphics;//建立一个画布
            g.CompositingQuality = CompositingQuality.HighQuality;//设置图像呈现的质量
            g.SmoothingMode = SmoothingMode.HighQuality;//对图片进行平滑处理
            Pen p = new Pen(Color.Red);//画笔的颜色
            double[] angles1 = GetAngles(-Math.PI / 2, pointed);//五角星外围的点角度的一个数组
            double[] angles2 = GetAngles(-Math.PI / 2+Math.PI/pointed, pointed);//五角星内围的点角度的一个数组
            PointF[] points1 = GetPoints(new PointF(300, 300), 100, angles1);//五角星外围的点的一个数组
            PointF[] points2 = GetPoints(new PointF(300, 300), 50, angles2);//五角星内围的点的一个数组
            PointF[] points = new PointF[points1.Length+points2.Length];//最终合成多边形所有点的数组
            for (int i = 0,j=0; i < points.Length; i+=2,j++)
            {
                points[i] = points1[j];
                points[i + 1] = points2[j];
            }
            g.DrawPolygon(p,points);//画一个多边形
            g.FillPolygon(Brushes.Aqua,points);//填充颜色
        }

 

这个方法也没有什么好说的,就是c#一些常用的方法,上面本人也有注解!

我也就不解释那么多了,相信你自己能够看得懂!

其实上面的代码不只是可以画五角星,只要改一下六角,七角,八角,你喜欢的话一百角都行!看一下效果图吧!

 

 

 接下来一个一百角的,当然看起来更像一个太阳,根据自己的喜好吧!

 

 

Ok!写完,本人写作水平和表达能力有点菜,有不足之处希望大家谅解!也希望对各位朋友有所帮助!

完整源代码:

public class 五角星
    {
        /// <summary>
        /// 画五角星
        /// </summary>
        /// <param name="pointed">多少个角</param>
        /// <param name="e">Graphics参数</param>
        public void DrawStar(int pointed,Graphics g)
        {
            g.CompositingQuality = CompositingQuality.HighQuality;//设置图像呈现的质量
            g.SmoothingMode = SmoothingMode.HighQuality;//对图片进行平滑处理
            Pen p = new Pen(Color.Red);//画笔的颜色
            double[] angles1 = GetAngles(-Math.PI / 2, pointed);//五角星外围的点角度的一个数组
            double[] angles2 = GetAngles(-Math.PI / 2+Math.PI/pointed, pointed);//五角星内围的点角度的一个数组
            PointF[] points1 = GetPoints(new PointF(300, 300), 100, angles1);//五角星外围的点的一个数组
            PointF[] points2 = GetPoints(new PointF(300, 300), 50, angles2);//五角星内围的点的一个数组
            PointF[] points = new PointF[points1.Length+points2.Length];//最终合成多边形所有点的数组
            for (int i = 0,j=0; i < points.Length; i+=2,j++)
            {
                points[i] = points1[j];
                points[i + 1] = points2[j];
            }
            g.DrawPolygon(p,points);//画一个多边形
            g.FillPolygon(Brushes.Aqua,points);//填充颜色
        }
        /// <summary>
        /// 获得所有角度的数组
        /// </summary>
        /// <param name="startAngle">开始的角度</param>
        /// <param name="pointed">个数</param>
        /// <returns></returns>
        public double[] GetAngles(double startAngle,int pointed)
        {
            double[] angles = new double[pointed];
            angles[0] = startAngle;
            for (int i = 1; i < angles.Length; i++)
            {
                angles[i] =angles[i-1] + GetAngleLength(pointed);
            }
            return angles;
        }
        /// <summary>
        /// 获得角度的增量
        /// </summary>
        /// <param name="pointed"></param>
        /// <returns></returns>
        public double GetAngleLength(int pointed)
        {
            return 2*Math.PI/pointed;
        }


        /// <summary>
        /// 获得五角星的各个点
        /// </summary>
        /// <param name="ptCenter">中心点坐标</param>
        /// <param name="length">距离中心点的长度</param>
        /// <param name="angle">和水平方向的夹角</param>
        /// <returns></returns>
        public PointF GetPoint(PointF ptCenter, double length, double angle)
        {
            return new PointF(
                (float)(ptCenter.X + length * Math.Cos(angle)),
                (float)(ptCenter.Y + length * Math.Sin(angle)));
        }
        /// <summary>
        /// 返回一个坐标的数组
        /// </summary>
        /// <param name="ptCenter">中心点</param>
        /// <param name="length">距离中心点的长度</param>
        /// <param name="angles">两点之间的夹角</param>
        /// <returns></returns>
        public PointF[] GetPoints(PointF ptCenter, double length, params double[] angles)
        {
            PointF[] points = new PointF[angles.Length];
            for (int i = 0; i < points.Length; i++)
            {
                points[i] = GetPoint(ptCenter,length,angles[i]);
            }
            return points;
        }
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql主从工作原理、搭建

目录 一、mysql为什么要用主从架构&#xff1f; 二、mysql数据库主从复制原理是什么&#xff1f; 详细的主从复制过程如下图&#xff1a; 主从复制过程概述&#xff1a; 三、mysql主从如何搭建&#xff1f; 本次安装的数据库版本为mysql5.7 1、准备两台服务器&#xff08…

C++ 设计模式 —— 组合模式

C 设计模式 —— 组合模式 0. 引用连接 本文主要的思路和代码&#xff0c;来自于对以下连接的学习和实现&#xff1a; 组合模式 1. 引言 1.1 什么是组合模式&#xff1f; 组合模式的定义组合模式的作用 组合模式是一种行为型设计模式&#xff0c;它将对象组合成树形结构以…

解决react使用css module无法重写bootstrap样式的问题

react使用css module虽然能够解决样式污染&#xff0c;但是同时也失去了写css样式的灵活性&#xff0c;特别是&#xff1a;在.module.css文件中当子元素是非变量的静态class类&#xff08;比如bootstrap&#xff09;, 此时使用css选择器对该子元素的样式不会起作用的 比如下面…

【干货】VS2017简介、编译、启动单项目和启动多项目

1. VS2017简单介绍 解决方案和项目的区别&#xff1a; 一般一个解决方案会有多个项目&#xff0c;一个项目里面一般只有一个main文件&#xff0c;所以需要右键单击某个项目将其设置成启动项目&#xff0c;才可以启动该项目。 2. 编译github的代码仓 一般都会有CMakeLists.t…

《C++ Primer》练习9.43-练习9.46:替换字符串简写和插入前后缀

文章目录 练习9.43练习9.44练习9.45练习9.46总结参考 练习9.43 练习9.43要替换字符串s中所有oldVal为newVal&#xff0c;要求使用迭代器和insert以及erase函数。 #include <iostream> #include <string> #include <vector> using namespace std;string &a…

ubuntu下yolov5 tensorrt模型部署

文章目录 ubuntu下yolov5 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov5源码中导出onnx文…

【IDEA项目个别类爆红,但是项目可以正常运行】

打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因&#xff1a;Idea本身的问题&#xff0c;可能是其缓存问题&#xff0c;导致爆红 解决方案&#xff1a;重置Idea 很多时候排查不出代码问题&#xff0c;就尝试一下此操作。 选择目录&#xff1a;File–>Invalida…

前后端分离项目-基于springboot+vue的高校学科竞赛平台的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

node.js+NPM包管理器+Webpack打包工具+前端项目搭建

javascript运行环境&#xff08;无需依赖html文件&#xff09; BFF&#xff0c;服务于前端的后端 官网下载安装&#xff0c;node -v查看是否安装成功 ①、创建一个01.js文件 //引入http模块 const httprequire(http)//创建服务器 http.createServer(function(request,respo…

微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式

智慧工地围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效. 智慧工地综合管理云平台源码&#xff0c;PC监管端、项目端&#xff1b;APP监管端、项目端、数据可视化大屏端源码&#xf…

css案例:取消组件的阴影

点击的时候会出现阴影&#xff0c;取消阴影操作&#xff1a; .el-radio__input.is-checked{.el-radio__inner{box-shadow:0 0 0 0!important;}}有的时候取消阴影的css不起作用是权限问题&#xff0c;加上!important 就好了。

Ps:选区的布尔运算

选区的布尔 Boolean运算指的是选区之间的相加&#xff08;并集&#xff09;、相减&#xff08;差集&#xff09;以及相交&#xff08;交集&#xff09;&#xff0c;从而形成一个新的选区。 ◆ ◆ ◆ 使用工具选项栏 在 Ps 中&#xff0c;几乎所有的选区工具的工具选项栏上都有…

php新手实战:自定义书源下载api

网上有很多第三方小说网站提供小说下载&#xff0c;而下载的过程无非就是搜索书籍&#xff0c;然后找到下载链接点击下载即可。只是类似这种“良心”的小说网站实在是太少。大多数仅支持在线阅读。而如今&#xff0c;我却要利用这种为数不多的“良心”小说站点提供的书源来作为…

Eureka添加@Loadbalanced 报错 No instances available for XXXXX

错误显示为 错误信息是:没有可用的实例 我就比较惊讶 我已经添加了Loadbalanced 同时将RestTemplate注册到spring容器中了 为什么还会出现没有实例.. 下面是代码 仔细检查了代码发现没什么错误之后 检查了一下 xml文件,发现里面的 应用名称与访问时参数一致.这个时候就陷…

Elasticsearch:使用 LangChain 对话链和 OpenAI 的聊天机器人

在此笔记本中&#xff0c;我们将构建一个聊天机器人&#xff0c;它可以回答有关自定义数据的问题&#xff0c;例如雇主的政策。 聊天机器人使用 LangChain 的 ConversationalRetrievalChain&#xff0c;具有以下功能&#xff1a; 用自然语言回答问题在 Elasticsearch 中运行混…

Postman持久化保存/设置断言详解

postman持久化保存 1、点击postman的Collections页签&#xff0c;点击 New Collection创建&#xff08;可以当成项 目并重命名&#xff09; 2、新增后&#xff0c;再点击Collection中的“ ... ” &#xff0c;然后点击“Add Folder”&#xff0c;新建一个文件 夹&#xff08…

是否拥有具身智能,是扫地机器人能否打破“内卷”的关键

如果你关注2023世界人工智能大会等行业峰会&#xff0c;以及英伟达、微软、谷歌、特斯拉和国內科技大厂的最新发布会&#xff0c;除了“大模型”&#xff0c;应该会听到另一个高频词——具身智能。 所谓具身智能Embodied AI &#xff0c;指的是有身体并支持物理交互的智能体。这…

【计网】傻瓜式安装cpolar内网穿透

目录 一、注册账户 二、下载安装包 三、安装 四、查看AuthToken 五、简单使用 如果在本机部署项目外网是访问不到的&#xff0c;通过内网穿透就可以使本机部署的项目可被外网访问 一、注册账户 cpolar - secure introspectable tunnels to localhostcpolar secure intro…

3. Windows下C++/MFC调用hiredis库操作redis示例

一、头文件目录 将之前下载和编译好的Redis目录拷贝到新建好的工程目录下面&#xff0c;再点击测试工程的右键/属性&#xff0c;点击C/常规&#xff0c;附加包含目录添加以下路径&#xff0c;注意如果原先有多个路径&#xff0c;在末尾处添加分号后再粘贴&#xff1a; 点击C/常…

谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

有一个5*5的网格&#xff0c;其中恰好有一个格子是空的&#xff0c;其他格子各有一个字母。一共有4种指令&#xff1a;A, B, L, R&#xff0c;分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列&#xff08;以数字0结束&#xff09;&#xff0c;输出指…