Graphics 如何";陷阱“;我的表面补丁,以防止背景出血通过裂缝?

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

为了响应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+dT)、z+dz)
然后我们将模型->世界旋转应用于所有四个点。然后我们取向量v1->v4和v1->v2,做一个叉积得到面片的法向量。取一个带有眼向量的点积,检查贴片是否在形状的“这一侧”;如果没有,请跳过图形并继续下一个面片(从循环底部掉落)。然后,我们对每个点应用透视投影,并使用常规postscript 2D moveto和lineto绘制四边形。最后计算法向量以设置灰度,然后填充

所以问题是:有没有一个常规的方法来处理这个问题?这是一个3D问题还是仅仅是一个数值问题(浮点四舍五入之类的东西)?在计算积分时,我是否只需要在dz和dT中添加一点模糊因子?或者明确地画边?最后两个选项都产生了预期的结果,但我不能说我对它们感到满意。虽然每个品牌都可以用于单独的插图,但它并不能真正解决问题,你知道吗


我记下了一大堆被使用的分数。这是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