如何使用QUADRATIC Bezier曲线近似圆的OCTANT?

时间:2018-08-07 14:30:21

标签: java bezier ellipse approximation quadratic-curve

在我使用Java编写的矢量图形程序中,理想情况下,任何形状都可以通过使用 quadratic Bezier曲线的Path2D类的修改形式来表示。理想情况下,椭圆也可以表示为Path2D对象。互联网上有大量文献使用 cubic Bezier曲线近似圆的 quadrants ,但是使用Path2D类无法实现三次Bezier曲线。我一直在使用Desmos尝试寻找圆的 octant 的近似值,以及半径1的圆的中点(在两个控制点之间),圆的中心为{{ 1}}大约为(0, 0)。当然,有一些非理性数可以使用平方根或三角函数更精确地表示为公式。

我尝试使用公式(0.993, 0.412)。要么该公式不适用于八分圆,要么在我找到它的地方解释不清。

1 个答案:

答案 0 :(得分:1)

如果您说在哪里找到

t会有所帮助-任意角度的公式(显然包括八分圆,只需插入PI / 4作为您的角度)就与您所显示的完全不同。在https://pomax.github.io/bezierinfo/#circles上找到真实的公式和解释。

在控制点是端点切线的线性交点的意义上,二次曲线非常简单。因此,给定具有垂直切线的起始点(1,0)(因为它是一个圆,这就是圆的工作方式)和给定角度phi的端点(cos(phi),sin(phi))和正切(sin(phi)) ,-cos(phi)),我们可以将该曲线的控制点确定为:

Cx = cos(phi) - b * sin(phi)
Cy = sin(phi) + b * cos(phi)

其中:

    cos(phi) - 1
b = ------------
      sin(phi)

(上面链接中说明了这里的实际数学运算法则。)

插入PI / 4来计算第一个八分位数意味着:

Cx = 1 (obviously; it's a vertical tangent, so the x coordinate is fixed)
Cy = sqrt(2) - 1

您已经完成了:您不需要推导任何其他值,因为所有其他八分位图只是这些值的反映,而您实际上只是在纸上通过画出一个圆,画线以显示八分圆,用坐标值标记第一个八分圆,然后走“哦,显然其他坐标是:...”-上面的公式也适用于半径为1的圆,但是您知道进行乘法运算,以便您知道如何缩放值以使其与所需的圆匹配。

我很好奇为什么要使用二次曲线,因为与三次曲线相比,它们在客观上非常糟糕。例如:您需要16个点来建模具有二次八分圆的圆,而立方四分之一只需要12个点,则精度更高。

此外,即使仅使用二次方就死定了,您的软件用户也可能会迁移到其他软件。他们希望,如果您的其余软件值得使用,那么立方将可为您提供请愿书。为此进行规划,或者理想情况下从一开始就支持二次方和三次方。毕竟,SVG等已经可以了。