Let be given a pyramid SABCD with SA perpendicular to the plan ABC, SA = h, base of piramid is a ractangle with AB=a, AD=b. The point M lies on the segment SA. Let be P1 is the plane passing through M and parallel to the plane xy, The plane P1 intersects the lines SB, SC, SD at N, P, Q ,  respectively. Draw the cylinder has height AM and a base is circumcicle of MNPQ. I tried

\documentclass[border=1mm,12pt,tikz]{standalone}
\usetikzlibrary{3dtools,calc}% https://github.com/marmotghost/tikz-3dtools
\begin{document}
\foreach \Angle in {150}
{\begin{tikzpicture}[3d/install view={phi=\Angle,psi=0,theta=70},
line join = round, line cap = round,same bounding box=A,c/.style={circle,fill,inner sep=1pt},
declare function={a=4;b=4;h=5;H=3;}]
\path
(0,0,0) coordinate (A) (a,0,0) coordinate (B)
(a,b,0) coordinate (C) (0,b,0) coordinate (D)
(0,0,h) coordinate (S)
(0,0,H)	 coordinate (M)
;

\path[3d/plane with normal={(0,0,1) through (M) named p},3d/plane with normal={(0,0,1) through (0,0,0) named p1},3d/line through={(S) and (B) named lSB},3d/line through={(S) and (C) named lSC},3d/line through={(S) and (D) named lSD}];
\path[3d/intersection of={lSB with p}] coordinate (N);
\path[3d/intersection of={lSC with p}] coordinate (P);
\path[3d/intersection of={lSD with p}] coordinate (Q);
\path[3d coordinate ={(O') =0.5*(M) + 0.5*(P)}];
\path[3d/project={(N) on p1}] coordinate (E);
\path[3d/project={(P) on p1}] coordinate (F);
\path[3d/project={(Q) on p1}] coordinate (G);
\path[3d/project={(O') on p1}] coordinate (O);

\pgfmathsetmacro{\myr}{tddistance("(O)","(A)")}
\pgfmathsetmacro{\mybarycenter}{barycenter("(A),(B),(C),(D),(S)")}
\path (\mybarycenter) coordinate (O'');
\tikzset{3d/polyhedron/.cd,O={(O'')},
fore/.append style={fill=none,/tikz/3d/visible},
back/.append style={fill=none,/tikz/3d/hidden},
draw face with corners={{(A)},{(B)},{(C)},{(D)}},
draw face with corners={{(S)},{(A)},{(B)}},
draw face with corners={{(S)},{(B)},{(C)}},
draw face with corners={{(S)},{(C)},{(D)}},
draw face with corners={{(S)},{(A)},{(D)}}
}

\path (O)		pic{3d/frustum={R=\myr,r=\myr,h=H}};

\path foreach \p/\g in {A/90,B/90,C/200,D/-90,S/0,M/0,N/0,P/0,Q/0,O'/0,E/0,F/0,G/0,O/0}
{(\p)node[c]{}+(\g:2.5mm) node{$\p$}};
\end{tikzpicture}}
\end{document}

I got
![ScreenHunter 180.png](/image?hash=3b53ef40d5d73d0e0098d6466979d6aa938cff82d3619b21cc83820ebbc2ae53)

I tried to draw with GeoSpace

![ScreenHunter 177.png](/image?hash=625846e84797ee794b1e186fcedbc0f8720853b5864c32585f13b7dcce522b7f)

![ScreenHunter 182.png](/image?hash=71319a7a35f4d6bc425011dc960b04b272cfb7252d05964f5cec535d9217bbbe)

![ScreenHunter 181.png](/image?hash=b97376b4b2aa93a4911d315816b5fd07421b00322979966ba8215e13af6a84e6)

How to correct my code?
I added a number of comments in the code. I also added a new key to the [3dtools library](https://github.com/marmotghost/tikz-3dtools), so you will need the latest version. You can use draw ordered paths as well as the new key draw open face with corners here.

\documentclass[border=1mm,12pt,tikz]{standalone}
\usetikzlibrary{3dtools,calc}% https://github.com/marmotghost/tikz-3dtools
\begin{document}
\foreach \Angle in {5,15,...,355}
{\begin{tikzpicture}[3d/install view={phi=\Angle,psi=0,theta=70},
line join = round, line cap = round,same bounding box=A,
c/.style={circle,fill,inner sep=1pt},
declare function={a=4;b=4;h=5;H=3;}]
\path
(0,0,0) coordinate (A) (a,0,0) coordinate (B)
(a,b,0) coordinate (C) (0,b,0) coordinate (D)
(0,0,h) coordinate (S) (0,0,H)	 coordinate (M);

\path[3d/plane with normal={(0,0,1) through (M) named p},3d/plane with normal={(0,0,1) through (0,0,0) named p1},3d/line through={(S) and (B) named lSB},3d/line through={(S) and (C) named lSC},3d/line through={(S) and (D) named lSD}];
\path[3d/intersection of={lSB with p}] coordinate (N);
\path[3d/intersection of={lSC with p}] coordinate (P);
\path[3d/intersection of={lSD with p}] coordinate (Q);
\path[3d coordinate ={(O') =0.5*(M) + 0.5*(P)}];
\path[3d/project={(N) on p1}] coordinate (E);
\path[3d/project={(P) on p1}] coordinate (F);
\path[3d/project={(Q) on p1}] coordinate (G);
\path[3d/project={(O') on p1}] coordinate (O);

\pgfmathsetmacro{\myr}{tddistance("(O)","(A)")}
\pgfmathsetmacro{\mybarycenter}{barycenter("(A),(B),(C),(D),(S)")}
\path (\mybarycenter) coordinate (O'');
\tikzset{3d/polyhedron/.cd,O={(O'')},
fore/.append style={fill=none,/tikz/3d/visible},
back/.append style={fill=none,/tikz/3d/hidden},
draw open face with corners={{(M)},{(S)},{(Q)}},
draw open face with corners={{(M)},{(S)},{(N)}},
draw open face with corners={{(P)},{(S)},{(N)}},
draw open face with corners={{(P)},{(S)},{(Q)}},
draw open face with corners={{(N)},{(B)},{(C)},{(P)}},
draw open face with corners={{(P)},{(C)},{(D)},{(Q)}},
draw open face with corners={{(G)},{(D)},{(Q)}}
}
\path[every edge/.append style={3d/polyhedron/face edges,3d/hidden}]
(A) edge (G) edge (E);
% compute a 3d coordinate that points to the right
\pgfmathsetmacro{\myx}{TDunit("(0,0,1)x(nscreenx,nscreeny,nscreenz)")}
\pgfmathsetmacro{\myX}{TD("\myr*(\myx)")}
% compute the phi angle (we know it but if you install the projection differently you may not)
\pgfmathsetmacro{\myc}{atan2(TD("(0,1,0)o(\myx)"),TD("(1,0,0)o(\myx)"))}
% find the coordinates of the vertical boundaries of the cylinder
\path[3d coordinate/.list={{(L_1)=(O)-(\myX)},
{(L_2)=(O')-(\myX)},{(R_1)=(O)+(\myX)},
{(R_2)=(O')+(\myX)}}];
% bottom part of the cylinder
\draw[3d/hidden] (R_1)
\path[save named path=bot]
(L_1) -- (L_2) (R_1) -- (R_2);
% upper cicrle of the cylinder
% cylinder halo
\path[save named path=cyl]
-- cycle;
% hull of polyhedron
\path[save named path=Block,convex hull of={A,B,C,D,S}];
% hull of upper part of the polyhedron
\path[save named path=block,convex hull of={M,N,P,Q,S}];
% other paths
\path[save named path=AM] (A) -- (M);
\path[save named path=BE] (B) -- (E);
\path[save named path=BN] (B) -- (N);
\tikzset{3d/ordered paths/.cd,block/.style={draw=none},
Block/.style={draw=none}}
% common
\tikzset{3d/draw ordered paths={circ,block}}
\tikzset{3d/draw ordered paths={bot,Block}}
%\typeout{\Angle: \myc, \iQ}
% draw ordered objects
\ifcase\iQ
\tikzset{3d/draw ordered paths={circ,block}}
\tikzset{3d/draw ordered paths={bot,Block}}
\draw[3d/visible,use named path=BE];
\pgfmathsetmacro{\ntest}{TDunit("(A)-(O)")}
\pgfmathtruncatemacro{\itest}{screendepth(\ntest)>0?1:0}
\ifnum\itest=1
\draw[3d/visible,use named path=AM];
\else
\draw[3d/hidden,use named path=AM];
\fi
\or
\draw[3d/hidden,use named path=AM];
\draw[3d/hidden,use named path=BE];
\or
\draw[3d/hidden,use named path=AM];
\draw[3d/hidden,use named path=BE];
\or
\tikzset{3d/draw ordered paths={BE,BN,cyl}}
\draw[3d/hidden,use named path=BE];
\draw[3d/visible,use named path=AM];
\fi
\path foreach \p/\g in {A/90,B/90,C/200,D/-90,S/0,M/0,N/0,P/0,Q/0,O'/0,E/0,F/0,G/0,O/0}
{(\p)node[c]{}+(\g:2.5mm) node{$\p$}};
\end{tikzpicture}}
\end{document}

![ani.gif](/image?hash=77f558e97b0f51b0a139a14f40471f3423df9fa04d9b03783c8b3639fbefed90)

Enter question or answer id or url (and optionally further answer ids/urls from the same question) from

Separate each id/url with a space. No need to list your own answers; they will be imported automatically.