\documentclass[12pt]{article}
\usepackage{pstcol,pst-vue3d,pst-grad,multido}
\usepackage[a4paper]{geometry}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}\definecolor{Beige} {rgb}{0.96,0.96,0.86}
\definecolor{GrisClair} {rgb}{0.8,0.8,0.8}
\definecolor{GrisTresClair} {rgb}{0.9,0.9,0.9}
\definecolor{OrangeTresPale}{cmyk}{0,0.1,0.3,0}
\definecolor{OrangePale}{cmyk}{0,0.2,0.4,0}
\definecolor{BleuClair}{cmyk}{0.2,0,0,0}
\definecolor{LightBlue}{rgb}{.68,.85,.9}
\definecolor{DarkGreen}{rgb}{0,.85,0}
\definecolor{Copper}{cmyk}{0,0.9,0.9,0.2}
\title{Vue en 3D}
\author{Manuel Luque\\
\makeatletter
\textsf{<Mluque5130@aol.com>}
\makeatother
}
\date{11 novembre 2002}
\newcommand\axeOZ{%
\PointThreeD(0,0,5){O}
\PointThreeD(0,0,25){Z}
\PointThreeD(0,0,12.5){Z'}
{\psset{linecolor=red,linestyle=dashed}
\psline(O)(Z)
\uput[0](Z){Z}}}
\newcommand\tapis{
\PointThreeD(-20,-20,-5){P1}
\PointThreeD(20,-20,-5){P2}
\PointThreeD(20,20,-5){P3}
\PointThreeD(-20,20,-5){P4}
\pspolygon*[linecolor=green](P1)(P2)(P3)(P4)
\multido{\iX=-20+10}{5}{\PointThreeD(\iX,-20,-5){X1}
\PointThreeD(\iX,20,-5){X2}
\psline[linecolor=black](X1)(X2)}
\multido{\iY=-20+10}{5}{\PointThreeD(-20,\iY,-5){Y1}
\PointThreeD(20,\iY,-5){Y2}
\psline[linecolor=black](Y1)(Y2)}}
\def\Plans{{\psset{normaleLongitude=180, normaleLatitude=0, Xorigine=0, Yorigine=0, Zorigine=0}
\QuadrillageThreeD[linecolor=blue,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=-50]}
{\psset{normaleLongitude=90, normaleLatitude=0, Xorigine=0, Yorigine=0, Zorigine=0}
\QuadrillageThreeD[linecolor=red,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=-50]}
{\psset{normaleLongitude=0, normaleLatitude=90, Xorigine=0, Yorigine=0, Zorigine=0}
\QuadrillageThreeD[linecolor=green,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=-50]}
\PointThreeD(0,0,0){O}
\PointThreeD(0,0,100){Z}
\PointThreeD(100,0,0){X}
\PointThreeD(0,100,0){Y}
{\psset{linestyle=dashed}
\psline[linecolor=blue](O)(Z)
\psline[linecolor=red](O)(X)
\psline[linecolor=green](O)(Y)}
\uput[0](Z){Z}
\uput[0](X){X}
\uput[0](Y){Y}}
\begin{document}
\maketitle
\section{Objectifs }
Il s'agit de représenter en 3D, des objets avec élimination des
parties cachées.
La position du point de vue sera définie par la distance à
l'origine du repère, la longitude $\theta$ et la latitude $\phi$.
On choisira aussi la distance à laquelle l'observateur place, par
rapport à lui, l'écran de projection.
L'objectif suivant est de définir des éléments de décor en 3D, \textit{des
briques}, pour reconstruire ce qu'un observateur verrait.
Les \textit{briques} à notre disposition sont :
\begin{itemize}
\item Un parallélépipède rectangle donné par ses trois
dimensions \verb+A,B,C+ : il peut donc se transformer en cube et
même en dé.
\item Un point pouvant être défini de deux façons :
\begin{itemize}
\item par ses coordonnées cartésiennes $(x,y,z)$ ;
\item ou en coordonnées sphériques $(R,\theta,\phi)$.
$(\theta,\phi)$ sont la longitude et la latitude.
\end{itemize}
\item Un rectangle.
\item Un cercle défini par la normale à son plan, son origine et
son rayon, un arc de cercle défini comme le cercle avec ses deux angles limites.
\item Un tétraèdre donné par les coordonnées du centre de sa base et le rayon du
cercle inscrivant chaque face, que l'on peut faire
tourner.
\item Une pyramide à base carrée donnée par le demi-côté de sa
base et sa hauteur que l'on peut faire tourner et placer où on
veut.
\item Une sphère donnée par les coordonnées du centre \verb+CX=...+,\verb+CY=...+,\verb+CZ=...+
et le rayon, que l'on peut faire
tourner avec les paramètres
\verb+RotX=...+,\verb+RotY=...+,\verb+RotZ=...+.
On pourra choisir de dessiner un méridien ou en cercle parallèle
particulier.
\item Une demi-sphère creuse ou pas, avec les mêmes paramètres
que la sphère.
\item Un cylindre vertical défini par son rayon, sa hauteur, que l'on peut faire
tourner avec les paramètres
\verb+RotX=...+,\verb+RotY=...+,\verb+RotZ=...+ et dont le centre
de la base se placera avec les paramètres \verb+CX=...+,\verb+CY=...+,\verb+CZ=...+
\item Un cône et tronc de cône définis par le rayon de la base,
la hauteur et la fraction de hauteur qu'on souhaite retenir (pour le tronc ce cône).
On peut les placer ou l'on veut et les faire tourner comme les autres éléments.
\item Un cercle défini par la normale à son plan, son origine et
son rayon.
\end{itemize}
\section{Parallélépipède, cube et dé}
Le parallélépipède est défini par ses trois dimensions
\textsf{A,B,C}. On peut le déplacer en fixant les coordonnées de
son centre avec : \textsf{CX,CY,CZ} et le faire tourner avec autour
des axes avec : \textsf{RotX,RotY,RotZ} dont les valeurs sont par défauts, positionnées à~0.
\begin{verbatim}
% positionnement du point de vue
\psset{THETA=70,PHI=30,Dobs=100,Decran=10}
% les dimensions du parallélépipède
\psset{A=5,B=5,C=A,fillstyle=solid,fillcolor=GrisClair,linecolor=red}
\Die
\end{verbatim}
\begin{center}
\begin{pspicture}(-1,-1)(1,1)
\psset{THETA=70,PHI=30,Dobs=100,Decran=10}
\psset{A=5,B=5,C=A,fillstyle=solid,fillcolor=GrisClair,linecolor=red}
\Die
\end{pspicture}
\end{center}
Faisons tourner le dé autour de $Oz$.
\multido{\iRotZ=0+45}{8}{\begin{pspicture}(-1.5,-1.5)(1.5,1.5)
\psset{THETA=70,PHI=30,Dobs=200,Decran=10}
\psset{A=5,B=5,C=A,fillstyle=solid,fillcolor=GrisClair,linecolor=red}
\psset{RotZ=\iRotZ}
\tapis
\Die\axeOZ
\uput[180](Z'){\texttt{RotZ=\iRotZ}}
\end{pspicture}\hfill }
\textbf{Avec un parallélépipède quelconque en rotation autour de OX}. On
rappelle que \verb+CX+, \verb+CY+ et \verb+CZ+ servent à
transporter le centre du parallélépipède au point dont les
coordonnées sont \verb+(CX,CY,CZ)+ et que \verb+RotX+
le fait tourner autour de OX d'un angle égal à
\verb+RotX+ etc.
\begin{center}
\psset{THETA=-10,PHI=20,Dobs=200,Decran=10}
\multido{\iCX=0+30}{8}{\begin{pspicture}(-1.5,-1.5)(1.5,1.5)
\PointThreeD(0,0,0){O}
\PointThreeD(0,0,20){Z}
\PointThreeD(50,0,0){X}
\PointThreeD(0,20,0){Y}
\psset{A=20,B=5,C=10,fillstyle=solid,fillcolor=LightBlue,linecolor=gray}
\psset{CX=0,CZ=0,CY=0,RotZ=0,RotY=0,RotX=\iCX}
\Cube\psset{linestyle=dashed}
\psline(O)(Z)
\psline(O)(X)
\psline(O)(Y)
\uput[0](Z){Z}
\uput[0](X){X}
\uput[0](Y){Y}
\end{pspicture}\hfill}
\end{center}
\section{Sphère, hémisphère, parallèles et méridiens}
\begin{center}
\psset{THETA=60,PHI=30,Dobs=100,Decran=10}
\begin{pspicture}(-3,-4)(3,5)
\psset{CX=0,CZ=0,CY=0}
{\psset{fillstyle=gradient,gradbegin=white,gradend=blue,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\SphereThreeD{20}}
\psset{linecolor=red,PhiCercle=45}
\SphereCercle{20}
\SphereMeridien[ThetaMeridien=45]{20}
\PointLongitudeLatitude{20}{45}{45}{A}
\PointLongitudeLatitude{40}{45}{45}{B}
\psline[linecolor=magenta]{->}(A)(B)
\PointLongitudeLatitude{20}{0}{90}{Nord}
\PointLongitudeLatitude{40}{0}{90}{Nord1}
\psline[linecolor=magenta]{->}(Nord)(Nord1)
\SphereCercle[PhiCercle=0]{20}
\SphereMeridien[ThetaMeridien=0]{20}
\end{pspicture}
\hfill
\begin{pspicture}(-3,-4)(3,5)
\psset{CX=0,CZ=0,CY=0}
\psset{fillstyle=gradient,gradbegin=cyan,gradend=magenta,gradmidpoint=0,linecolor=red,linewidth=0.1mm}
\DemiSphereThreeD[RotY=90]{20}
\end{pspicture}
\end{center}
\section{Demi-sphères creuses ou pas}
\begin{center}
\begin{pspicture}(-3,-4)(3,5)
\psset{THETA=185,PHI=0,Dobs=100,Decran=10}
\psset{fillstyle=gradient,gradbegin=white,gradend=blue,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\DemiSphereThreeD[CZ=-5,RotX=180,RotY=-10]{20}
\DemiSphereThreeD[CZ=5,RotY=10]{20}
\psset{fillstyle=gradient,gradbegin=white,gradend=red,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\SphereCreuse[CZ=-5,RotX=180,RotY=-10]{20}
\SphereCreuse[CZ=5,RotY=10]{20}
\end{pspicture}
\hfill
\begin{pspicture}(-3,-4)(3,5)
\psset{THETA=10,PHI=30,Dobs=100,Decran=10}
\psset{CX=0,CZ=0,CY=0,RotX=180,RotY=20}
\psset{fillstyle=gradient,gradbegin=white,gradend=blue,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\DemiSphereThreeD[CX=0]{20}
\psset{fillstyle=gradient,gradbegin=white,gradend=red,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\SphereCreuse[CX=0]{20}
\end{pspicture}
\end{center}
\begin{verbatim}
\psset{fillstyle=gradient,gradbegin=white,gradend=blue,%
gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\DemiSphereThreeD[CZ=-5,RotX=180,RotY=-10]{20}
\DemiSphereThreeD[CZ=5,RotY=10]{20}
\psset{fillstyle=gradient,gradbegin=white,gradend=red,%
gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\SphereCreuse[CZ=-5,RotX=180,RotY=-10]{20}
\SphereCreuse[CZ=5,RotY=10]{20}
\end{verbatim}
\subsection{Dessiner un cylindre}
Le cylindre sera donné par le rayon de sa base et sa hauteur. Le
centre de la base sera positionné avec \textsf{CX,CY,CZ}, on le fait tourner autour
autour des axes avec \textsf{RotX,RotY,RotZ}.
\verb+\CylindreThreeD{radius}{hauteur}+
\begin{center}
\begin{pspicture}(-5,-4)(5,5)
\psset{THETA=65,PHI=40,Dobs=150,Decran=10}
{\psset{normaleLongitude=0, normaleLatitude=90, Xorigine=0, Yorigine=0, Zorigine=0}
\FrameThreeD[fillstyle=solid,fillcolor=cyan](-50,0)(50,50)
\FrameThreeD[fillstyle=solid,fillcolor=OrangePale](-50,0)(50,-50)
\QuadrillageThreeD[linecolor=green,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=-50]}
{\psset{fillstyle=gradient,gradbegin=white,gradend=red,gradmidpoint=0.2,linewidth=0.1mm}
\multido{\iCY=-45+90}{2}{\CylindreThreeD[CX=-45,CY=\iCY,CZ=0]{5}{50}
\DemiSphereThreeD[CX=-45,CZ=50,CY=\iCY,fillstyle=gradient,gradbegin=white,gradend=yellow]{5}}
{\psset{CX=0,CY=0,CZ=0}
\CylindreThreeD{10}{15}
\psset{CX=0,CY=0,CZ=15}
\CylindreThreeD{20}{5}}
{\psset{fillstyle=gradient,gradbegin=white,gradend=blue,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\DemiSphereThreeD[CZ=35,RotX=180]{20}}
{\psset{fillstyle=gradient,gradbegin=white,gradend=red,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm}
\SphereCreuse[CZ=35,RotX=180]{20}}
{\psset{CX=15,CY=15,CZ=5,RotY=90,RotX=0,RotZ=30}
\CylindreThreeD{5}{20}}
\multido{\iCY=-45+90}{2}{\CylindreThreeD[CX=45,CY=\iCY,CZ=0]{5}{50}
\DemiSphereThreeD[CX=45,CZ=50,CY=\iCY,fillstyle=gradient,gradbegin=white,gradend=yellow,linestyle=none]{5}}}
\end{pspicture}
\end{center}
{\footnotesize
\begin{verbatim}
{\psset{CX=0,CY=0,CZ=-5}
\CylindreThreeD{10}{15}}
{\psset{CX=15,CY=15,CZ=0,RotY=90,RotX=0}
\CylindreThreeD{5}{20}}
\end{verbatim}}
\section{Plans et quadrillages}
\psset{THETA=-10,PHI=10,Dobs=200,Decran=10}
\begin{pspicture}(-5,-2)(5,4)
{\psset{normaleLongitude=180, normaleLatitude=0, Xorigine=0, Yorigine=0, Zorigine=0}
\FrameThreeD[fillstyle=solid,fillcolor=OrangePale](-50,-50)(50,50)
\QuadrillageThreeD[linecolor=blue,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=-50]}
{\psset{normaleLongitude=90, normaleLatitude=0, Xorigine=0, Yorigine=50, Zorigine=0}
\FrameThreeD[fillstyle=solid,fillcolor=yellow](0,-50)(50,50)
\QuadrillageThreeD[linecolor=blue,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=0]}
{\psset{normaleLongitude=90, normaleLatitude=0, Xorigine=0, Yorigine=-50, Zorigine=0}
\FrameThreeD[fillstyle=solid,fillcolor=yellow](0,-50)(50,50)
\QuadrillageThreeD[linecolor=red,linewidth=0.2mm,grille=10, Ymin=-50,Ymax=50,Xmax=50,Xmin=0]}
{\psset{normaleLongitude=0, normaleLatitude=90, Xorigine=0, Yorigine=0, Zorigine=0}
\FrameThreeD[fillstyle=solid,fillcolor=cyan](-50,0)(50,50)
\QuadrillageThreeD[linecolor=green,linewidth=0.2mm,grille=10, Ymin=0,Ymax=50,Xmax=50,Xmin=-50]}
\PointThreeD(0,0,0){O}
\PointThreeD(0,0,100){Z}
\PointThreeD(100,0,0){X}
\PointThreeD(0,100,0){Y}
{\psset{linecolor=red,linestyle=dashed}
\psline(O)(Z)
\psline(O)(X)
\psline(O)(Y)}
\uput[0](Z){Z}
\uput[0](X){X}
\uput[0](Y){Y}
\end{pspicture}
\section{Points et droites}
\psset{THETA=70,PHI=30,Dobs=150,Decran=10}
\begin{center}
\begin{pspicture}(-5,-2)(5,4)
\PointThreeD(0,0,0){O}
\PointThreeD(0,0,60){Z}
\PointThreeD(60,0,0){X}
\PointThreeD(0,60,0){Y}
{\psset{linecolor=red,linestyle=dashed}
\psline(O)(Z)
\psline(O)(X)
\psline(O)(Y)}
\uput[0](Z){Z}
\uput[0](X){X}
\uput[0](Y){Y}
\PointThreeD(25,-25,25){A}
\PointThreeD(25,25,25){B}
\PointThreeD(25,25,-25){C}
\PointThreeD(25,-25,-25){D}
\PointThreeD(-25,-25,25){E}
\PointThreeD(-25,25,25){F}
\PointThreeD(-25,25,-25){G}
\PointThreeD(-25,-25,-25){H}
\pspolygon(A)(B)(C)(D)
\pspolygon(E)(F)(G)(H)
\psline(A)(E)
\psline(B)(F)
\psline(C)(G)
\psline(D)(H)
\psset{linestyle=dashed}
\psline(A)(G)
\psline(B)(H)
\psline(C)(E)
\psline(D)(F)
\newcounter{lettre}
\multido{\i=1+1}{8}{\setcounter{lettre}{\i}
\psdot[linecolor=red](\Alph{lettre})
\uput[90](\Alph{lettre}){\Alph{lettre}}
}
\end{pspicture}
\end{center}
\section{Cercles}
\begin{center}
\psset{THETA=80,PHI=50,Dobs=120,Decran=10}
\begin{pspicture}(-5,-6)(5,1)
\multido{\iX=-70+10}{15}{\PointThreeD(\iX,0,0){X1}
\PointThreeD(\iX,50,0){X2}
\psline(X1)(X2)}
\multido{\iY=0+10}{6}{\PointThreeD(-70,\iY,0){Y1}
\PointThreeD(70,\iY,0){Y2}
\psline(Y1)(Y2)}
\psset{normaleLongitude=0,normaleLatitude=90,Zorigine=0}
\multido{\iXorigine=-65+10}{14}{\multido{\iYorigine=5+10}{5}{\psset{Yorigine=\iYorigine,Xorigine=\iXorigine}
\CircleThreeD[linecolor=red]{5}}}
\end{pspicture}
\end{center}
\begin{verbatim}
\psset{normaleLongitude=0,normaleLatitude=90,Zorigine=0}
\multido{\iXorigine=-65+10}{14}{%
\multido{\iYorigine=5+10}{5}{%
\psset{Yorigine=\iYorigine,Xorigine=\iXorigine}
\CircleThreeD[linecolor=red]{5}}}
\end{verbatim}
\section{Exemples divers}
\psset{THETA=70,PHI=40,Dobs=150,Decran=8}
\begin{center}
\begin{pspicture}(-5,-4)(5,8)
{\psset{A=50,B=5,C=5,fillstyle=solid,fillcolor=GrisClair,linecolor=red}
\psset{CX=0,CZ=5,CY=-5,RotZ=0,RotY=0,RotX=0}
\Cube}
{\psset{A=5,B=5,C=50,fillstyle=solid,fillcolor=GrisClair,linecolor=red}
\psset{CX=0,CZ=60,CY=-5,RotZ=0,RotY=0,RotX=0}
\Cube}
\PointThreeD(0,0,0){O}
\PointThreeD(0,0,120){Z}
\PointThreeD(100,0,0){X}
\PointThreeD(0,60,0){Y}
{\psset{linecolor=red,linestyle=dashed}
\psline(O)(Z)
\psline(O)(X)
\psline(O)(Y)}
\uput[0](Z){Z}
\uput[0](X){X}
\uput[0](Y){Y}
\multido{\iX=-70+10}{15}{\PointThreeD(\iX,0,0){X1}
\PointThreeD(\iX,50,0){X2}
\psline(X1)(X2)}
\multido{\iY=0+10}{6}{\PointThreeD(-70,\iY,0){Y1}
\PointThreeD(70,\iY,0){Y2}
\psline(Y1)(Y2)}
\psset{fillstyle=gradient,gradbegin=white,gradend=red,gradmidpoint=0.2,linewidth=0.1mm}
{\psset{CX=-60,CY=-5,CZ=0}
\CylindreThreeD{5}{50}}
\multido{\iZ=60+20,\iX=-60+20,\iY=-5+7}{4}{\psset{fillstyle=gradient,gradbegin=white,gradend=blue,gradmidpoint=0.2,linecolor=cyan,linewidth=0.1mm,CX=\iX,CZ=\iZ,CY=\iY}
\SphereThreeD{4}}
{\psset{CZ=0,CY=40,CX=50,RotZ=20,linecolor=black,fillstyle=gradient,Rtetraedre=10}
\Tetraedre}
\psset{RotX=0,RotZ=30,RotY=0,CX=-20,CZ=0,CY=25,fillstyle=solid,linecolor=black,A=15,Hpyramide=10}
\Pyramide
\psset{linecolor=red,fillstyle=gradient,gradbegin=yellow,gradend=red,gradmidpoint=0,linewidth=0.05mm}
{\psset{CX=60,CZ=0,CY=10,fracHcone=0.75}
\ConeThreeD{10}{100}}
\end{pspicture}
\end{center}
\end{document}