c++ - 生成三次贝塞尔椭圆弧的通用公式?

标签 c++ c algorithm graphics vector

我如何在 C 中实现一种简单的方法来为给定起点和终点的椭圆弧生成 2 个缺失的控制点?我不需要花哨的误差估计,只需要可以获取点 A 和 D 并为椭圆弧生成控制点 B 和 C 的东西,然后我可以在其中使用三次贝塞尔插值算法生成曲线。

有点像

void GetArcControlPoints(Point a, Point &b, Point &c, Point d)
{

.....
b = ...
c = ....
}

谢谢

最佳答案

你的问题背后的数学有一些缺陷:

  1. 贝塞尔曲线是单位区间 [0;1] 中参数 t 的多项式函数。椭圆是使用三角函数定义的,三角函数是超越的,因此不是代数的,因此也不是多项式的。您不能使用 Bézier 曲线(既不是三次曲线也不是任何阶数 n)生成椭圆弧。但是假设您只想近似椭圆弧。由于您没有指定近似值必须有多好,因此无法确保贝塞尔曲线对您来说“足够椭圆”。简而言之:您需要一个错误参数。

  2. 无限条椭圆弧通过给定的两个点。因此,这两个点没有提供足够的信息来指定一个椭圆,然后可以使用贝塞尔曲线对其进行近似圆弧。 更糟的是,由于您想要的是椭圆弧,而不是整个椭圆,因此您还必须指定弧必须“覆盖”多少椭圆,以百分比表示(100% = 整个椭圆) .../p>

在数学运算正确之前,您不能进入下一步(编码)。


编辑:

  1. 由于您需要一个完整的椭圆,我建议使用两个或四个 Bézier 面片而不是一条 Bézier 曲线。

  2. 您可以将椭圆视为在其中一个维度上“拉伸(stretch)”的圆。现在,由于“拉伸(stretch)”变换是线性的,而贝塞尔函数在控制点上是线性的,您可以计算近似 90 度圆弧的贝塞尔曲线的控制点,然后将“拉伸(stretch)”变换应用于控制点,瞧,您将获得近似“90 度”椭圆弧的贝塞尔曲线的控制点。得到整个椭圆就是重复这个过程四次。

关于c++ - 生成三次贝塞尔椭圆弧的通用公式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3349459/

相关文章:

c++ - c++语言引用

c - 如何在 C 中为表达式 long = short + short 强制整数提升

algorithm - 无向图算法

Windows 上的 iPhone 应用程序开发

c++ - 为什么转换函数声明不需要至少一个define-type-specifier

c++ - 局部变量与数组访问

c - 当我在作业中进行这种增量操作时,首先会发生什么?

c - 查找出现在数组一半以上元素中的常量

algorithm - 算法如何解释有向节点图

c++ - apache netbeans 11.3 C++插件超时,无法安装