【流程图】在 .NET (WPF 或 WinForms) 中实现流程图中的连线算法
在 .NET (WPF 或 WinForms) 中实现流程图中的连线算法,通常涉及 图形绘制 和 路径计算。常见的连线方式包括 直线、折线 和 贝塞尔曲线。以下是几种方法的介绍和示例代码。
1. 直线连接(最简单)
适用场景:
- 两个节点之间没有障碍物时,最简单的方式。
计算方式:
- 直接用起点
(x1, y1)和终点(x2, y2)画一条直线。
WPF 示例代码
<Canvas x:Name="canvas" Background="White"><Line X1="100" Y1="100" X2="300" Y2="200"Stroke="Black" StrokeThickness="2"/>
</Canvas>
2. 折线连接(适用于流程图)
适用场景:
- 流程图、状态机 这类需要避开障碍的情况。
计算方式:
- 如果两个点在水平方向或垂直方向对齐,直接连线。
- 否则,使用水平-垂直 或 垂直-水平折线路径。
算法步骤:
- 确定起点
(x1, y1)和终点(x2, y2)。 - 选择折线拐点:
中间点1 = (x1, y1 + Δy)中间点2 = (x2, y1 + Δy)
WPF 示例代码
<Canvas x:Name="canvas" Background="White"><Polyline Stroke="Black" StrokeThickness="2"Points="100,100 100,200 300,200"/>
</Canvas>
C# 代码动态生成折线
using System.Windows;
using System.Windows.Shapes;
using System.Windows.Controls;
using System.Windows.Media;public void DrawPolyline(Canvas canvas, Point start, Point end)
{Polyline polyline = new Polyline{Stroke = Brushes.Black,StrokeThickness = 2};// 计算拐点Point mid1 = new Point(start.X, (start.Y + end.Y) / 2);Point mid2 = new Point(end.X, (start.Y + end.Y) / 2);polyline.Points.Add(start);polyline.Points.Add(mid1);polyline.Points.Add(mid2);polyline.Points.Add(end);canvas.Children.Add(polyline);
}
3. 贝塞尔曲线连接(更平滑)
适用场景:
- 逻辑图、网络关系图、UML 图,需要平滑曲线的情况。
计算方式:
- 使用 三次贝塞尔曲线 (Cubic Bezier Curve):
- 起点
(x1, y1) - 终点
(x2, y2) - 两个控制点
(cx1, cy1)和(cx2, cy2)
- 起点
算法步骤:
- 计算控制点:
cx1 = x1 + Δx / 2cy1 = y1cx2 = x2 - Δx / 2cy2 = y2
- 使用
Path+BezierSegment进行绘制。
WPF 示例代码
<Path Stroke="Black" StrokeThickness="2"><Path.Data><PathGeometry><PathFigure StartPoint="100,100"><BezierSegment Point1="150,100" Point2="250,200" Point3="300,200"/></PathFigure></PathGeometry></Path.Data>
</Path>
C# 代码动态生成
using System.Windows;
using System.Windows.Shapes;
using System.Windows.Controls;
using System.Windows.Media;public void DrawBezier(Canvas canvas, Point start, Point end)
{Path path = new Path{Stroke = Brushes.Black,StrokeThickness = 2};PathGeometry geometry = new PathGeometry();PathFigure figure = new PathFigure { StartPoint = start };BezierSegment bezier = new BezierSegment{Point1 = new Point(start.X + (end.X - start.X) / 2, start.Y),Point2 = new Point(end.X - (end.X - start.X) / 2, end.Y),Point3 = end};figure.Segments.Add(bezier);geometry.Figures.Add(figure);path.Data = geometry;canvas.Children.Add(path);
}
4. 避障碍物的连线(A*路径算法)
适用场景:
- 复杂流程图、管道布线、自动路径计算。
- 遇到障碍物时,需要智能避开。
算法思路:
- 建模:将整个画布视为网格(如 10×10 的小方块)。
- 路径计算:
- 使用 A 搜索算法* 找到起点到终点的最短路径。
- 允许横向、纵向移动,但不能穿过障碍物。
- 连线方式:
- 根据 A* 计算出的路径,在网格点之间绘制折线。
C# 实现思路
public List<Point> AStarFindPath(Point start, Point end, List<Rect> obstacles)
{// 使用 A* 寻路算法,返回经过的路径点// 省略 A* 具体实现,可使用 AStarSharp 库return new List<Point> { start, new Point(200, 150), end };
}public void DrawPath(Canvas canvas, Point start, Point end, List<Rect> obstacles)
{List<Point> path = AStarFindPath(start, end, obstacles);Polyline polyline = new Polyline{Stroke = Brushes.Black,StrokeThickness = 2};foreach (var point in path)polyline.Points.Add(point);canvas.Children.Add(polyline);
}
总结
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 直线连接 | 简单流程图 | 计算简单,性能高 | 不能避开障碍物 |
| 折线连接 | 业务流程图、状态图 | 适应复杂布局,易控制 | 可能需要手动计算拐点 |
| 贝塞尔曲线 | 关系图、UML | 平滑美观,减少交叉 | 控制点计算较复杂 |
| A 避障路径* | 复杂流程、自动布线 | 自动选择最优路径 | 计算复杂,性能开销大 |
如果你的流程图 节点不会重叠,可以用 折线 或 贝塞尔曲线。
如果有 障碍物,建议使用 A 算法* 计算路径。
你打算在哪种场景下使用?
相关文章:
【流程图】在 .NET (WPF 或 WinForms) 中实现流程图中的连线算法
在 .NET (WPF 或 WinForms) 中实现流程图中的连线算法,通常涉及 图形绘制 和 路径计算。常见的连线方式包括 直线、折线 和 贝塞尔曲线。以下是几种方法的介绍和示例代码。 1. 直线连接(最简单) 适用场景: 两个节点之间没有障碍…...
IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题
文章目录 引言一、安装Proxy AI1.1 在线安装Proxy AI1.2 离线安装Proxy AI 二、Proxy AI中配置DeepSeek2.1 配置本地部署的DeepSeek(Ollama方式)2.2 通过第三方服务商提供的API进行配置 三、效果测试 引言 许多开发者尝试通过安装Proxy AI等插件将AI能力…...
【流行病学】Melodi-Presto因果关联工具
title: “[流行病学] Melodi Presto因果关联工具” date: 2022-12-08 lastmod: 2022-12-08 draft: false tags: [“流行病学”,“因果关联工具”] toc: true autoCollapseToc: true 阅读介绍 Melodi-Presto: A fast and agile tool to explore semantic triples derived from …...
详细分析KeepAlive的基本知识 并缓存路由(附Demo)
目录 前言1. 基本知识2. Demo2.1 基本2.2 拓展2.3 终极 3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本知识推荐阅读:KeepAlive知识点 从实战中学习,源自实战中vue路由的…...
【Go】Go viper 配置模块
1. 配置相关概念 在项目开发过程中,一旦涉及到与第三方中间件打交道就不可避免的需要填写一些配置信息,例如 MySQL 的连接信息、Redis 的连接信息。如果这些配置都采用硬编码的方式无疑是一种不优雅的做法,有以下缺陷: 不同环境…...
zabbix“专家坐诊”第277期问答
在线答疑:乐维社区 问题一 Q:这个怎么解决呢? A:缺少这个依赖。 Q:就一直装不上。 A:装 zabbix-agent2-7.0.0-releasel.el7.x86 64 需要前面提示的那个依赖才可以装。 问题二 Q:大佬,如果agen…...
大模型工程师学习日记(十一):FAISS 高效相似度搜索和密集向量聚类的库
Facebook AI Similarity Search (Faiss /Fez/) 是一个用于高效相似度搜索和密集向量聚类的库。它包含了在任意大小的向量集合中进行搜索的算法,甚至可以处理可能无法完全放入内存的向量集合。它还包含用于评估和参数调整的支持代码。 Faiss 官方文档:We…...
python学习第三天
条件判断 条件判断使用if、elif和else关键字。它们用于根据条件执行不同的代码块。 # 条件判断 age 18 if age < 18:print("你还是个孩子!") elif age 18:print("永远十八岁!") else:print("你还年轻!")…...
深入解析 Svelte:下一代前端框架的革命
深入解析 Svelte:下一代前端框架的革命 1. Svelte 简介 Svelte 是一款前端框架,与 React、Vue 等传统框架不同,它采用 编译时(Compile-time) 方式来优化前端应用。它不像 React 或 Vue 依赖虚拟 DOM,而是…...
C++20 中位移位运算符的统一行为:深入解析与实践指南
文章目录 1. 位移位运算符的基础1.1 左移运算符(<<)1.2 右移运算符(>>) 2. C20 对位移位运算符的统一2.1 移位数量超出操作数位宽2.2 负数移位 3. 实践中的注意事项4. 示例代码5. 总结 在 C 的发展历程中,…...
Linux——基本指令
我们今天学习Linux最基础的指令 ls 指令 语法: ls [选项] [⽬录或⽂件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信 息。 命令中的选项,一次可以传递多个 ,…...
MySql面试总结(二)
WHERE 子句优化 截至2024年7月,MySQL最新稳定版本是8.2,并不存在MySQL 8.4 。下面从常见的几个方面为你介绍 MySQL 8.x 中 WHERE 子句的优化方法: 1. 确保使用索引 原理:索引可以加快数据的查找速度,当 WHERE 子句中的条件列有索引时,MySQL 可以直接定位到符合条件的数…...
Pytorch中的主要函数
目录 一、torch.manual_seed(seed)二、torch.cuda.manual_seed(seed)三、torch.rand(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧五、torch.version.cuda;torch.bac…...
Java实现大数据量导出报表
一、实现方式 在Java中,导出数据到Excel有多种方式,每种方式都有其优缺点,适用于不同的场景。以下是常见的几种方式及其特点: 1.1 Apache POI Apache POI 是 Java 中最流行的库,支持读写 Excel 文件(包括…...
大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据
示例代码: import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…...
PyTorch 系统教程:理解机器学习数据分割
数据分割是机器学习中的一个基本概念,它直接影响模型的性能和泛化。在本文中,我们将深入研究为什么数据分割在机器学习中很重要,并演示如何使用PyTorch有效地实现它。 理解数据分割 数据分割是将数据集划分为单独的组以进行训练、验证和测试…...
分水岭算法(Watershed Algorithm)教程:硬币分割实例
import cv2 import numpy as np# 1. 图像预处理 img cv2.imread("./water/water_coins.jpeg") gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) kernel np.ones((3, 3), np.int8)…...
【STM32项目实战系列】基于STM32G474的FDCAN驱动配置
前言:本周工作中用到了CANFD的驱动,由于以前都是用到的CAN2.0,所以过程并不是特别的顺利,所以中间遇到几个比较小的问题导致自己卡住了一段时间,特此记录一下并完全奉上自己的配置的源码。 1,CANFD配置与简…...
shell文本处理
shell文本处理 一、grep 过滤来自一个文件或标准输入匹配模式内容。除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep -f,用的比较少。 用法 grep [OPTION]... PATTERN [FILE]...支持的正则描述…...
如何利用客户端双向TLS认证保护云上应用安全
双向TLS(mTLS)通过要求服务器和客户端双方使用数字证书来验证彼此身份,从而扩展了传统TLS的安全性。常规的TLS只会验证服务器的身份(如大家的浏览器在验证网站时的场景),而mTLS确保在任何数据交换发生之前,双方都对彼此持有信任。在本文中&am…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
