C#自定义曲线便器功能实现(简化版)
目录
一、曲线编辑器实现功能
二、实现方法说明
三、关键代码说明
1、绘制背景板和曲线
2、绘制坐标系面板
3、绘制曲线
四、工程下载连接
一、曲线编辑器实现功能
添加或者删除控制点,通过移动控制点来修改曲线形状


二、实现方法说明
1、坐标系系统:
使用0-500的范围映射到屏幕坐标系
自动绘制网格线(间隔50单位)
坐标轴显示在左侧和底部
2、控制点功能:
左键点击空白区域添加新控制点
拖动现有控制点调整位置
自动按X坐标排序保持曲线有效性
限制控制点移动范围(防止越界和重叠)
3、 曲线绘制:
使用GraphicsPath.AddCurve方法实现平滑曲线
张力系数设为0.5(可调整)
实时更新曲线显示
4、坐标转换:
MapXToScreen/MapYToScreen:将逻辑坐标转换为屏幕坐标
MapScreenToLogical:将屏幕坐标转换为逻辑坐标
5、交互优化:
双缓冲技术消除闪烁
抗锯齿处理
控制点吸附范围判断
二、使用说明:
点击空白区域添加新控制点
拖动红色控制点调整曲线形状
控制点自动按X坐标排序
曲线实时更新
三、扩展建议:
添加右键菜单删除控制点
实现曲线预设功能
添加数值输入框精确调整坐标
增加坐标轴标签
实现数据导出/导入功能
添加撤销/重做功能
*
该实现提供了基本的曲线编辑功能,可以作为图像处理工具的基础模块,后续可根据具体需求添加更多高级功能。
三、关键代码说明
1、绘制背景板和曲线
private void Form1_Paint(object sender, PaintEventArgs e){//base.OnPaint(e);Graphics g = e.Graphics;g.SmoothingMode = SmoothingMode.AntiAlias;// 绘制坐标系背景DrawCoordinateSystem(g);// 绘制控制点foreach (var point in controlPoints){DrawControlPoint(g, point);}// 绘制曲线if (controlPoints.Count >= 2){DrawCurve(g);}}
2、绘制坐标系面板
private void DrawCoordinateSystem(Graphics g){// 绘制坐标系背景g.FillRectangle(Brushes.White, coordinateArea);// 绘制坐标轴using (Pen axisPen = new Pen(Color.Black, 2)){// X轴g.DrawLine(axisPen,coordinateArea.Left,coordinateArea.Bottom,coordinateArea.Right,coordinateArea.Bottom);// Y轴g.DrawLine(axisPen,coordinateArea.Left,coordinateArea.Bottom,coordinateArea.Left,coordinateArea.Top);}// 绘制网格线using (Pen gridPen = new Pen(Color.LightGray, 1)){// X轴网格for (float x = 0; x <= 500; x += 50){float screenX = MapXToScreen(x);g.DrawLine(gridPen, screenX, coordinateArea.Top, screenX, coordinateArea.Bottom);}// Y轴网格for (float y = 0; y <= 500; y += 50){float screenY = MapYToScreen(y);g.DrawLine(gridPen, coordinateArea.Left, screenY, coordinateArea.Right, screenY);}}}
3、绘制曲线
private void DrawCurve(Graphics g){if (controlPoints.Count < 2) return;List<PointF> screenPoints = new List<PointF>();foreach (var point in controlPoints){screenPoints.Add(new PointF(MapXToScreen(point.X),MapYToScreen(point.Y)));}// 使用GraphicsPath绘制平滑曲线using (GraphicsPath path = new GraphicsPath())using (Pen curvePen = new Pen(Color.Blue, 2)){path.AddCurve(screenPoints.ToArray(), 0.5f); // 张力系数g.DrawPath(curvePen, path);}}
4、鼠标按下添加控制点和移动控制点
private void Form1_MouseDown(object sender, MouseEventArgs e){//base.OnMouseDown(e);// 检查是否点击控制点for (int i = 0; i < controlPoints.Count; i++){PointF logicalPoint = controlPoints[i];float screenX = MapXToScreen(logicalPoint.X);float screenY = MapYToScreen(logicalPoint.Y);if (Math.Abs(e.X - screenX) < pointRadius * 2 &&Math.Abs(e.Y - screenY) < pointRadius * 2){selectedPointIndex = i;return;}}// 添加新点(限制在坐标系区域内)if (coordinateArea.Contains(e.Location)){PointF newPoint = MapScreenToLogical(e.Location);controlPoints.Add(newPoint);controlPoints.Sort((a, b) => a.X.CompareTo(b.X)); // 按X坐标排序selectedPointIndex = controlPoints.IndexOf(newPoint);this.Invalidate();}}
private void Form1_MouseMove(object sender, MouseEventArgs e){//base.OnMouseMove(e);if (selectedPointIndex >= 0 && e.Button == MouseButtons.Left){// 限制移动范围在坐标系内float x = Math.Max(coordinateArea.Left, Math.Min(e.X, coordinateArea.Right));float y = Math.Max(coordinateArea.Top, Math.Min(e.Y, coordinateArea.Bottom));// 更新控制点位置PointF newPoint = MapScreenToLogical(new Point((int)x, (int)y));// 保持X坐标有序if (selectedPointIndex > 0 && newPoint.X < controlPoints[selectedPointIndex - 1].X)newPoint.X = controlPoints[selectedPointIndex - 1].X;if (selectedPointIndex < controlPoints.Count - 1 && newPoint.X > controlPoints[selectedPointIndex + 1].X)newPoint.X = controlPoints[selectedPointIndex + 1].X;controlPoints[selectedPointIndex] = newPoint;this.Invalidate();}}
四、工程下载连接
https://download.csdn.net/download/panjinliang066333/90519250
相关文章:
C#自定义曲线便器功能实现(简化版)
目录 一、曲线编辑器实现功能 二、实现方法说明 三、关键代码说明 1、绘制背景板和曲线 2、绘制坐标系面板 3、绘制曲线 四、工程下载连接 一、曲线编辑器实现功能 添加或者删除控制点,通过移动控制点来修改曲线形状 二、实现方法说明 1、坐标系系统&#x…...
Unity Shader编程】之复杂光照
在Unity Shader的LightMode标签中,除了前向渲染和延迟渲染外,还支持多种渲染模式设置。以下是主要分类及用途: 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算,处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...
解锁U盘属性0字节困境,重获数据生机
在数字化浪潮中,U盘宛如一位忠诚的“数据信使”,频繁穿梭于各种设备之间,为我们存储和传输着重要信息。然而,当U盘突然显示属性为0字节时,就如同这位信使突然“失声”,让我们陷入了数据丢失的恐慌之中。U盘…...
⭐算法OJ⭐二叉树的直径【树】(C++实现)Binary Tree Paths
543. Binary Tree Paths(二叉树的直径) Given the root of a binary tree, return the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or m…...
docker使用命令笔记
docker使用命令笔记 1. 安装docker2. 拉取镜像3. 镜像与容器4. 基于镜像创建容器4. 操作创建好的容器5. docker文件传输6. ubuntu的docker的一些基本环境搭建 记录docker的一些使用命令 1. 安装docker 遵循官方安装说明即可,windows需要下载docker desktop后在doc…...
字典树与01trie
字典树简介 当我们通过字典查一个字或单词的时候,我们会通过前缀或关键字的来快速定位一个字的位置,进行快速查找。 字典树就是类似字典中索引表的一种数据结构,能够帮助我们快速定位一个字符串的位置。 字典树是一种存储字符串的数据结构…...
vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.
问题描述: vue项目中,对表单数组赋值时,控制台抛出警告: 问题代码: 问题分析: 1、Vue 要求每个虚拟 DOM 节点必须有唯一的 key。该警告信息通常出现在使用v-for循环的场景中,多个同级节点使用…...
mysql中show命令的使用
在 MySQL 中,SHOW 命令是一个非常实用的工具,用于查询数据库元数据(如数据库、表、列、索引等信息)。以下是常见的 SHOW 命令及其用法: 1. 显示所有数据库 SHOW DATABASES;列出服务器上的所有数据库。 2. 显示当前数据…...
各类神经网络学习:(三)RNN 循环神经网络(中集),同步多对多结构的详细解释
上一篇下一篇RNN(上集)RNN(下集) 同步多对多结构 1)结构详解 ①图解: ②参数含义: x t x_t xt :表示每一个时刻的输入; o t o_t ot :表示每一个时刻的输…...
Python Web 框架 Django、Flask 和 FastAPI 对比
在探索 Python Web 框架时,Django、Flask 和 FastAPI 无疑是最常被提及的名字。根据我们最新的 Python 开发者调查,这三大框架继续稳坐后端 Web 开发的热门宝座。它们均为开源项目,并且与 Python 的最新版本无缝兼容。然而,面对不…...
Hyperlane 似乎是一个轻量级、高性能的 Rust HTTP 服务器库
关键要点 Hyperlane 是一个轻量级、高性能的 Rust HTTP 服务器库,适合简化网络服务开发。它支持 HTTP 请求解析、响应构建、TCP 通信,并提供中间件、WebSocket 和服务器发送事件(SSE)功能。安装通过 cargo add hyperlane 完成&am…...
【计算机网络运输层详解】
文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…...
UR5e机器人位姿
UR5e 作为一款 6 自由度协作机器人,其末端执行器的位姿(位置与姿态的组合)控制是实现精准操作的核心。在笛卡尔坐标系中,位姿通常用齐次变换矩阵表示,包含末端的三维位置(x, y, z)和三维姿态&am…...
导入 Excel 规则批量修改或删除 PDF 文档内容
需要对 PDF 文档内容进行修改的时候,通常我们会需要借助一些专业的工具来帮我们完成。那我们如果需要修改的 PDF 文档较多的时候,有什么方法可以帮我们实现批量操作呢?今天这篇文章就给大家介绍一下当我们需要批量修改多个 PDF 文档的时候&am…...
大模型tokenizer重构流程
大模型tokenizer层再训练(选取Qwen7B试验,重构token层) 最近公司可能想训练一个蛋白质大模型,需要了解一下大模型tokenizer重构,之后可能要训练,这里做了一定的总结。 文章目录 1. 首先查看Qwen2.5 7B基本…...
JAVA线程安全的集合类分类
1. 传统同步集合类(早期实现,性能较低) Vector 动态数组实现,所有方法通过 synchronized 同步锁保证线程安全。 Stack 继承自 Vector,实现后进先出(LIFO)堆栈,同步锁机…...
ISIS-1 ISIS概述
前面几章我们介绍了OSPF的基础工作原理以及怎样交互LSA形成LSDB链路状态数据库的 这一章我们来介绍另一个链路状态路由协议,ISIS路由协议 一、概述 ISIS(Intermediate System to Intermediate System,中间系统到中间系统)是由ISO(International Organization for Standardiza…...
茱元游戏TV2.9.3 | 适配多设备的经典街机游戏集合
茱元游戏TV是一款专为TV端设计的游戏软件,同时适配手机、投影仪和车机等多种设备。尽管其兼容性一般,仅支持安卓9.0以上系统,但它提供了丰富的经典街机游戏资源,非常适合8090后怀旧游玩。注意,游戏需先下载才能玩&…...
RTD2525BE《HDMI转EDP,DP转EDP》显示器芯片
一、产品概述 瑞昱RTD2525BE是一款专为高端显示设备设计的多接口转换芯片,支持HDMI 2.0与DisplayPort(DP)1.4双输入,并高效转换为嵌入式DisplayPort(eDP)输出。该芯片集成先进信号处理技术,支持…...
SvelteKit 最新中文文档教程(10)—— 部署 Cloudflare Pages 和 Cloudflare Workers
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
springboot使用阿里限流框架-sentinel
当前项目源码 控制台下载 启动bin中的看板服务:账号密码:sentinel/sentinel 官方文档地址 项目引入依赖 <!-- sentinel注解支持 --> <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj<…...
鸿蒙特效教程10-卡片展开/收起效果
鸿蒙特效教程10-卡片展开/收起效果 在移动应用开发中,卡片是一种常见且实用的UI元素,能够将信息以紧凑且易于理解的方式呈现给用户。 本教程将详细讲解如何在HarmonyOS中实现卡片的展开/收起效果,通过这个实例,你将掌握ArkUI中状…...
Qt在模块依靠情况下资源文件名称和资源名称的使用限制
概述 在Qt中使用添加资源文件的时候,对于资源文件名称的定义,往往是较为随意的。 但是当涉及到Qt库依赖的时候,则可能需要遵守一定的规则,否则可能出现文件找不到或者错误加载的问题。 环境 环境名称Qt 版本系统版本LinuxQt 5.…...
MTK Android12-Android13 设置系统默认语言
Android 系统,默认语言 文章目录 需求:场景 参考资料实现方案实现思路编译脚本熟悉-平台熟悉mssi_64_cnkernel-4.19 解决方案修改文件-实现方案 源码分析PRODUCT_LOCALES 引用PRODUCT_DEFAULT_LOCALE 定义get-default-product-locale 方法定义PRODUCT_DE…...
【003安卓开发方案调研】之ReactNative技术开发安卓
基于2025年最新行业动态和搜索资料,以下是针对国内使用React Native(RN)开发安卓应用的深度分析: 一、技术成熟度评估 1. 核心架构升级 新架构全面普及:2024年起,React Native的 新架构(Fabri…...
CSS3学习教程,从入门到精通,CSS3 浮动与清除浮动语法知识点及案例代码(14)
CSS3 浮动与清除浮动语法知识点及案例代码 一、浮动基础 浮动语法 选择器 {float: left|right|none|initial|inherit; }left:元素向左浮动。right:元素向右浮动。none:默认值,元素不浮动。initial:使用默认值。inhe…...
贪心算法——思路与例题
贪心算法:当我们分析一个问题时,我们往往先以最优的方式来解决问题,所以顾名思义为贪心。 例题1 题目分析:这题利用贪心算法来分析,最优解(可容纳人数最多时)一定是先考虑六人桌,然…...
网络华为HCIA+HCIP 防火墙
防火墙部署模式 路由模式 有路由器的功能 路由器干的活 他都得干 透明模式 旁挂模式 IDS 端口镜像 VPN...
WordPress超级菜单插件UberMenu v3.78汉化版
一、插件介绍 UberMenu 是一款功能强大的 WordPress 超级菜单插件,能够帮助站长创建响应式、可自定义的多级菜单。该插件支持动态内容加载、图标、图片、搜索框等丰富功能,并且兼容大多数 WordPress 主题。 UberMenu v3.78 经过完整汉化,适用于中文站点用户,让操作更加直观…...
SQL中体会多对多
我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到JOINLEFT JOIN两种连接 1. 学生表(students) student_idstudent_name1张三2李四3王五 2. 课程表(courses)…...
