在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, 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%).