gpt4 book ai didi

perl - 如何使用 PDF 基元绘制实心和非实心圆?

转载 作者:行者123 更新时间:2023-12-04 17:28:41 25 4
gpt4 key购买 nike

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

使用贝塞尔曲线也有一些技巧,但你没有得到一个完美的圆,你必须在连接段中绘制它们。我不需要一个完美的圆圈,只要它看起来接近完美。

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

最佳答案

情况总是如此。 PDF 在基元中没有圆圈,只有贝塞尔曲线。 PDF 成像模型是从 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);
}

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

关于perl - 如何使用 PDF 基元绘制实心和非实心圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com