三次样条曲线的偏移计算方法比较

news2024/9/20 22:01:52

最近,我不得不想出一种方法,从三次 Hermite 样条曲线创建平行曲线,例如铁路车道。 首先,我只是沿着法线方向移动它们的开始/结束控制点,同时保持相同的开始/结束切线。 它在大多数情况下工作得很好,因为我的用例中的大多数样条曲线都不是很弯曲。

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

但我很快发现,即使使用一些轻微弯曲的样条线,以这种天真的方式复制的曲线也常常会导致变窄。 因此,我决定硬着头皮通过谷歌搜索来了解其他聪明人已经弄清楚的内容。
在这里插入图片描述

我很快了解到这种曲线的官方术语是偏移曲线(offset curve)或平行曲线(parallel curve)。 我遇到的第一种方法是将曲线转换为折线,偏移折线,然后将其重建为一条或多条曲线。这听起来很复杂,我想找到一种更直接的方法,不需要经历折线阶段。

我发现的下一个方法是偏移其控制多边形(这里 和 这里)。 你可以轻松地将三次 Hermite 样条曲线转换为 Bézier 曲线,如 这里所解释的。 在贝塞尔曲线形式中,你可以从四个控制点获得一个控制多边形。 可以按如下方式偏移它并从中获取偏移样条线:

在这里插入图片描述

正如上面的两个链接所提到的,该方法不适用于高曲率的曲线,你需要将原始曲线分割为多个段才能在这种情况下获得更好的结果。 我认为拆分/细分对于我的用例来说不是必要的,因此决定尝试该方法。

我有 3D 样条线,因此我使用倾斜线之间的距离方程(如这里)来获取控制多边形的偏移边缘之间的交点。 我的样条线对于每个控制点也只有一条切线。 换句话说,没有单独的传入/传出切线。 因此,一旦计算了相邻线段的偏移样条线,我就会将共享控制点的切线设置为第一个线段的结束切线和第二个线段的开始切线的平均值。

该方法提供的平行曲线对于我拥有的大多数样条线来说看起来足够好。 但是,当切线很长且控制多边形自相交时,某些偏移曲线会变得很糟糕。 此外,对于其他一些情况,它们有点过度补偿并且变得比应有的范围更宽。

因此,我引入了一些调整,例如当控制多边形的内角太锐时回到朴素方式,并在朴素结果和基于内角余弦的方法之间进行调整,以避免在某些情况下变得太宽 。 在极少数情况下,这种调整后的方法仍然会失败。 对于他们来说,我可以在这种方法之前应用分割,但是现在,我决定手动修改原始样条线,以便它们可以在没有自动分割的情况下更好地使用该方法。 我认为每个控制点有一个切线(没有单独的传入/传出切线)也会使其中一些情况变得更糟。

如你所见,这并不完全令人满意。 它需要一些不太干净的调整,但仍然无法处理所有情况。 我在业余时间挖掘了更多内容,发现了一些有用的信息和更多值得将来尝试的方法。 此存档的 PDF 文档解释了通过求解三个线性方程组获得贝塞尔偏移曲线, 从第 34 页开始。它从简单的方法开始,通过求解具有三个未知数的线性方程组来计算应如何修改所得曲线以满足理想偏移曲线的属性。 该方法也有一些失败案例,该文档解释了一种通过修复一个未知数并仅使用两个线性方程来处理这些失败案例的方法。 它在 Postscript 中有示例代码。
在这里插入图片描述

许多参考资料告诉你,一般来说,无法使用另一条贝塞尔曲线(或任何多项式参数曲线,就这一点而言,无论你愿意采用何种高阶)来表达贝塞尔曲线的偏移曲线。 这里第28页还说任意三次曲线的偏移曲线需要10阶代数曲线。

github上有一本关于贝塞尔曲线的非常漂亮且详细的入门书,其中包含有关贝塞尔曲线的各种有用信息,以及交互式和视觉指南。 它的偏移曲线部分解释了另一种涉及分割的方法。 有了它,你可以“将一条曲线切成‘安全’子曲线(其中安全意味着所有控制点始终位于基线的一侧,并且 t=0.5 处的曲线中点大致位于中心) 由曲线坐标定义的多边形),然后相对于其缩放原点(即起点和终点处的点法线的交点)对每个子曲线进行点缩放。” 它在这个仓库中有所有相关代码,因此你可以轻松查看其实现细节。

上面提到的两种替代方案听起来很合理,而且看起来实施起来并不难。 当当前偏移控制多边形的方法对于我的用例来说变得过于脆弱和麻烦时,我将尝试它们。

我的这个简短的研究对我来说是一次非常有趣和有教育意义的旅程,它展示了如何获得样条曲线的并行版本这一看似简单的问题所涉及的细微差别和复杂性。 我希望它对你来说很有趣并且有帮助!


原文链接:三次样条的偏移曲线计算 — BimAnt

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

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

相关文章

Qt画图框架,实现自己的画图框架

前面也讲到Qt提供画图框架,经典MVC模型,也没有什么问题。但Qt仅提供框架性东西,很难落地,很难应用在实际项目当中,一般需要自己捋一遍,这样才能理解好 什么view,canvas都好理解,只要…

Elasticsearch【文档操作、搜索操作、入门案例】(五)-全面详解(学习总结---从入门到深化)

目录 原生JAVA操作ES_文档操作 原生JAVA操作ES_搜索操作 SpringDataES_入门案例 原生JAVA操作ES_文档操作 新增&修改文档 Test public void addDocument() throws IOException {// 1.创建客户端对象,连接ESRestHighLevelClient client new RestHighLevelC…

API安全基础理论

1.什么是API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。通过淘宝API,就…

测试完OLED屏对比LCD屏后:液晶面板拥趸们无话可说了

关于笔记本的屏幕,从大的技术上来分类可以分成两类,一种是OLED材质,另外一种是LCD材质。前些年的笔记本基本都采用的是LCD材质,但近几年随着OLED屏幕的崛起,大多数笔记本都采用了OLED材质。 那么,你知道LCD…

ChatGPT能为留学生做什么?错误使用有何后果?

随着AI人工智能行业的迅速发展,越来越多的学生开始利用ChatGPT等软件来获得更高效便利的论文和作业辅助。 然而,我们需要认识到一个严肃的问题:学生是否过度依赖AI助手来完成毕业论文。 近期出现的Turnitin AI Detector是一个用于帮助教师确…

Xamarin.Android | 界面跳转到手机自带的自启动管理界面,引导用户将APP加入自启动

Xamarin.Android | 界面跳转到手机自带的自启动管理界面,引导用户将APP加入自启动 文章目录 Xamarin.Android | 界面跳转到手机自带的自启动管理界面,引导用户将APP加入自启动前言示例代码自启动界面URI字典打开自启动管理界面 结束语 前言 很多 Androi…

【算法 -- LeetCode】(14) 最长公共前缀

1、题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: 输入:strs [“dog”,“…

【unity实战】使用shader和shader Graph实现2d图片描边效果(附源码)

文章目录 前言Shader1. 内描边2. 外描边 Shader Graph1. 2d图片描边2. 带炫光的2d图片描边 最终演示效果源码参考完结 前言 最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较…

2023最新整理的 Elasticsearch 21道面试题

1、为什么要使用 Elasticsearch? 系统中的数据, 随着业务的发展, 时间的推移, 将会非常多,而业务中往往采用模糊查询进行数据的 搜索,而模糊查询会导致查询引擎放弃索引, 导致系统查询数据时都是全表扫描&…

Unity3D 场景添加obj模型

有一个立方体的obj模型;将其拖到Assets文件夹节点上,在此节点放手,资源被加入项目; 在右侧显示出对象概览; 点击箭头,显示此模型下的子对象; 然后按住Assets面板中的cube1对象,拖动…

3分钟阿里云轻量应用服务器和云服务器的区别对比

阿里云服务器ECS和轻量应用服务器有什么区别?云服务器ECS是明星级云服务器,轻量应用服务器可以理解为简化版的云服务器ECS,轻量适用于单机应用,云服务器ECS适用于集群类高可用高容灾应用,阿里云百科来详细说下阿里云轻…

科研论文中SCI,SSCI ,CSSCI是什么

目录 1 SCI 2 SSCI 3 CSSCI 什么是SCI,SSCI ,CSSCI 目前,在国际科学界,如何正确评价基础科学研究成果已引起越来越广泛的关注。而被SCI、SSCI收录的科技论文的多寡则被看作衡量一个国家的基础科学研究水平、科技实力和科技论文水平…

以太网之IP协议(七)

目录 一、IP协议的功能 1.1 IP地址 1.2 IP路由 1.2.1 路由原理 1.2.2 路由控制表 1.3 IP分包与组包 二、IP地址 2.1 IP地址分类 2.2 多播地址 2.2.1 广播地址 2.2.2 组播地址 2.3 子网掩码 三、IP帧格式 一、IP协议的功能 数据链路层提供直连两个设备之间的通信功…

【Linux系统编程】Linux编辑器——vim

文章目录 1. 什么是vim2. vim的常用模式3. vim的基本操作4. vim命令集4.1 命令模式命令集复制粘贴依次撤销上一次操作对撤销进行撤销(恢复)剪切&删除移动光标(上下)移动光标(左右)文本内容大小写切换替…

javaTCP数据报套接字编程

TCP套接字编程 1.ServerSocket API1.1ServerSocket 的构造方法1.2ServerSocket 方法: 2.Socket API2.1Socket构造方法2.2Socket方法 3.TCP回显服务器4.TCP中的长短连接5.C10M问题 TCP提供的API主要有两个类:一个是专门给服务器用的SeverSocket对象&#…

MyBatis-Plus框架

说明&#xff1a;Mybaits-Plus是Mybatis框架的升级&#xff0c;该框架提供了一系列API&#xff0c;用于操作数据&#xff0c;可以免受手搓SQL语句的痛苦。 一、使用 第一步&#xff1a;添加依赖 使用前&#xff0c;需先添加对应的依赖&#xff0c;建议使用最新的版本 <d…

有什么事让你觉得在Linux上顺理成章,换到Windows上就令你费解?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

Linux红帽认证适合哪些人学习

近几年来&#xff0c;技术的迭代速度越来越快&#xff0c;云计算&#xff0c;大数据&#xff0c;人工智能&#xff0c;物联网等技术扑面而来&#xff0c;全球各大互联网公司都在抢先发展这些技术&#xff0c;而无一例外的这些技术背后都是使用的Linux系统&#xff0c;双11&…

JAVA_SSM Demo(WEB端)

仓库地址&#xff1a;https://gitee.com/ThMyGitee/SSMDemo.git CSDN的友友们&#xff0c;项目如果适合您的话&#xff0c;麻烦给个小小的Star&#xff0c;谢谢啦&#xff01; JAVA_SSM Demo(WEB端) 1.开发环境 JDK1.8 Tomcat 8.5.60 IDEA 2019.3 MySQL 5.7.20 Maven 3.6 S…

USB协议总结

1、简介 在了解USB协议之前&#xff0c;先了解下该总线协议出现的背景。在USB总线出现之前&#xff0c;计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接&#xff0c;不同设备的接口不能互用&#xff0c;扩展性很差。每次插拔设备都要关闭计算机&#xff0c;不支持热插…