ответ плинтуса - это то же самое, что я в конце концов нашел. Есть много хитрой математики, которая сводится к магической константе и делит задачу на четыре отдельные кривые Безье.
Мне нужно было сделать это в необработанных командах PDF, но процесс тот же.
Перейти к началу первой кривой. Это центр круга минус радиус в любом направлении, которое вам нравится.
Вычислите конец кривой (значения $x3
и $y3
в этом коде). Индексы взяты из меток контрольной точки кривой Безье, которые используют большинство людей.
Определить контрольные точки. Вот где появляется значение $magic
.
Когда вы закончите с одним сегментом, сделайте следующий. В четырех сегментах нет ничего особенного, кроме того, что он хорошо работает в декартовых координатах с простыми сложениями и вычитаниями.
Если вы хотите заполнить, вы заканчиваете f
, чтобы нарисовать внутреннюю часть только что созданного пути.
Есть некоторый рефакторинг, который я мог бы выполнить, но поскольку я работал с этим, было намного легче увидеть, что я правильно понял знаки, имея отдельные блоки кода. Это подпрограмма, которую я добавил в PDF :: EasyPDF :
sub make_magic_circle
{
my( $pdf, # PDF::EasyPDF object
$center,
$r # radius
) = @_;
my( $xc, $yc ) = $center->xy;
my $magic = $r * 0.552;
my( $x0p, $y0p ) = ( $xc - $r, $yc );
$pdf->{stream} .= "$x0p $y0p m\n";
{
( $x0p, $y0p ) = ( $xc - $r, $yc );
my( $x1, $y1 ) = ( $x0p, $y0p + $magic );
my( $x2, $y2 ) = ( $x0p + $r - $magic, $y0p + $r );
my( $x3, $y3 ) = ( $x0p + $r, $y0p + $r );
$pdf->{stream} .= "$x1 $y1 $x2 $y2 $x3 $y3 c\n";
}
{
( $x0p, $y0p ) = ( $xc, $yc + $r );
my( $x1, $y1 ) = ( $x0p + $magic, $y0p );
my( $x2, $y2 ) = ( $x0p + $r, $y0p - $r + $magic );
my( $x3, $y3 ) = ( $x0p + $r, $y0p - $r );
$pdf->{stream} .= "$x1 $y1 $x2 $y2 $x3 $y3 c\n";
}
{
( $x0p, $y0p ) = ( $xc + $r, $yc );
my( $x1, $y1 ) = ( $x0p, $y0p - $magic );
my( $x2, $y2 ) = ( $x0p - $r + $magic, $y0p - $r );
my( $x3, $y3 ) = ( $x0p - $r, $y0p - $r );
$pdf->{stream} .= "$x1 $y1 $x2 $y2 $x3 $y3 c\n";
}
{
( $x0p, $y0p ) = ( $xc, $yc - $r );
my( $x1, $y1 ) = ( $x0p - $magic, $y0p );
my( $x2, $y2 ) = ( $x0p - $r, $y0p + $r - $magic );
my( $x3, $y3 ) = ( $x0p - $r, $y0p + $r );
$pdf->{stream} .= "$x1 $y1 $x2 $y2 $x3 $y3 c\n";
}
$pdf->{stream} .= "f\n";
}