pgfplots 中的 Coons 补丁

pgfplots 中的 Coons 补丁

当前绘制 Coons 补丁的方法pgfplots需要四条三次贝塞尔曲线以及每个角点的点元值。这与 PDF 规范中使用的格式非常接近。我目前正在创建一个大的阴影区域,并注意到每个表面都是单独创建的,每次都使用边缘标志f = 0。我觉得这种方法未能充分利用 PDF 规范提供的以前的贝塞尔曲线的重用。查看pgfplots表面着色库,我注意到下有一个\pgfplotslibrarysurf@edgeflag选项\pgfplotslibrarysurf@type=6。虽然我意识到 Coons 补丁主要用于内部使用,但我希望在指定 Coons 补丁的坐标时有一种方法可以定义边缘标志。

或者,是否有更好的方法将 Coons 补丁包含在 pdfLaTeX 文档中?提供的界面pgfplots已经允许我获得正确的可见结果,但对于几个大型图,会产生相当大的文件。使用边缘标志会将每个表面的坐标数从 24 个减少到 16 个(每个 3 个字节),将颜色数据从 4 个减少到 2 个(每个 2 个字节),从而将每个补丁的大小从 81 个减少到 53 个。我不确定这有多难实现,但由于它看起来已经很接近了,而且有可能显著降低图的复杂性,所以这似乎是一个值得思考的问题。

答案1

作为的作者pgfplots,我自然对您的问题感兴趣,并且我很尊重您查找 PDF 规范详细信息的努力。

简短的回答是:针对 Coons 补丁(影响patch type=bilinear|biquadratic|bicubic大多数其他patch typespatchplots)的基于坐标的压缩将是一项功能请求pgfplots

让我强调一下你自己的话,这纯粹是关于 pdf 的大小,而不是关于结果(不受影响)。

关于“在 pdflatex 中包含 Coons 补丁的更好方法”可能会给出其他答案。


我相信这回答了 TeX.sx 的范围问题。但是,我个人对这个话题很感兴趣,所以我想指出一些细节。如果您想讨论细节,可以通过邮件联系我;我担心在这里进行冗长的讨论会偏离主题。

我可以告诉你,尊重 中的边缘标志pgfplots需要相当多的编程工作 - 而最便宜的部分是后端驱动程序(它会默默地省略坐标)。问题是绘图处理程序需要 (a) 知道补丁的顺序或 (b) 需要自动比较相邻的补丁。前者似乎通常很困难和/或笨拙,甚至在 的情况下是不可能的z buffer=sort,而后者需要编程工作和仔细测试。

因此,一方面,您需要编写支持 - 不知道它会有多复杂,但无论如何。您确定节省的成本值得付出努力吗?毕竟,您仍然有 pdf 压缩。根据您的估计,您能节省多少(即您的应用程序中有多少个补丁)?300kb?更多?更少?更多?

我一直认为这些文件的大小并不重要只要它是“合理的”。而且pgfplots已经非常紧凑(例如,与 matlab 的插值阴影生成的 pdf 相比)。


编辑:我做了一个简单的计算:24*24 Coons 块矩阵将节省 20KB 未压缩的 pdf 大小。假设压缩率为 2:1,您将节省 10KB。

24*24 可能是合理的:如果您有更细的网格宽度,您可能无法在视觉上将 Coons 补丁与简单的三角形阴影(其空间要小得多)区分开来。

计算如下:假设您有一个 25 乘以 25 个网格点的网格。这将划分出 24*24 = 576 个单元格。假设每个单元格都使用 Coons 补丁进行着色。目前,pgfplots 将占用 576*81 = 46656 个字节来进行此着色。使用您建议的优化后,它将是 576*53 = 30528。节省:~20KB(未压缩)。还是我搞砸了计算(这不是第一次……)?

相关内容