如何“陷阱”我表面补丁,以防止通过裂缝出血的背景是什么?(How to “trap” my surf

2019-07-31 08:45发布

在回答挑战的comp.lang.postscript,我的工作,我的3D扒试图呈现一个圆柱体作为投影矩形补丁。 但我仍然看到即使我注释掉了画线,因为补丁没有对接起来冲洗线框。

气缸通过沿z轴建模双遍历Z(-2。2,步骤4 / N)和θ(0 .. 360,步骤360 / N)。 矩形的四点是:

  • V1 =(R COS T,R罪T,z)的
  • V4 =(R COS T,R罪T,Z + DZ)
  • V2 =(R cos(T + dT)的,R罪(T + DT),z)的
  • V3 =(R cos(T + dT)的,R罪(T + dt的)中,z + DZ)

然后,我们应用模型 - >世界旋转到所有四个点。 然后我们采取的载体V1-> v4和V1-> V2,做一个跨产品获得该修补程序的法向量。 取的点积与视线矢量,以检查补丁的形状的“这个侧”; 如果不是,则跳过图和PROCEDE到下一补丁(脱落环的底部)。 然后,我们采用透视投影到每个点,绘制与普通2D后记并通过MoveTo在了lineTo四边形。 在法向量的最后一个计算设置灰度级,然后填写。

所以,问题是:是否有一个通常的方式来处理这件事? 它是一个三维的问题或只是一个数字问题(浮点四舍五入类的东西)? 我只加一点蒙混因素,以我的DZ和dT的计算点的时候? 或中风的边缘明确? 最后这两个选项都产生所期望的结果,但我不能说,我很满意他们。 虽然每个化妆可以在个人说明中使用,它并没有真正解决问题 ,你知道吗?


我把正在使用的点转储。 下面是从N = 12的前几。 在我看来,作为预测,V2和V3与V1和乐队的下一张V4精确地重合。 这些都是2D“用户坐标”传递给movetolineto产生个别四边形。 由于CTM不会改变,这点应映射到相同的像素,对不对? 因此它似乎是一个非常类似的问题,以链接的问题。 但我使用后记正是因为我不想渣土,大约有写我自己的日常光栅:)。 我确实认为从链接的问题,映射到后记该溶液中,将扭转交替棋盘正方形,至少对于甚至N.这样的取向,所有相应的边缘在同一方向上进行拉伸(如彼此)。

[-2.64550757 2.08465409]
[-3.00470281 1.69015563]
[-2.7090168 1.69015563]
[-2.38403082 2.08465409]

[-3.00470281 1.69015563]
[-3.28940701 0.936108589]
[-2.96660638 0.936108589]
[-2.7090168 1.69015563]

[-3.28940701 0.936108589]
[-3.4 -0.0666666701]
[-3.0666666 -0.0666666701]
[-2.96660638 0.936108589]

[-3.4 -0.0666666701]
[-3.28940701 -1.05890918]
[-2.96660638 -1.05890918]
[-3.0666666 -0.0666666701]

[-3.28940701 -1.05890918]
[-3.00470281 -1.78584146]
[-2.7090168 -1.78584146]
[-2.96660638 -1.05890918]


我添加了一个简单的光照模型和调整其带出更多的中音。 输出JPEG不会出现问题,可能是由于有损压缩。 所以这里有一个PNG快照。

效果更为明显,如果我使用眼矢量作为光源。 这里的xpost在显示上表示在DZ和DT是由1.06修正因子乘以修改权的问题和GS的左侧。

和代码: 请不要使用此代码。 有一个在常规MATMUL一个错误。 可修正程序在这里 。 已完成可挑战这里 。 ]

%!
%A shaded cylinder! Woohoo!

%(mat.ps) run
%!
%mat.ps
%Matrix and Vector math routines

/.error where { pop /signalerror { .error } def } if

/dot { % u v
    2 copy length exch length ne {
        /dot cvx /undefinedresult signalerror
    } if
    % u v
    0 % u v sum
    0 1 3 index length 1 sub { % u v sum i
        3 index 1 index get exch % u v sum u_i i
        3 index exch get % u v sum u_i v_i
        mul add % u v sum
    } for % u v sum

    3 1 roll pop pop % sum
} bind def

% [ x1 x2 x3 ] [ y1 y2 y3 ]  cross  [ x2*y3-y2*x3 x3*y1-x1*y3 x1*y2-x2*y1 ]
/cross { % u v
    dup length 3 ne
    2 index length 3 ne or {
        /cross cvx /undefinedresult signalerror
    } if
    % u v
    exch aload pop 4 3 roll aload pop % x1 x2 x3 y1 y2 y3
    [
        5 index 2 index mul % ... [ x2*y3
        3 index 6 index mul sub % ... [ x2*y3-y2*x3
        5 index 5 index mul % ... [ x2*y3-y2*x3 x3*y1
        8 index 4 index mul sub % ... [ x2*y3-y2*x3 x3*y1-x1*y3
        8 index 5 index mul % ... [ x2*y3-y2*x3 x3*y1-x1*y3 x1*y2
        8 index 7 index mul sub % ... [ x2*y3-y2*x3 x3*y1-x1*y3 x1*y2-x2*y1
    ]
    7 1 roll 6 { pop } repeat
} bind def

/transpose { STATICDICT begin
    /A exch def
    /M A length def
    /N A 0 get length def
    [
    0 1 N 1 sub { /n exch def
        [
        0 1 M 1 sub { /m exch def
            A m get n get
        } for
        ]
    } for
    ]
end } dup 0 6 dict put def

/matmul { STATICDICT begin
    /B exch def
    B 0 get type /arraytype ne { /B [B] def } if
    /A exch def
    A 0 get type /arraytype ne { /A [A] def } if
    /Q B length def
    /R B 0 get length def
    /P A length def
    Q A 0 get length ne {
        /A A transpose def
        /P A length def
        Q A 0 get length ne {
            A B end /matmul cvx /undefinedresult signalerror
        } if
    } if

    [
    0 1 R 1 sub { /r exch def
        [
        0 1 P 1 sub { /p exch def
            0
            0 1 Q 1 sub { /q exch def
                A p get q get
                B q get r get mul
                add
            } for
        } for
        ]
    } for
    ]

end } dup 0 10 dict put def

%u v {operator}  vop  u(op)v
%apply a binary operator to corresponding elements
%in two vectors producing a third vector as result
/vop { 1 dict begin
    /op exch def
    2 copy length exch length ne {
        /vop cvx end /undefinedresult signalerror
    } if

    [ 3 1 roll % [ u v
    0 1 2 index length 1 sub { % [ ... u v i
        3 copy exch pop get % u v i u_i
        3 copy pop get      % u v i u_i v_i
        op exch pop         % u v u_i(op)v_i
        3 1 roll            % u_i(op)v_i u v
    } for % [ ... u v
    pop pop ]

end } def


%length of a vector
/mag { 0 exch { dup mul add } forall } def

% x y z ang -> x y' z'
/rotx { 3 dict begin
    /theta exch def
    /z exch def
    /y exch def
    y theta cos mul
    z theta sin mul sub
    y theta sin mul
    z theta cos mul add
end } def

% x y z ang -> x' y z'
/roty { 4 dict begin
    /theta exch def
    /z exch def
    /y exch def
    /x exch def
    x theta cos mul
    z theta sin mul add
    y
    x theta sin mul neg
    z theta cos mul add
end } def

% x y z ang -> x' y' z
/rotz { 4 dict begin
    /theta exch def
    /z exch def
    /y exch def
    /x exch def
    x theta cos mul
    y theta sin mul sub
    x theta sin mul
    y theta cos mul add
    z
end } def

% x y z -> x' y' z'
/model {
%ang roty
%ang .25 mul rotx
%alpha rotz
beta roty
gamma rotx
} def

% Eye coords
/ex .1 def
/ey .1 def
/ez 5 def
/eyedir [ex ey ez]
    dup mag [ exch dup dup ]{div} vop
def

% x y z -> X Y
/project {
3 dict begin
    /z exch def
    /y exch def
    /x exch def
    1 ez z sub div
    x ez mul z ex mul sub
    1 index mul
    y ez mul z ey mul sub
    3 2 roll mul
end } def

/light
    [ 3 -7 -2 1 ]
    dup mag [ exch dup dup dup ]{div} vop
def
/Ia .4 def % Incident Ambient Intensity
/Ka .4 def % Ambient Diffuse reflection constant
/Il .5 def % Incident intensity of Lightsource
/Kd .3 def % Diffuse reflection constant

%h R N
/cylinder { 20 dict begin
    /N exch def
    /R exch def
    /h exch def
    /dz 1 N div def
    /dt 360 dz mul def
    /hdz h dz mul def

    0 dz 1 dz sub {
        h mul h 2 div sub /z exch def

        0 dt 360 { /t exch def
            /v1 [ t cos R mul
                t sin R mul
                z ] def
            /v4 [ v1 aload pop pop
                z hdz add ] def
            /t t dt add def
            /v2 [ t cos R mul
                t sin R mul
                z ] def
            /v3 [ v2 aload pop pop
                z hdz add ] def
            [ v1 v2 v3 v4 ] {
                aload 4 1 roll model 4 3 roll astore pop
            } forall
            /normal v4 v1 {sub} vop
                    v2 v1 {sub} vop
                    cross def
            /nlen normal mag def
            /normal normal [nlen nlen nlen] {div} vop def
            [normal aload pop 1] [eyedir aload pop 1] dot 0 lt {
                /action { moveto /action { lineto } def } def
                [ v1 v2 v3 v4 ]
                { aload pop project action }
                forall
                closepath
%                gsave
                    [normal aload pop 1]
                    light
                    %[ex ey ez neg 1] %"radiant"
                    dot
                    Il Kd mul mul
                    Ia Ka mul add
                    setgray
                    fill
%                grestore
%                stroke
            } if

        } for
    } for
end } def

300 400 translate
280 dup dup moveto
dup neg dup neg lineto
dup neg dup lineto
dup neg lineto closepath .6 setgray fill
1 70 dup dup scale div setlinewidth

%/beta 0 def
%/gamma 0 def
%4 2 50 cylinder

/beta 90 def
/gamma 0 def
4 2 50 cylinder

%/beta 0 def
%/gamma 90 def
%4 2 50 cylinder

showpage   

Answer 1:

好吧,我想出的东西,坐落在肠道更容易一些。

6%捏造只是觉得到可怕的负担。

但肯建议四舍五入可以参与。 这意味着采取四舍五入的控制应该获得一个控制的一些措施上的问题。 而且看起来这是真的。

所以,我想在前面加上所有movetolineto与一个呼叫电话prep

/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

下面是由最后的程序所产生的图像中的一个,一个斯坦梅茨固体与坐标轴和随机颜色,在一稍微倾斜的角度(其右脚伸出一点)。



文章来源: How to “trap” my surface patches to prevent the background from bleeding through the cracks?