我正在尝试用两个圆柱体刺穿一个平行六面体,但我无法正确绘制这两个圆柱体......
以下是我得到的结果:
两个圆柱体位于盒子内,它们刺穿了黄色面板。如您所见,我的布局有问题……
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