pst-solides3d 投影期间多边形被剪裁

pst-solides3d 投影期间多边形被剪裁

我在做一些看起来很简单的事情时遇到了困难,所以我希望我犯了一个幼稚的错误。

我正在尝试使用 pst-solides3d 中的 \psProjection 功能将多个多边形投影到平面上。

只要平面的法线朝下,我的多边形就能很好地投影。当平面向后倾斜(绕 y 轴旋转)时,一开始一切都很好。然而,一旦平面向后倾斜到足够的程度,我的多边形就会开始被剪裁并从上到下消失。当平面完全向后倾斜,法线朝上指向 z 轴时,图像已经完全从平面上消失了。

我是否对这些预测的工作方式存在误解?

我的最终目标是拥有 3 个像这样的平面,每个平面都有一张图片,并让它们相交以说明我正在研究的算法。如果 pstricks 不是实现此目的的理想方法,我很乐意提出其他建议。

\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-solides3d}

\begin{document}

\begin{pspicture}(0,0)(5,5)
    \psset{viewpoint=30 0 30 rtp2xyz,Decran=60,lightsrc=viewpoint}
    \psset{solidmemory}
    % Set normal in plane to [0.25 0 1 0] to reproduce
    \psSolid[object=plan,name=pp1,definition=equation,args={[1 0 0 0] 90}]
    \psset{plan=pp1}
\psProjection[object=polygone,fillstyle=solid,fillcolor=yellow,plan=pp1,args=-1 -0.5 1 -0.5 1 0.5 -1 0.5]
\psProjection[object=polygone,fillstyle=solid,fillcolor=yellow,plan=pp1,args=-1 0.5 0 1.5 1 0.5]
\psProjection[object=polygone,fillstyle=solid,fillcolor=yellow,plan=pp1,args=-0.25 -0.5 0.25 -0.5 0.25 0.25 -0.25 0.25]
\composeSolid
\end{pspicture}
\end{document}

平面法线朝下 x 轴,图像正确

平面法线位于 0.75 0 1 处,图像开始被剪切

平面法线为 0.25 0 1,图像剪切得更厉害

答案1

这一切都归功于 Manuel Luque。我在这里引用他的电子邮件:

投影多边形、圆等被剪裁成与投影平面底部相对应的矩形。它位于 pst-solides.pro第 11237 行及以下各行。

/proj-pst-polygone {    proj-action (none) eqstring not {
      l@pl@n plangetrange aload pop
      setyrange setxrange
      newpath
         xmin ymin l@pl@n pointplan smoveto
         xmin ymax l@pl@n pointplan slineto
         xmax ymax l@pl@n pointplan slineto
         xmax ymin l@pl@n pointplan slineto
         xmin ymin l@pl@n pointplan slineto
     planprojpst projpath
      clip % <-------
      solidlinewidth setlinewidth
      linestyle
      linecolor
      proj-definition length 0 eq {
         [proj-args]
      } {
         proj-args
      } ifelse
      proj-definition cvx exec polygone_
      planprojpst projectionsifacevisible projpath    } if    /projname where {
      pop
      proj-definition length 0 eq {
         [proj-args]
      } {
         proj-args
      } ifelse
      proj-definition cvx exec projname cvlit exch def
      /projname where pop /projname undef    } if } def

因此我们必须扩大基础。

相关内容