三次贝塞尔曲线段

2023-11-21

如果我有描述贝塞尔曲线 P1、P2、P3、P4 的 4 个点(其中 P1 和 P4 是曲线的端点,P2 和 P3 是曲线的控制点),我怎样才能找到描述的点只是这条贝塞尔曲线的一部分?

我找到了这个answer这正是我正在寻找的,但答案似乎是错误的。如果我在代表整个贝塞尔曲线的方程中设置 t0=0 和 t1=1,则所得点无效。它们不等于原始点。

该解决方案似乎与 De Casteljau 算法有关,但我无法理解它是如何工作的。


Yes, De Casteljau 算法是要走的路。

参数化

如果您的曲线没有从 t=0 到 t=1 正确参数化,那么您似乎使用了错误的方程来描述您的曲线。维基百科有适合您的正确公式:

B(t) = (1−t)3 P1 + 3(1−t)2t P2 + 3(1−t)t2 P3 + t3 P4

[我将维基百科中的索引从零开始的形式调整为您问题中从一开始的形式。]

If you set t=0, you get P1, your starting point. If you set t=1, you get P4, your endpoint. In between, the shape of the curve is determined by those points and the two control points P2 and P3.

De Casteljau 算法

Let t be the parameter where you want to cut your curve. Let's say you want to keep only the initial part. You draw the three lines from P1 to P2, from there to P3 and from there to P4. Each of these lines you divide at a the fraction t of its length, i.e. the length of the line before the dividing point relates to the entire length as t : 1. You now have three new points P12 through P34. Do the same again to obtain two points P123 and P234, and again to obtain the single point P1234. This final point is B(t), the endpoint of your truncated curve. The startpoint is P1 as before. The new control points are P12 and P123 the way we just constructed them.

删除曲线的初始部分的方法相同。因此,只需两步,您就可以修剪曲线的两端。您将获得一组新的控制点,这些控制点精确地(根据您使用的数字精度)描述原始曲线的一段,不涉及近似值或类似的情况。

您可以将上述所有几何描述转化为代数公式,在完美的世界中,您应该得出以下结果这个答案对于你引用的问题。

唉,这似乎并不是一个完美的世界。在撰写本文时,这些公式仅使用二次多项式,因此无法描述三次曲线上的端点。正确的公式应该如下:

  • P'1 = u0u0u0 P1 + (t0u0u0 + u0t0u0 + u0u0t0) P2 + (t0t0u0 + u0t0t0 + t0u0t0) P3 + t0t0t0 P4
  • P'2 = u0u0u1 P1 + (t0u0u1 + u0t0u1 + u0u0t1) P2 + (t0t0u1 + u0t0t1 + t0u0t1) P3 + t0t0t1 P4
  • P'3 = u0u1u1 P1 + (t0u1u1 + u0t1u1 + u0u1t1) P2 + (t0t1u1 + u0t1t1 + t0u1t1) P3 + t0t1t1 P4
  • P'4 = u1u1u1 P1 + (t1u1u1 + u1t1u1 + u1u1t1) P2 + (t1t1u1 + u1t1t1 + t1u1t1) P3 + t1t1t1 P4

where u0 = 1 − t0 and u1 = 1 − t1.

请注意,在括号内的表达式中,至少某些项是相等的并且可以组合。我没有这样做,因为我相信这里所说的公式将使模式更加清晰。您可以简单地独立执行这些计算x and y计算新控制点的指示。

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

三次贝塞尔曲线段 的相关文章

  • Android 谷歌地图多边形点击事件[重复]

    这个问题在这里已经有答案了 我正在 Android 上开发地图应用程序 并且正在使用 Google Maps Android API V2 我从 Web 服务获取多边形数据 通过 XML 解析对其进行转换 然后可以毫无问题地将其显示在地图上
  • 获取包含位图支持的画布的 Android 视图上的点的像素颜色值

    我正在尝试找出获取给定点上像素颜色值的最佳方法View http developer android com reference android view View html 我可以通过三种方式写入视图 我设置了背景图像View setBa
  • 可被 N 整除的最小正数

    1 如何找到能被N整除的最小正数 并且它的各位数字和应该等于N 例如 N 结果 1 1 10 190 并且算法时间不应超过 2 秒 有什么想法 伪代码 pascal c 或 java 吗 设 f len sum mod 为 bool 这意味
  • 图像在 3D 空间中绕 Y 轴旋转

    我有一个 BufferedImage 我想用 theta 角而不是仿射变换绕 Java 中的 Y 轴旋转图像 图片 旋转将如下图所示 矩形将是图像 我可以通过旋转图像的每个像素并绘制图像来做到这一点 因为我必须旋转很多图像 所以我认为这不是
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a
  • 带伽玛参数的渐变色阶?

    我有一些对比度非常微弱且有相当多噪声的成像数据 当我用线性色阶显示它时 它显示得不好 在 imageJ 或 Photoshop 等成像软件中 有一条色调曲线 人们可以调整该曲线以非线性方式提高对比度 并有效地拉伸某些感兴趣区域的比例以查看更
  • 查找所有n位相邻数字为1的n位二进制数[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 让我用一个例子来解释一下 如果n 4
  • 计算 Adamic-Adar 的快速算法

    我正在研究图形分析 我想计算一个 N N 相似度矩阵 其中包含每两个顶点之间的 Adamic Adar 相似度 为了概述 Adamic Adar 让我从以下介绍开始 给定邻接矩阵A无向图的G CN是两个顶点的所有公共邻居的集合x y 两个顶
  • 判断一个点是否在直角三角形内

    我一直想知道最简单的方法来确定一个点是否位于三角形内 或者在这种情况下 判断一个点是否位于对角线切成两半的矩形内 假设我有一个 64x64 像素的矩形 对于这个矩形 如果传递的点位于矩形的左上角 我想返回 TRUE 值 否则返回 FALSE
  • JavaScript 或 IEEE-754 中的舍入怪癖?

    我在一个单元测试中遇到了一个奇怪的问题 我在 JavaScript 中得到了意外的舍入结果 2 005 toFixed 2 produces 2 00 2 00501 toFixed 2 produces 2 01 最初我怀疑这只是 Web
  • Math.random() 在 JavaScript 中如何工作?

    我最近想出了如何通过谷歌获取随机数 这让我思考如何Math random 工作 所以我在这里我无法弄清楚他们是如何做到 Math random 的 除非他们使用了类似时间的东西 有谁知道 JavaScript 是如何做到的吗 Math ra
  • 如何在 RSM (R) 中填充轮廓颜色并写入轴名称

    我有以下数据 ct lt structure list Conc c 50L 100L 150L 50L 100L 150L 50L 100L 150L 100L 100L 100L kGy c 10L 10L 10L 15L 15L 15
  • C# 中的反转数

    有没有一种简单的方法可以用函数反转 C 中的数字 我正在使用 XNA 我想告诉我的程序 如果我的 变量 超过某个数字 它必须反转它的值 重点是提供反弹效果 if ballPosition X gt screenWidth Invert th
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • javascript的随机实现在各种浏览器中的可信度如何?

    我想做一些关于 javascript 和加密的实验 我很好奇随机函数的实现是如何不可预测的 有人做过硬测试吗 显然 浏览器有能力生成强随机性 对于 ssl 问题是它们是否赋予 javascript 相同的强度 一般来说 随机函数在加密方面并
  • Android - 如何获取文本视图中字符的坐标

    是否可以从 Android 中的 TextView 中的字符获取 x 坐标 我不是在寻找 TextView 本身的坐标 我需要 TextView 中最后一个字符的坐标 多行 提前致谢 Java解决方案 以下是如何获得x and y特定字符的
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C 中的浮点运算是否具有结合律?

    加法在数学上具有结合律 a b c a b c 在一般情况下 此属性不适用于浮点数 因为它们表示有限精度的值 作为优化的一部分 从 C 程序生成机器代码时 编译器是否允许进行上述替换 C标准中到底在哪里说的 不允许编译器执行 优化 这将导致

随机推荐

  • 如何声明也符合协议的特定类的属性?

    假设我想创建一个属性 它是 UIViewController 的子类 并且也符合协议 MyDelegateProtocol 在 Objective C 中我会写这样的东西 property strong nonatomic UIViewCo
  • 如何在Java中使用自动代理配置脚本

    我的 Internet Explorer 设置为具有用于 Web 访问的自动代理文件 所谓的 PAC 有没有办法在我的 Java 程序上使用它 我的下面的Java代码似乎根本没有使用代理 ArrayList
  • 如何在 R 中指定 3d 绘图的相机视角?

    我想更改我的plotly 3d 散点图的默认相机视角 但从帮助中不清楚应该如何完成此操作 我知道布局参数应包含在命名列表中 但无法使其适用于 眼睛 向上 和 中心 相机参数 https plot ly r reference layout
  • 在 gradle 中将参数传递给编译器和 javadoc

    我正在尝试提供 Gradle 作为现有项目的替代构建系统 该项目利用sun misc Unsafe这会导致像这样的警告 warning Unsafe is internal proprietary API and may be remove
  • git:如何将拉取请求合并到分支中?

    我的情况如下 我有一个开源 github 项目的分支 我在开发分支的分支中的分叉存储库中进行所有开发 在主存储库的开发分支中有一个我需要的未合并的拉取请求 为了测试未合并的拉取请求 我创建了一个新目录并将原点克隆到其中 然后将未合并的请求提
  • 基于 Spring MVC LocaleChangeInterceptor 注解不起作用

    import java util Locale import org springframework context MessageSource import org springframework context annotation B
  • 如何在谷歌协作笔记本中显示绘图输出?

    我搜索了一整天如何在谷歌合作 Jupyter 笔记本中显示绘图的输出 有一个 stackoverflow 问题 还有谷歌合作实验室的官方教程 但它们都不适合我 官方链接 https colab research google com not
  • Flink 一次性消息处理

    我已经设置了一个包含 2 个 JobManager 和 3 个 TaskManager 的 Flink 1 2 独立集群 并使用 JMeter 通过生成 Kafka 消息 事件来对其进行负载测试 然后进行处理 处理作业在 TaskManag
  • Opencv - 如何合并两个图像

    我是 opencv 的新手 我在互联网上搜索是否有如何合并两个图像的示例 但没有找到任何可以帮助我的东西 有人可以帮我提供一些指示或小代码来理解吗 提前致谢 从评论到问题 你说 我不想将第一张图片的一半与第二张图片的另一半混合 我只想打印两
  • 如何获取 WCF 服务正在侦听的端口?

    我有一个 net tcp WCF 服务 我希望操作系统选择它应该侦听的端口 所以我在 URI 中将端口设置为 0 并且netstat确认操作系统已选择 5000 范围内的端口 如何在服务进程内以代码形式找到已选择的实际端口 一些代码显示我已
  • 如何摆脱投影仪中的导航栏?

    如何删除从投影仪乳胶文件生成的每张幻灯片顶部的部分和小节的导航栏 我正在使用 beamerthemesplit 包 Beamer 有不同的主题可供您使用 其中一些包含导航栏 有些则不包含 例如 默认主题不包含任何导航栏 Beamer 提供的
  • 在 Win32 Delphi 应用程序中存储用户首选项和设置的最佳实践是什么?

    我想在我的 Delphi Win32 应用程序中存储用户首选项 颜色 工具栏开 关 面板宽度 以像素为单位 和应用程序设置 最后 10 个文件 默认保存目录 默认打开目录 这样做的最佳实践是什么 您有两个主要选择 将设置存储在用户配置文件下
  • 从哪里获取 11.2.0.3 的 Oracle jar 文件 - xdb、aq、i18n、xmlparser

    我正在尝试更新旧版 Java 应用程序以与 Oracle 11g 版本 11 2 0 3 兼容 该应用程序在 Oracle 10g 版本 10 2 0 4 上运行并使用 Oracle Advanced Queues 它声明了 Maven 依
  • 由于 Errno::EPERM,Unicorn 无法在 Vagrant 盒子上启动

    当我运行以下命令在我的 Vagrant box ubuntu 12 04 2 server i386 上启动 Sinatra 应用程序的 Unicorn 时 sudo unicorn c unicorn rb E development D
  • 为什么我不能在 Swift 中使用泛型类型的子类?

    为什么 Swift 不允许我赋值Foo u 到一个类型的变量Foo u
  • iTextSharp 生成的 PDF 现在会在 Adob​​e Reader X 中出现“保存”对话框

    我使用 iTextSharp 生成 PDF 文档已有一年多了 不幸的是 随着 Adob e Reader X 的发布 我的 PDF 现在会出现 您要保存吗 关闭 PDF 文档时出现的对话框 对于不是使用 iTextSharp 生成的 PDF
  • 如何处理 C++ 构造函数失败的情况?

    我想在类构造函数中打开一个文件 有可能打开失败 导致对象构建无法完成 如何处理此故障 抛出异常 如果这是可能的 如何在非抛出构造函数中处理它 如果对象构造失败 则抛出异常 另一种选择是可怕的 如果构造成功 您将必须创建一个标志 并在每个方法
  • 我应该同时使用 SocialAuthenticationFilter 和 ProviderSignInController

    In Short 使用 ProviderSigninController 时不会触发身份验证事件 如何使用完整的 Spring Security 集成 长版 据我所知 我有一个功能性的 Spring social 设置 工作原理如下 Pro
  • Android - 使用光标适配器在 ListView 中设置时间戳格式

    我正在使用 SimpleCursorAdapter 来填充 Android ListView 并且想知道应该如何获取从数据库获得的所有时间戳 每个时间戳都在 DATE DATE 中转换为人类可读的日期 也许使用 SimpleDateForm
  • 三次贝塞尔曲线段

    如果我有描述贝塞尔曲线 P1 P2 P3 P4 的 4 个点 其中 P1 和 P4 是曲线的端点 P2 和 P3 是曲线的控制点 我怎样才能找到描述的点只是这条贝塞尔曲线的一部分 我找到了这个answer这正是我正在寻找的 但答案似乎是错误