我正在尝试从 Postscript/SVG 路径重建原始图形基元。因此,原始圆被渲染(在 SVG 标记中)为:
<path stroke-width="0.5" d="M159.679 141.309
C159.679 141.793 159.286 142.186 158.801 142.186
C158.318 142.186 157.925 141.793 157.925 141.309
C157.925 140.825 158.318 140.432 158.801 140.432
C159.286 140.432 159.679 140.825 159.679 141.309" />
这是使用 4 条贝塞尔曲线创建一个圆的近似值。在其他地方,圆弧由连接的贝塞尔曲线近似。
我的问题是是否有一种算法可以用来识别这种构造并重建“最佳”圆。我不介意小错误——它们在最坏的情况下会是二阶的。
更新:请注意,我不知道这是一个圆形还是一个弧形的先验 - 它可以是任何东西。曲线上可能有 2、3 4 甚至更多的点。所以我真的很喜欢这样的功能:
error = getCircleFromPath(path)
whereerror
将早期指示这是否可能是一个圆圈。
[我同意,如果我知道这是一个圆圈,那就更容易解决问题了。]
更新:@george 在某种程度上回答了我的问题,但我认为这不是全部。
在转换到原点和归一化后,我似乎在曲线上有以下四个点:
point [0, 1] with control point at [+-d,1] // horizontal tangent
point [1, 0] with control point at [1,+-d] // vertical tangent
point [0, -1] with control point at [+-d,-1] // horizontal tangent
point [-1, 0] with control point at [-1,+-d] // vertical tangent
这保证了每个点的切线与该点的路径方向“平行”。它还保证了对称性(带反射的 4 倍轴。但它不保证圆形。例如,较大的值d
将给出圆形框,较小的值将给出圆形菱形。
我的值d
似乎约为 0.57。这可能是 1/sqrt(3.) 或者可能是别的东西。这就是我要求的这种关系。
@george 给出弧的中点为;
{p1,(p1 + 3 (p2 + p3) + p4)/8,p4}
所以在我的例子中(对于 1,0 到 0,1)这将是:
[[1,0]+3[1,d]+3[d,1]+[0,1]] / 8
即
[0.5+3d/8, 3d/8+0.5]
如果 d =0.57,这给出 0.71,所以也许 d 是
(sqrt(0.5)-0.5)*8./3.
这适用于方形菱形,但对于圆弧,公式必须更通用,如果有人拥有它,我将不胜感激。例如,我不熟悉贝塞尔数学,所以@george 的公式对我来说是新的
enter code here