import three; size(7cm); currentprojection=orthographic(5,4,3); triple pA=(2,2,0), pB=(-2,2,0), pC=(-2,-2,0), pD=(2,-2,0), pS=(0,0,5); path3 cercle = pA..pB..pC..pD..cycle; draw(pS--pD--pA--pS--pB--pA); draw(pD--pC--pS^^pC--pB,dashed); // Pas facile de détecter la partie cachée du cercle ! path pvisib1 = cut(project(cercle),project(pB--pS--pD),1).before, pvisib2 = cut(project(cercle),project(pB--pS--pD),2).after, pcache = cut(cut(project(cercle),project(pB--pS--pD),1).after,project(pB--pS--pD),1).before; draw(invert(pvisib1,Z,O)^^invert(pvisib2,Z,O),blue); draw(invert(pcache,Z,O),red+dashed); // --- pour des explications sur cut : voir la sous-galerie "Intersections". label("$A$",pA,S); label("$B$",pB,E); label("$C$",pC,NW); label("$D$",pD,W); label("$S$",pS,N);