C# Winform自制多轴力臂(简单易懂,方便扩展)

news2024/11/15 7:52:57

      WinForms框架广泛应用于上位机开发领域,其中对力臂的精准控制是常见需求之一。本文深入探讨了如何创建自定义的多轴力臂图形控件,不仅涵盖了力臂图形控件的角度调节机制,还详细展示了如何实现力臂运动的生动动态效果,为开发者提供了一套高效、直观的力臂控制解决方案。

通过本文,您将学习到:

  • 如何设计并实现一个功能全面的多轴力臂图形控件,该控件能够直观地反映力臂的当前状态。
  • 控件中角度控制的实现细节,包括如何通过编程手段调整力臂的角度,以及角度变化时的实时反馈。
  • 利用动画或图形渲染技术,为力臂的运动添加流畅的动态效果,提升用户体验。

示例代码:

        /// <summary>
        /// 重绘图形轨迹
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
             绘制背景
            //g.Clear(Color.White);

            // 定义机械手臂的起点和终点
            PointF basePoint1 = new PointF(baseX, baseY);
            PointF endPoint1 = new PointF(baseX, baseY);
            // 计算手臂的终点位置
            double radians1 = rotateAngle1 * (Math.PI / 180);
            endPoint1.X = (float)(basePoint1.X - EgeLength1 * Math.Cos(radians1));
            endPoint1.Y = (float)(basePoint1.Y + EgeLength1 * Math.Sin(radians1));
            // 绘制手臂1
            g.DrawLine(new Pen(Encoder1Color, 3), basePoint1, endPoint1);
            // 绘制编码器1
            g.FillEllipse(Brushes.LightBlue, baseX - EncoderSize / 2, baseY - EncoderSize / 2, EncoderSize, EncoderSize);


            PointF basePoint2 = endPoint1;
            PointF endPoint2 = new PointF(baseX - EgeLength1, EgeLength1);
            // 计算手臂的终点位置
            double radians2 = rotateAngle2 * (Math.PI / 180);
            endPoint2.X = (float)(basePoint1.X - (EgeLength1 * Math.Cos(radians1) + EgeLength2 * Math.Cos(radians1 + radians2)));
            endPoint2.Y = (float)(basePoint1.Y + (EgeLength1 * Math.Sin(radians1) + EgeLength2 * Math.Sin(radians1 + radians2)));
            // 绘制手臂2
            g.DrawLine(new Pen(Encoder2Color, 3), basePoint2, endPoint2);
            // 绘制编码器2
            g.FillEllipse(Brushes.LightBlue, endPoint1.X - EncoderSize / 2, endPoint1.Y - EncoderSize / 2, EncoderSize, EncoderSize);

            PointF basePoint3 = endPoint2;
            PointF endPoint3 = new PointF(baseX - 2 * EgeLength1, EgeLength1);
            // 计算手臂的终点位置
            double radians3 = rotateAngle3 * (Math.PI / 180);
            endPoint3.X = (float)(basePoint1.X - (EgeLength1 * Math.Cos(radians1) + EgeLength2 * Math.Cos(radians1 + radians2) + EgeLength3 * Math.Cos(radians1 + radians2 + radians3)));
            endPoint3.Y = (float)(basePoint1.Y + (EgeLength1 * Math.Sin(radians1) + EgeLength2 * Math.Sin(radians1 + radians2) + EgeLength3 * Math.Sin(radians1 + radians2 + radians3)));
            // 绘制手臂3
            g.DrawLine(new Pen(Encoder3Color, 3), basePoint3, endPoint3);
            // 绘制编码器3
            g.FillEllipse(Brushes.LightBlue, endPoint2.X - EncoderSize / 2, endPoint2.Y - EncoderSize / 2, EncoderSize, EncoderSize);

            if (PositiveFlag)
            {
                // 绘制电批
                g.FillEllipse(ScrewPositiveColor, endPoint3.X - ScrewSize / 2, endPoint3.Y - ScrewSize / 2, ScrewSize, ScrewSize);
            }
            else
            {
                int recWidth = 40;
                int recHeight = 13;
                //double tanValue = (endPoint3.Y - basePoint1.Y) / (basePoint1.X - endPoint3.X);
                //double angle = Math.Tanh(tanValue) * (180 / Math.PI);
                // 设置矩形的位置和大小
                Rectangle rect = new Rectangle((int)(endPoint3.X - recWidth / 2), (int)(endPoint3.Y - recHeight / 2), recWidth, recHeight);
                RotateRectangle(g, rect, ScrewNegativeColor, 90 - rotateAngle1- rotateAngle2- rotateAngle3);
            }

        }

实例链接:https://download.csdn.net/download/lvxingzhe3/89506988

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

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

相关文章

AE-时间轴的基础操作

目录 预览&#xff08;快捷键空格&#xff09; 调整时间线显示比例&#xff08;Alt鼠标滚轮&#xff09; 控制预览长度&#xff08;B/N&#xff09; 逐帧移动&#xff08;笔记本&#xff1a;按住fn上下方向键&#xff09; 视频剪切&#xff08;ctrlshiftD&#xff09; 剪…

“El-Table二次封装“这样做【高级前端必备技能之一】

&#x1f525; 前言 这篇文章给大家分享一个高级自定义列表组件从0到1的开发过程&#xff0c;这个列表组件的主要功能有&#xff0c;列表拖拽排序&#xff0c;右侧操作按钮统一使用Tooltip展示&#xff0c;操作表头增加自定列表icon&#xff0c;点击icon可以对列表展示数据进行…

帮企建站包响应式建站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 帮企建站包响应式建站源码系统是一款为企业和个人提供便捷、高效建站解决方案的工具。它融合了先进的技术和设计理念&#xff0c;旨在帮助用户轻松构建具有专业水准的网站&#xff0c;无论在桌面端还是移动端都能呈现出完美的展示效果。 该系统基于响应式设计原则&a…

怎么制作gif动图,视频制作GIF动画更简单

在社交媒体和网络交流中&#xff0c;GIF动画以其生动活泼的表现形式成为了表达情感、幽默和创意的热门媒介。无论是分享日常趣事&#xff0c;还是制作专业演示&#xff0c;一个恰到好处的GIF动图总能吸引目光&#xff0c;传递信息。 但你知道吗&#xff1f;即使没有专业的设计背…

有什么好的录屏软件?分享4款好评的软件!

在数字化时代&#xff0c;录屏软件已成为我们工作、学习和娱乐中不可或缺的工具。但面对市场上琳琅满目的录屏软件&#xff0c;我们该如何选择最适合自己的那一款呢&#xff1f;今天&#xff0c;就让我们一起来揭秘那些备受好评的录屏神器&#xff0c;帮助你轻松找到录屏的首选…

Stable Diffusion——如何把雪碧变成了一个小女孩?

引言 Stable Diffusion WebUI是一个基于深度学习的图像生成工具&#xff0c;它可以将一张图片转换成另一种模样。通过使用先进的稳定扩散算法&#xff0c;这个工具能够生成高质量、高分辨率的图像&#xff0c;同时保持原始图像的核心特征。无论您是想将照片转换成艺术作品&…

7成期刊下降!今年的影响因子为何如此凄惨?

2024年6月20日科睿唯安发布了JCR 2023&#xff0c;21800本期刊最新影响因子正式更新&#xff0c;附完整版EXCEL下载。 影响因子 影响因子&#xff08;Journal Impact Factor&#xff0c;简称JIF或IF&#xff09;是由科睿唯安每年发布的期刊引证报告&#xff08;Journal Citati…

python——list

在Python中&#xff0c;list是一种非常灵活的数据结构&#xff0c;可以用来存储一系列的元素。这些元素可以是任何类型&#xff0c;包括数字、字符串、其他列表等&#xff0c;并且它们不需要是同一种类型。 列表特征&#xff1a; 以下是一些关于Python列表的基本操作&#xff…

书生大模型实战营(暑假场)-入门岛-第一关

书生大模型实战营暑假场重磅开启&#xff01;&#xff0c;这场学习路线看起来很好玩呀&#xff0c;闯关学习既能学到知识又有免费算力可得&#xff0c;太良心啦。感兴趣的小伙伴赶快一起报名学习吧&#xff01;&#xff01;&#xff01; 关卡任务 好的&#xff0c;我们废话不多…

论文总是写不好?这么向kimi提问再试试!【图文大全套】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 你是否有这样的困惑&#xff1a;论文为什么总是达不到预期的高标准&#xff1f;写作过程中总感觉缺乏方向和灵感&#xff1f;在文献搜索和数据分析上耗费了大量时间却收获甚微&#xff…

老师怎样提高学生的听课效率?

在课堂上&#xff0c;我们常常面临一个问题&#xff1a;如何提高学生的听课效率&#xff1f;这是一个让无数教师头疼的问题。学生是否全神贯注&#xff0c;是否能够吸收和理解课堂上的知识&#xff0c;这直接关系到教学的成败。那么&#xff0c;作为教师&#xff0c;我们能做些…

敏捷的两种方式:Kanban和 Scrum

敏捷方法通过提供灵活、迭代的项目管理方法&#xff0c;改变了软件开发。敏捷方法中最著名的框架是 Kanban 和 Scrum。虽然这两种方法都旨在提高生产力和效率&#xff0c;但它们的运作原则和实践却截然不同。 在本文中&#xff0c;我们将深入探讨 Kanban 和 Scrum 的起源、主要…

简过网:备考一级造价师工程师,到底要不要报个培训班?

最近&#xff0c;小编刷到了有很多朋友在备考一级造价师&#xff0c;其中要不要报个培训班引想了小编的注意&#xff0c;今天&#xff0c;针对备考一级造价师工程师&#xff0c;到底要不要报个培训班这个问题&#xff0c;小编给大家一块来了解一下。 ​ 备考一级造价师工程师要…

侯捷C++面向对象高级编程(上)-10-组合与继承

1.复合-介绍 2.复合-适配 3.复合-计算 4.复合-构造和析构 5.委托 6.继承-介绍 7.继承-构造和析构

【数据结构】TreeMap及TreeSet

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 一、概念 TreeMap和TreeSet都是Java中基于红黑树&#xff08;Red-Black tree&#xff09;实现的有序集合类。它们分别实现了SortedMap和SortedSet接口&#xff0c;因此提供了按照键&#xff08;对…

8.2结构体的定义和使用

代码 #include <iostream> using namespace std; #include <string>//1、创建学生数据类型&#xff1a;学生包括(姓名&#xff0c;年龄&#xff0c;分数) //自定义数据类型&#xff0c;一些类型集合组成一个类型 //语法 struct 类型名称{成员列表} struct Stduent…

ClickHouse 更新操作导致不可写,应该选择哪种表引擎?

一个工作日下午&#xff0c;某大型通信运营商业务人员报告&#xff0c;一套 ClickHouse 集群在进行插入数据操作的时候&#xff0c;系统报错 too many mutations(1036)&#xff0c;插入数据失败&#xff01; 作者&#xff1a;张宇&#xff0c;爱可生DBA&#xff0c;负责数据库运…

【问题记录】VsCode中以管理员权限运行Powershell

问题展示 今天在尝试运行nodemon命令的时候出问题&#xff0c;显示没法识别&#xff0c;经过分析发现是管理员权限的问题&#xff0c;由于是在vscode里面进行开发&#xff0c;因此特此进行配置。 方法一 直接在vscode命令行中输入如下命令&#xff1a; Start-Process powers…

MySQL--视图和用户管理

视图 这里的视图跟之前事务里面的read view没有任何关系。 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 创建视图 create view 视…

最新盘点!2024年最好用的十大仓储管理系统(WMS)

深度盘点2024年十大仓鼠管理系统管理系统&#xff1a;简道云、伙伴云、百数、吉客云、旺店通、通天晓、富勒、万里牛、鼎捷、Arpa。 WMS系统&#xff08;Warehouse Management System&#xff09;&#xff0c;指的是仓库管理系统&#xff0c;是一种用于优化仓库运营、提高存储…