如何使用PDF原语绘制填充和未填充的圆圈?

bri*_*foy 5 pdf perl

在PostScript上绘制圆圈很容易,我很惊讶PDF显然没有传承那些相同的原语.有很多商业图书馆可以做到这一点,但它不应该比这简单吗?

还有一些使用Bézier曲线的技巧,但你没有得到一个完美的圆,你必须在连接段中绘制它们.只要它看起来接近完美,我就不需要一个完美的圆圈.

我这样做是对PDF-EasyPDF Perl模块的补充,但语言不是我需要帮助的部分.

pli*_*nth 5

情况总是如此.PDF在原语中没有圆圈,只有贝塞尔曲线.PDF成像模型是根据PostScript成像模型构建的,PostScript成像模型本身仅使用arc/arcto基元提供圆,这些原语本身是根据贝塞尔曲线实现的.

奇怪的是,我打算在我正在研究的一些测试代码中执行这个确切的任务,生成PDF文件.我是这样做的:

    private void DrawEllipse(PdfGraphics g, double xrad, double yrad)
    {
        const double magic = 0.551784;
        double xmagic = xrad * magic;
        double ymagic = yrad * magic;
        g.MoveTo(-xrad, 0);
        g.CurveTo(-xrad, ymagic, -xmagic, yrad, 0, yrad);
        g.CurveTo(xmagic, yrad, xrad, ymagic, xrad, 0);
        g.CurveTo(xrad, -ymagic, xmagic, -yrad, 0, -yrad);
        g.CurveTo(-xmagic, -yrad, -xrad, -ymagic, -xrad, 0);
    }

    private void DrawCircle(PdfGraphics g, double radius)
    {
        DrawEllipse(g, radius, radius);
    }
Run Code Online (Sandbox Code Playgroud)

假设这PdfGraphics是一个喷出PDF命令的类,因此g.MoveTo(x, y)将在内容流中变成"xy m".我从Don Lancaster的神话般的解释中获取了我的数学和我的神奇数字(PDF,自然而然).这假设将在原点绘制圆或椭圆.要将其移动到其他位置,请先执行转换转换,或修改代码以在所需的原点中减去add.该代码给出的最差情况误差约为1/1250(约0.08%),平均值为1/2500(约0.04%).