首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接bezier曲线

连接bezier曲线
EN

Stack Overflow用户
提问于 2011-11-09 01:15:30
回答 2查看 5.6K关注 0票数 13

我有个问题。假设我们有一条由四个控制点定义的三次bezier曲线。现在假设,曲线从一个点切割,每个线段再次使用三次bezier曲线表示。那么,如果我们有两条这样的贝塞尔曲线B1和B2,有没有办法知道它们是否可以连接起来形成另一条贝塞尔曲线B?这是通过连接两条曲线来简化几何图形,并减少控制点的数量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-10 12:46:40

关于这个问题的一些思考。我认为存在带有控制点P1P2的初始贝塞尔曲线P0-P3

让我们在参数ta和tb上做两个细分。我们现在有两条子曲线(黄色)- P0-PA3PB0-P3。蓝色间隔丢失。PA1PB2 -已知的控制点。我们必须找到未知的P1P2

一些方程式

初始曲线:

代码语言:javascript
复制
C = P0*(1-t)^3+3*P1(1-t)^2*t+3*P2*(1-t)*t^2+P3*t^3

端点:

代码语言:javascript
复制
PA3 = P0*(1-ta)^3+3*P1*(1-ta)^2*ta+3*P2*(1-ta)*ta^2+P3*ta^3

PB0 = P0*(1-tb)^3+3*P1*(1-tb)^2*tb+3*P2*(1-tb)*tb^2+P3*tb^3

小曲线的控制点

代码语言:javascript
复制
PA1 = P0*(1-ta)+P1*ta => P1*ta = PA1 – P0*(1-ta)

PB2 = P2*(1-tb)+P3*tb => P2(1-tb) = PB2 – P3*tb

现在替换PA3方程中的未知点:

代码语言:javascript
复制
**PA3***(1-tb) = **P0***(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(**PA1** – **P0***(1-ta))+3*(1-ta)*ta^2*( **PB2** – **P3***tb)+**P3***ta^3*(1-tb)

(由于这样的格式化,一些乘法符号已经丢失)

这是一个向量方程,它包含两个关于两个未知数tatb的标量方程

代码语言:javascript
复制
PA3X*(1-tb) = P0X*(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(PA1X – P0X*(1-ta))+3*(1-ta)*ta^2*( PB2X – P3X*tb)+P3X*ta^3*(1-tb)

PA3Y*(1-tb) = P0Y*(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(PA1Y – P0Y*(1-ta))+3*(1-ta)*ta^2*( PB2Y – P3Y*tb)+P3Y*ta^3*(1-tb)

这个系统可以用数值和解析两种方式解决(事实上,Maple用非常-非常大的立方公式来解决它:( )

如果我们有一些有误差的点,那么就有必要为一些点(PA3PB0PA2PB1)建立超定方程系统,并用数值方法求解它,以最小化偏差。

票数 5
EN

Stack Overflow用户

发布于 2015-04-17 16:56:58

您将在这里找到一个非常简单的解决方案:https://math.stackexchange.com/a/879213/65203

拆分Bezier时,由第一个截面的最后两个控制点和第二个截面的前两个控制点形成的向量是共线的,它们的长度比率决定了拆分处的参数值。验证公共控制点是否与参数值匹配是一件很容易的事情(以避免意外共线的情况)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8054405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档