在PostScript上画圆很容易,我很惊讶PDF显然没有携带同样的原语。有很多商业库可以做到这一点,但它不应该比这更简单吗?
也有一些技巧使用贝塞尔曲线,但你没有得到一个完美的圆,你必须画他们在连接段。我不需要一个完美的圆,只要它看起来接近完美。
我这样做是作为PDF-EasyPDF Perl模块的一个补充,但语言不是我需要帮助的部分。
在PostScript上画圆很容易,我很惊讶PDF显然没有携带同样的原语。有很多商业库可以做到这一点,但它不应该比这更简单吗?
也有一些技巧使用贝塞尔曲线,但你没有得到一个完美的圆,你必须画他们在连接段。我不需要一个完美的圆,只要它看起来接近完美。
我这样做是作为PDF-EasyPDF Perl模块的一个补充,但语言不是我需要帮助的部分。
3条答案
按热度按时间elcex8rz1#
PDF的图元中没有圆,只有边框。PDF成像模型是从PostScript成像模型构建的,它本身只提供使用arc/arcto图元的圆,这些图元本身是用边框实现的。
奇怪的是,我不得不在我正在编写的一些生成PDF的测试代码中调用这个确切的任务。下面是我是如何做到的:
假设
PdfGraphics
是一个输出PDF命令的类,那么g.MoveTo(x, y)
在内容流中将变成“x y m”。(自然是PDF)。这假设圆或椭圆将在原点绘制。要将其移动到其他位置,首先做一个平移变换或修改代码以减去所需的原点。2该代码给出了大约1/1250(约0.08%)的最坏情况误差和1/2500(约0.04%)的平均值。lsmepo6l2#
plinth的答案和我最终发现的是一样的。有很多棘手的数学问题,可以简化为一个神奇的常数,并将任务细分为四个独立的贝塞尔曲线。我需要在原始PDF命令中完成这一点,但过程是一样的。
$x3
和$y3
值),下标来自大多数人使用的贝塞尔曲线控制点标签。$magic
值出现的地方。f
结束,以绘制刚刚创建的路径的内部。我可以做一些重构,但是当我使用这个的时候,很容易看出我通过单独的代码块得到了正确的标志。这是我添加到PDF::EasyPDF的子例程:
eoxn13cs3#
这两个其他的答案都是完美的,但我只想为实心填充圆 (因此没有笔画) 的特定情况添加一个小技巧。
简单地画一条零长度的线,线的粗细是圆的直径,但将“线帽”设置为
rounded
。这显然不是椭圆、圆弧、线段和许多相关形状的好解决方案......但它是一个很酷的技巧。