Graphics 如何";陷阱“;我的表面补丁,以防止背景出血通过裂缝?
为了响应comp.lang.postscript中的一个命令,我正在整理我的3D排版,试图将圆柱体渲染为投影的矩形面片。但我仍然看到了线框,即使在我注释掉了线图之后,因为补丁没有对接齐平 圆柱体通过在z(-2..2,步骤4/N)和θ(0..360,步骤360/N)上的双循环沿z轴建模。矩形的四个点是:Graphics 如何";陷阱“;我的表面补丁,以防止背景出血通过裂缝?,graphics,3d,postscript,Graphics,3d,Postscript,为了响应comp.lang.postscript中的一个命令,我正在整理我的3D排版,试图将圆柱体渲染为投影的矩形面片。但我仍然看到了线框,即使在我注释掉了线图之后,因为补丁没有对接齐平 圆柱体通过在z(-2..2,步骤4/N)和θ(0..360,步骤360/N)上的双循环沿z轴建模。矩形的四个点是: v1=(Rcos T,Rsin T,z) v4=(Rcos T,Rsin T,z+dz) v2=(Rcos(T+dT),Rsin(T+dT),z) v3=(Rcos(T+dT)、Rsin(T+d
- v1=(Rcos T,Rsin T,z)
- v4=(Rcos T,Rsin T,z+dz)
- v2=(Rcos(T+dT),Rsin(T+dT),z)
- v3=(Rcos(T+dT)、Rsin(T+dT)、z+dz)
我记下了一大堆被使用的分数。这是N=12的前几个。 在我看来,正如预测的那样,v2和v3与乐队下一首曲子的v1和v4完全吻合。这些是传递给
moveto
和lineto
的二维“用户坐标”,以生成各个四边形。因为CTM不变,这些点应该映射到相同的像素,对吗?因此,这似乎是一个与相关问题非常相似的问题。但我使用Postscript正是因为我不想胡乱编写自己的光栅化例程:)。我真的认为,映射到Postscript的链接问题的解决方案是反转交替棋盘格正方形的方向,至少对于N。这样,所有对应的边都在相同的方向上绘制(彼此相同)
好吧,我想出了一个更容易消化的方法 6%的捏造让人觉得难以忍受 但肯表示,四舍五入可能涉及其中。这意味着控制舍入应该可以在一定程度上控制问题。看起来这是真的 因此,我尝试通过调用
prep
预先结束所有moveto
和lineto
调用:
/prep {
transform
%2 {
% exch
%floor
round
%ceiling
%2 mul cvi 2 div %round
%} repeat
itransform
} def
这些评论展示了我尝试过的各种作品。两个设备坐标的四舍五入消除了所有水平引气线,并留下非常薄的垂直引气。假设Ghostscript通过水平扫描线光栅化,这似乎是有道理的:只需一点帮助,水平扫描线就更容易实现,但近垂直扫描线则更难实现
但后来我把这和捏造结合起来了。我发现,仅将设备y坐标四舍五入,并将贴片尺寸调整2%,可以消除所有出血。它真的照亮了这个蝙蝠洞
我认为2%是可以接受的捏造水平。(?)
不幸的是,当您调整N(切片数)的值时,上述所有内容都需要调整。覆盖整个曲面的最简单方法是以与填充相同的颜色对边进行笔划。这里唯一的难点是确保线宽适合比例。最简单的方法就是把它们放在一起。对于非常高的分辨率,可能应该以某种方式对其进行调整,以考虑N
1 70 dup dup scale div setlinewidth
这是最后一个程序生成的图像之一,一个带有坐标轴和随机颜色的Steinmetz实体,在稍微倾斜的透视图中(它的右脚稍微突出)
您可能需要放大才能看到它。但是我告诉你有裂缝,裂缝!!我认为您看到了舍入问题,您是否在多个PostScript解释器上尝试过这种方法(如果这是Ghostscript输出,则使用定点内部表示)?不同的分辨率如何?你可能对一个类似的问题感兴趣。@AlexeyFrunze我试着颠倒备用补丁的点数顺序,但我没有注意到任何变化。你在什么地方做得不对。与答案中的代码相比,看看你做的有什么不同。请注意光栅化三角形的整个代码。
/prep {
transform
%2 {
% exch
%floor
round
%ceiling
%2 mul cvi 2 div %round
%} repeat
itransform
} def
1 70 dup dup scale div setlinewidth