gpt4 book ai didi

java - 如何使用二次贝塞尔曲线近似圆的八分圆?

转载 作者:行者123 更新时间:2023-12-02 10:56:04 26 4
gpt4 key购买 nike

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

我尝试使用公式4*tan(pi/(2*n))/3。要么这个公式不适用于八分圆,要么我在哪里找到它并没有得到很好的解释。

最佳答案

如果你说出你在哪里找到它,那将会有所帮助 - 任意角度的公式(显然包括八分圆,只需插入 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

你就完成了:你不需要推导任何其他值,因为所有其他八分圆只是这些值的反射(reflect),你只需在纸上画一个圆,画线来显示八分圆,用它的坐标值标记第一个八分圆,然后“哦,显然其他坐标是:...”——上面的公式也适用于半径为 1 的圆,但你知道怎么做相乘,这样您就知道如何缩放这些值,使其与您想要的圆相匹配。

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

此外,即使您一心只使用二次方程,您的软件的用户也可能会转向其他软件。他们希望立方体能够使用到这样的程度:如果你的软件的其余部分值得使用,他们会向你请求使用立方体。为此进行规划,或者理想情况下从一开始就支持二次和三次。毕竟,SVG 等已经这样做了。

关于java - 如何使用二次贝塞尔曲线近似圆的八分圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51729291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com