如何简化三次贝塞尔曲线?

2024-03-16

我有一条三次贝塞尔曲线,由许多段组成(左图)。它有一些粗糙的曲率,我需要让它像右图一样平滑。这个问题有点像“降噪”,我该如何实现呢?

有类似的线程here https://stackoverflow.com/questions/3497694/simplifying-a-cubic-bezier-path?rq=1,但输入是一组点,并使用最小二乘法在其上拟合贝塞尔曲线,但在我的问题中,输入已经是三次贝塞尔曲线。

在上图中,我没有绘制线段和控制点,但我希望您能明白。


您想保持相同数量的段吗?您需要保持贝塞尔曲线段之间的连续性吗?您是否试图达到一定数量的线段,或者只是将事物保持在原始曲线的一定公差范围内?

现在,我假设您想要减少贝塞尔曲线段的数量,任何您需要保持段之间的 G1 连续性的数量,并且您试图在容差范围内进行平滑(只是从图像中猜测)。

对于顶级算法,您将遍历每对相邻的曲线,并尝试将它们组合起来。重复此操作,直到组合两条相邻曲线超出您的公差范围。

如何组合两条相邻的贝塞尔曲线?假设它们是曲线 P 和 Q,并且由于它们都是三次曲线,因此它们各有 4 个 CV:P0、P1、P2、P3 和 Q0、Q1、Q2、Q3。我们还将假设 P3 == Q0。另外,我们称输出曲线为R,由R0、R1、R2、R3组成。

另一个非常重要的步骤 - 您需要为要简化的较大曲线内的每个贝塞尔曲线段分配 t 值。因此,段 0 将从 0..1 开始,段 1 从 1..2 开始,段 2 从 2..3 开始,依此类推。

如果要保持 P 与其邻居的连续性,以及 Q 与其邻居的连续性,则不能移动 P0 或 Q3,并且 (P1-P0) 和 (Q2-Q3) 形成的切向量必须保持相同方向..它们只能缩放。

由于 R 中只有 4 个 CV,因此这两个比例因子是您拥有的唯一自由度。我们将它们称为 kp 和 kq。

R0=P0
R1=P0+kp*(P1-P0)
R2=Q3+kq*(Q2-Q3)
R3=Q3

如果两条曲线的结长度相等,则 kp = 2 且 kq = 2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何简化三次贝塞尔曲线? 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel

随机推荐

  • 如何在 Linux 上的 Firefox 中从聚焦单选输入中删除边框/轮廓

    I know that there are pretty much answers on similar questions on SO but none of them seems to work for me The problem i
  • 从 XML 数据写入 SQLite 数据库

    给出以下代码来导出数据库中的每个表 string strSql SELECT FROM tableName SqliteConnection sqlCon new SqliteConnection Data Source dbPath us
  • 以编程方式设置 Angular 4 复选框

    我见过类似的问题 但我仍然不明白 我有一个组件女巫获取项目列表Array lt id number name string gt 以及 已检查 项目的列表Array
  • 这个编码字符串表示什么?您是如何发现的?

    我正在尝试建立一个产品目录 但我不知道它在做什么 我想看看里面 有人能弄清楚如何打印源代码并告诉我怎么做吗 FZrHbutatkV pXpVF2wwJ1S4YBZzjp0HRjGIOfPrH0 LgGFL5OZac45h e efvf5RH
  • 使用 StateFlow 和分页的 Android MVI 3

    我正在尝试使用状态流和分页 3 来实现 android MVI 架构 但是当我有一个包含分页数据的视图状态时 我感到很困惑 问题是我将视图模型中的视图状态公开为状态流对象 但现在在该视图状态内我有另一个来自分页库的流对象 状态流中可以有一个
  • 如何使用 Meteor 公开 RESTful Web 服务

    您将如何使用 Meteor 创建一个安静的 Web 服务 我想在 Appcelerator 中创建连接到同一后端的应用程序 Meteor 能解决这个问题吗 我在 Meteorpedia 上写了一篇完整的文章 http www meteorp
  • Entity Framework(EF5) 支持 XML 数据类型吗?

    我正在考虑在 SQL Server 2008 R2 中使用 XML 数据类型 同时也将 EF 与 MVC 结合使用 EF5 支持 XML 数据类型吗 如果没有 那么我将不得不选择不同的数据库设计 非常感谢 EF 目前不原生支持 Xml 类型
  • EJB 3.1 API 的 Maven 存储库

    我可以使用什么 Maven 存储库来实现 EJB 3 1 API 依赖项 这种对中央的依赖起了作用
  • 在哪里可以找到 scala.Any 和 scala.AnyRef 的定义?

    我想跳到 Any 的源代码来看看一些方法是如何实现的 但我发现它没有包含在 scala library src 中 AnyRef 也没有包含在其中 但是值类型和 Nothing 都包含在其中 我很好奇 Scala 对象基类型是如何以及在哪里
  • 如何从父对象获取对象的属性值

    我在这个结构中有对象 obj user name jeterson title I am a test 我有一把有价值的钥匙 user name 我试图获得这样的价值 obj key 意义obj user name 它不起作用 只适用于ob
  • WPF 4 多点触控拖放

    我有一个 WPF 4 应用程序 我使用标准实现了拖放DragDrop DoDragDrop方法 但我使用触摸而不是鼠标事件来做到这一点 我的网格 我正在拖动 的 XAML 如下
  • 如果 proxy_pass 响应中存在 etag,则禁用 gzip

    我是 Nginx 新手 如果 proxy pass 返回 ETag 标头 是否有办法禁用 gzip I E gzip on location foo bar proxy pass http server 123 if upstream ht
  • 通过 try() 之类的方法使 R 命令超时

    我正在并行运行大量迭代 某些迭代比其他迭代花费的时间要长得多 例如 100 倍 我想将这些超时 但我不想深入研究函数 称为 fun c 背后的 C 代码来完成繁重的工作 我希望有类似于 try 的东西 但有一个 time out 选项 然后
  • 最新的 OpenGL 教程或 C++ 书籍 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Websphere 中的 NoClassDefFoundError — 存在 JAR

    我有一个简单的 Spring MVC 应用程序 它从 LDAP 服务器查找一些用户详细信息 并使用 JSP 打印出一个简单的 HTML 页面 该应用程序在 Tomcat 6 上运行良好 它使用 Spring LDAP 1 3 1 和 LDA
  • 将变量传递到 CURLOPT_POSTFIELDS C++

    我正在尝试将变量传递到CURLOPT POSTFIELDS 我当前的代码 size t curl write void ptr size t size size t nmemb void stream std string cmd stat
  • 有没有办法询问 iOS 视图的哪个子视图具有第一响应者状态? [复制]

    这个问题在这里已经有答案了 在 Mac OS X 中 您可以这样找到第一响应者 self window firstResponder 在iOS中有什么方法可以做到这一点吗 或者您是否需要枚举子控件并发送isFirstResponder给每一
  • 如何使用 eclipse Nsight 仅使用一个 GPU 调试 CUDA

    我收到错误 所有 cuda 设备均用于显示 在调试时无法使用 使用Ubuntu 有没有什么方法可以使用 Nsight eclipse 仅使用一个 GPU 进行调试 我见过类似的解决方案 sudo 服务 lightdm 停止 杀死 X 但这也
  • 此版本的ChromeDriver仅支持Chrome版本93

    我有一个 Angular 项目 它使用 puppeteer 运行 Karma 偶尔会出现以下错误 11 13 43 E launcher session not created This version of ChromeDriver on
  • 如何简化三次贝塞尔曲线?

    我有一条三次贝塞尔曲线 由许多段组成 左图 它有一些粗糙的曲率 我需要让它像右图一样平滑 这个问题有点像 降噪 我该如何实现呢 有类似的线程here https stackoverflow com questions 3497694 sim