0

在我使用 Java 编写的矢量图形程序中,理想情况下,任何形状都可以由 Path2D 类的修改形式表示,该类使用二次贝塞尔曲线。理想情况下,椭圆也可以表示为 Path2D 对象。互联网上有大量文档使用三次贝塞尔曲线逼近圆的象限,但使用 Path2D 类,三次贝塞尔曲线是不可能的。我一直在使用 Desmos 试图找到一个圆的八分圆的近似值,一个以 为中心的半径圆的中点(两个控制点之间)大约是1(0, 0)(0.993, 0.412). 当然,有一些无理数可以更精确地表示为使用平方根或三角函数的公式。

我曾尝试使用公式4*tan(pi/(2*n))/3。该公式不适用于八分圆,或者在我找到它的地方没有得到很好的解释。

4

1 回答 1

1

如果你说你在哪里找到它会有所帮助 - 任意角度的公式(显然包括八分圆,只需插入 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 个点来模拟一个具有更高精度的立方四分之一。

此外,即使您只使用二次方程,您的软件用户也可能会转向其他软件。如果您的软件的其余部分值得使用,他们希望可以使用cubics 来请求您使用它们。为此做好计划,或者理想情况下从一开始就支持二次和三次。毕竟,SVG 等已经做到了。

于 2018-08-09T16:01:25.080 回答