Я пытаюсь восстановить исходные графические примитивы из путей 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)
где error
даст раннее указание на то, вероятно ли это круг.
[Я согласен с тем, что если я знаю, что это круг, это более легкая проблема.]
ОБНОВЛЕНИЕ: @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