问题布局 pst-solides3d

问题布局 pst-solides3d

我正在尝试用两个圆柱体刺穿一个平行六面体,但我无法正确绘制这两个圆柱体......

以下是我得到的结果: 在此处输入图片描述

两个圆柱体位于盒子内,它们刺穿了黄色面板。如您所见,我的布局有问题……

1°前圆柱体不与侧面板相交

2° 第二个圆柱体与第一个相同,因此它应该穿过黄色面板,但没有画出来……

此外,我尝试改变观点,但结果却更糟……Why is the layout so dependant of the viewpoint ?

最后,但我不知道是否可以做到,黄色面板实际上有 2 个孔让圆柱体穿过它...我在文档中没有找到这样做的方法...如果你有什么想法...

这是我的代码:

\psset{unit=0.25}
\begin{pspicture}[showgrid=false](-15,-10)(10,10)
\psset{Decran=90, solidmemory, action=none}%, viewpoint=5 -10 10}
%%% Back
\psSolid[
   object=parallelepiped,%
   a=3.5, b=0.12, c=1.22,
    name=derriere]%
   (0, -2.0 b 2 div sub, c 2 div b sub)
%%% Base
\psSolid[
    object=parallelepiped,%
    a=3.5, b=4.0, c=0.12,
    fillcolor=black!20,
     name=fond]%
    (0,0,0 c 2 div sub)
%% Sides
\psSolid[
   object=parallelepiped,%
   a=0.12, b=4.0, c=1.1,
    name=coteg]%
   (-1.75 a 2 div add, 0, c 2 div)
\psSolid[
   object=parallelepiped,%
   a=0.12, b=4.0, c=1.1,
   name=coted]%
   (1.75 a 2 div sub, 0, c 2 div)
%%% Front
    \psSolid[
   object=parallelepiped,%
   a=3.5, b=0.12, c=1.22,
    fillcolor=yellow!50,
    %action=none,
   name=devant]%
   (0, 2.0 b 2 div add, c 2 div b sub)  
%%% Cylinders
    \psSolid[
        object=cylindrecreux,
        h=2,r=0.45,
        fillcolor=green!50,
        mode=4,
        incolor=black!50,
        RotX=-90,
        name=ant1]
        (a 4 div 0.1 sub, 0.2, 0.5)

    \psSolid[
        object=cylindrecreux,
        h=2,r=0.45,
        fillcolor=green!50,
        mode=4,
        incolor=black!50,
        RotX=-90,
        name=ant2]
        (-0.875, 0.2, 0.5)
   \psSolid[object=fusion,
         action=draw**,
    base=devant ant1 ant2 derriere fond coteg coted,
    ](0,0,0)
\composeSolid

\end{pspicture}

答案1

解释

当我观察了软件包文档中的例子后,问题就很明显了:你只是没有足够的细分来划分侧面fusion物体根本没有进行任何布尔运算,只是简单的把不可见的面片去掉。当面片不够密集的时候,就会出现你图中所示的效果。

解决方案

由于parallelepiped没有ngrid参数,我费了好大劲才缩放立方体。但随后我必须调整侧面的实际位移(它总是可以自动计算,但我很懒 XD)。现在你可以看到这并不完美,但它证明了我的观点:使用自定义对象总是更好,说赫伯特

在此处输入图片描述

我的丑陋代码...

\psset{unit=0.25}
\begin{pspicture}[showgrid=false](-15,-10)(10,10)
\psset{Decran=90, solidmemory, action=none}%,viewpoint=10 45 25 rtp2xyz}
%%% Back
\psSolid[
object=parallelepiped,%
a=3.5, b=0.12, c=1.22,
name=derriere]%
(0, -2.0 b 2 div sub, c 2 div b sub)
%%% Base
\psSolid[
object=parallelepiped,%
a=3.5, b=4.0, c=0.12,
fillcolor=black!20,
name=fond]%
(0,0,0 c 2 div sub)   
%% Sides
\psSolid[
object=parallelepiped,%
a=0.12, b=4.0, c=1.1,
name=coteg]%
(-1.75 a 2 div add, 0, c 2 div)
%%% Cylinders
\psSolid[
object=cylindrecreux,
h=2,r=0.45,
fillcolor=green!50,
mode=4,ngrid=25 18,
incolor=black!50,
RotX=-90,
name=ant1]
(a 4 div 0.1 sub, 0.2, 0.5)
\psSolid[
object=cylindrecreux,
h=2,r=0.45,
fillcolor=green!50,
mode=4,ngrid=25 18,
incolor=black!50,
RotX=-90,
name=ant2]
(-0.875, 0.2, 0.5)
%% Sides front
\psSolid[
object=cube,%
a=0.12, b=4.0, c=1.1,ngrid=2,
name=coted,transform={1 33.3 9.17 scaleOpoint3d}]%
(1.75 a 2 div sub, 0, c 2 div .49 sub)
%%% Front
\psSolid[
object=cube,%
a=3.5, b=0.12, c=1.22,ngrid=10,
fillcolor=yellow!50,transform={1 .0343 .3486 scaleOpoint3d},
%action=none,
name=devant]%
(0, 2.0 b 2 div add 58 add, c 2 div b sub .92 add)     
\psSolid[object=fusion,
action=draw**,transform={1 1 1 scaleOpoint3d},
base=devant ant1 ant2 derriere fond  coteg coted 
](0,0,0)
\composeSolid
\end{pspicture}

但请注意,在 的情况下,fusion如果transform={ a b c scaleOpiont3d}其他对象的代码位于其后面,则其中一个对象的 似乎也会影响其他对象。我必须使用transform={ 1 1 1 scaleOpiont3d}来消除这种影响...

在这种情况下,亲爱的@Herbert,是否可以ngrid=a b c为?创建一个新参数,并修复我在上一段中提到的parallelepiped问题?scaleOpoint3d

相关内容