Javafx 椭圆和圆弧是正品吗?或者只是近似值?
Are Javafx ellipses and arcs genuine? Or just approximations?
我关注 the source code OpenJFX。 PathIterator
只支持SEG_LINETO
、SEG_QUADTO
、SEG_CUBICTO
,即直线和quadratic/cubic贝塞尔曲线。 ArcIterator
和 EllipseIterator
returns SEG_CUBICTO
,这意味着它将使用三次贝塞尔曲线段。由于三次贝塞尔曲线不能准确表示椭圆,我认为 Javafx 椭圆和圆弧不是真正的而是近似值。这样对吗?
两个 ArcIteratpr and EllipseIterator 迭代(真实的)椭圆并产生(一个或多个的序列)近似于所讨论的 arc/ellipse 的三次贝塞尔曲线。
所以不,当出于路径目的对它们进行迭代时,您不是在使用“真正的”圆弧和椭圆,而是Arc2D
和Ellipse2D
类 本身就是 100% 真实的圆弧和椭圆定义。获得 Béziers 的唯一时间是当它们被转换时“因为这样做是安全的”:当您做诸如将它们绘制到屏幕之类的事情时,您不需要精确的表示。他们只需要在 sub-pixel 水平上准确即可获得适当的 anti-aliasing.
那么:是吗?椭圆迭代器使用四个三次贝塞尔曲线,这是行业标准,因为它的构造非常简单,所以它与真正的椭圆有多接近?好吧,单个立方体和四分之一真椭圆之间的最大误差 is 0.00027 for a unit ellipse (i.e. a circle with radius 1)。从正确的角度来看,对于一个最宽为 20,000 像素的椭圆,最多相差 2.7 像素。或者,换句话说:对于最大宽度为 5,000 像素的椭圆来说,它的准确度足以 sub-pixel具有这种分辨率的设备。
您永远不会注意到这种差异。所以:不,三次贝塞尔曲线不能完美地表示椭圆,但是 可以 足够准确地表示它们,以至于与真实的东西无法区分。
我关注 the source code OpenJFX。 PathIterator
只支持SEG_LINETO
、SEG_QUADTO
、SEG_CUBICTO
,即直线和quadratic/cubic贝塞尔曲线。 ArcIterator
和 EllipseIterator
returns SEG_CUBICTO
,这意味着它将使用三次贝塞尔曲线段。由于三次贝塞尔曲线不能准确表示椭圆,我认为 Javafx 椭圆和圆弧不是真正的而是近似值。这样对吗?
两个 ArcIteratpr and EllipseIterator 迭代(真实的)椭圆并产生(一个或多个的序列)近似于所讨论的 arc/ellipse 的三次贝塞尔曲线。
所以不,当出于路径目的对它们进行迭代时,您不是在使用“真正的”圆弧和椭圆,而是Arc2D
和Ellipse2D
类 本身就是 100% 真实的圆弧和椭圆定义。获得 Béziers 的唯一时间是当它们被转换时“因为这样做是安全的”:当您做诸如将它们绘制到屏幕之类的事情时,您不需要精确的表示。他们只需要在 sub-pixel 水平上准确即可获得适当的 anti-aliasing.
那么:是吗?椭圆迭代器使用四个三次贝塞尔曲线,这是行业标准,因为它的构造非常简单,所以它与真正的椭圆有多接近?好吧,单个立方体和四分之一真椭圆之间的最大误差 is 0.00027 for a unit ellipse (i.e. a circle with radius 1)。从正确的角度来看,对于一个最宽为 20,000 像素的椭圆,最多相差 2.7 像素。或者,换句话说:对于最大宽度为 5,000 像素的椭圆来说,它的准确度足以 sub-pixel具有这种分辨率的设备。
您永远不会注意到这种差异。所以:不,三次贝塞尔曲线不能完美地表示椭圆,但是 可以 足够准确地表示它们,以至于与真实的东西无法区分。