加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:46:20 所属栏目:大数据 来源:网络整理
导读:在PostScript上绘制圆圈很容易,我很惊讶PDF显然没有传承那些相同的原语.有很多商业图书馆可以做到这一点,但它不应该比这简单吗? 还有一些使用Bézier曲线的技巧,但你没有得到一个完美的圆,你必须在连接段中绘制它们.只要它看起来接近完美,我就不需要一个完
在PostScript上绘制圆圈很容易,我很惊讶PDF显然没有传承那些相同的原语.有很多商业图书馆可以做到这一点,但它不应该比这简单吗?

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

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

解决方法

情况总是如此. 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,yrad);
        g.CurveTo(xmagic,xrad,0);
        g.CurveTo(xrad,-ymagic,xmagic,-yrad,-yrad);
        g.CurveTo(-xmagic,-xrad,0);
    }

    private void DrawCircle(PdfGraphics g,double radius)
    {
        DrawEllipse(g,radius,radius);
    }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读