\subsection{Le module \emph{luadraw\_polyhedrons}}

Ce module est encore à l'état d'ébauche et est appelé à s'étoffer par la suite. Comme son nom l'indique, il contient la définition de polyèdres. Toutes les données numériques sont issues du site \href{https://dmccooey.com/polyhedra/}{Visual Polyhedra}.

\textbf{Utilisation : ce module n'ajoute pas de nouvelles méthodes graphiques, mais il renvoie une table de fonctions construisant des polyèdres.} Par conséquent, il s'utilise ainsi (exemple):
\begin{Luacode}
local poly = require 'luadraw_polyhedrons'
local M = pt3d.M
local T = poly.tetrahedron( M(0,0,0), M(1,1,1) )
\end{Luacode}

Toutes les fonctions sont sur le même modèle : \cmd{<nom>(C, S \fac{, all})} où \argu{C} est le centre du polyèdre (point 3D) et \argu{S} un sommet du polyèdre (point 3D), lorsque \argu{C} ou \argu{S} ont la valeur \nil, c'est le polyèdre non transformé (de centre l'origine) qui est renvoyé. L'argument facultatif \argu{all} est un booléen, lorsqu'il a la valeur \true la fonction renvoie une séquence de quatre choses : \emph{P, V, E, F} où :
    \begin{itemize}
        \item $P$ est le solide en tant que polyèdre,
        \item $V$ la liste (table) des sommets,
        \item $E$ la liste (table) des arêtes (avec points 3D),
        \item $F$ la liste des facettes (avec points 3D). Certains polyèdres ont plusieurs types de facettes, dans ce cas la résultat renvoyé est de la forme : \emph{P, V, E, F1, F2, \ldots}, où $F1$, $F2$, \ldots, sont des listes de facettes. Cela peut permettre de les dessiner avec des couleurs différentes par exemple.
        \end{itemize}
Lorsque l'argument \argu{all} a la valeur \false, qui est la valeur par défaut, la fonction ne renvoie que le polyèdre.

Voici les solides actuellement contenus dans ce module :

\begin{itemize}
    \item Les solides de Platon, ces solides n'ont qu'un type des faces :
        \begin{itemize}
            \item  la fonction \cmd{tetrahedron(C, S \fac{, all})} permet la construction d'un tétraèdre régulier de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D).
            \item La fonction \cmd{octahedron(C, S \fac{, all})} permet la construction d'un octaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D).
            \item La fonction \cmd{cube(C, S \fac{, all})} permet la construction d'un cube de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D).
            \item La fonction \cmd{icosahedron(C, S \fac{, all})} permet la construction d'un icosaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D).
            \item La fonction \cmd{dodecahedron(C, S \fac{, all})} permet la construction d'un dodécaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D).
        \end{itemize}

    \item Les solides d'Archimède :
        \begin{itemize}
            \item La fonction \cmd{cuboctahedron(C, S \fac{, all})} permet la construction d'un cuboctaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{icosidodecahedron(C, S \fac{, all})} permet la construction d'un icosidodécaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{lsnubcube(C, S \fac{, all})} permet la construction d'un cube adouci (forme 1) de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{lsnubdodecahedron(C, S \fac{, all})} permet la construction d'un dodécaèdre adouci (forme 1) de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{rhombicosidodecahedron(C, S \fac{, all})} permet la construction d'un rhombicosidodécaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a trois types de faces.
            \item La fonction \cmd{rhombicuboctahedron(C, S \fac{, all})} permet la construction d'un rhombicuboctaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{rsnubcube(C, S \fac{, all})} permet la construction d'un cube adouci (forme 2) de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{rsnubdodecahedron(C, S \fac{, all})} permet la construction d'un dodécaèdre adouci (forme 2) de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{truncatedcube(C, S \fac{, all})} permet la construction d'un cube tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{truncatedcuboctahedron(C, S \fac{, all})} permet la construction d'un cuboctaèdre tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a trois types de faces.
            \item La fonction \cmd{truncateddodecahedron(C, S \fac{, all})} permet la construction d'un dodécaèdre tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
            \item La fonction \cmd{truncatedicosahedron(C, S \fac{, all})} permet la construction d'un icosaèdre tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
             \item La fonction \cmd{truncatedicosidodecahedron(C, S \fac{, all})} permet la construction d'un icosidodécaèdre tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a trois types de faces.
            \item La fonction \cmd{truncatedoctahedron(C, S \fac{, all})} permet la construction d'un octaèdre tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.             
            \item La fonction \cmd{truncatedtetrahedron(C, S \fac{, all})} permet la construction d'un tétraèdre tronqué de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
        \end{itemize}

    \item Autres solides :
    \begin{itemize}
        \item La fonction \cmd{octahemioctahedron(C, S \fac{, all})} permet la construction d'un octahémioctaèdre de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a deux types de faces.
        \item La fonction \cmd{small\_stellated\_dodecahedron(C, S \fac{, all})} permet la construction d'un petit dodécaèdre étoilé de centre \argu{C} (point 3D) et dont un sommet est \argu{S} (point 3D). Ce solide a un seul type de faces.
    \end{itemize}
\end{itemize}

\begin{demo}{Polyèdres du module \emph{luadraw\_polyhedrons}}
\begin{luadraw}{name=polyhedrons}
local ld = luadraw
local M, Origin = ld.pt3d.M, ld.pt3d.Origin
local i = ld.cpx.I
local poly = require 'luadraw_polyhedrons' -- chargement du module

local g = ld.graph3d:new{bg="LightGray", size={10,10}}
g:Labelsize("small"); ld.Hiddenlines = false
-- en haut à gauche 
g:Saveattr(); g:Viewport(-5,0,0,5); g:Coordsystem(-5,5,-5,5,true)
local T,S,A,F = poly.icosahedron(Origin,M(0,2,4.5),true) 
g:Dscene3d(
    g:addFacet(F, {color="Crimson",opacity=0.8}),
    g:addPolyline(A, {color="Pink", width=8}),
    g:addDots(S) )
g:Dlabel("Icosaèdre",5*i,{})
g:Restoreattr()
-- en haut à droite
g:Saveattr()
g:Viewport(0,5,0,5); g:Coordsystem(-5,5,-5,5,true)
local T,S,A,F1,F2 = poly.truncatedtetrahedron(Origin,M(0,0,5),true) -- sortie complète, affichage dans une scène 3D
g:Dscene3d(
    g:addFacet(F1, {color="Crimson",opacity=0.8}),
    g:addFacet(F2, {color="Gold"}),
    g:addPolyline(A, {color="Pink", width=8}),
    g:addDots(S) )
g:Dlabel("Tétraèdre tronqué",5*i,{})
g:Restoreattr()
-- en bas à gauche
g:Saveattr(); g:Viewport(-5,0,-5,0); g:Coordsystem(-5,5,-5,5,true)
local T,S,A,F1,F2,F3 = poly.rhombicosidodecahedron(Origin,M(0,0,4.5),true)
g:Dscene3d(
    g:addFacet(F1, {color="Crimson",opacity=0.8}),
    g:addFacet(F2, {color="Gold",opacity=0.8}), g:addFacet(F3, {color="ForestGreen"}),
    g:addPolyline(A, {color="Pink", width=8}), g:addDots(S) )
g:Dlabel("Rhombicosidodécaèdre",-5*i,{})
g:Restoreattr()
-- en bas à droite
g:Saveattr(); g:Viewport(0,5,-5,0); g:Coordsystem(-5,5,-5,5,true)
local T,S,A,F1 = poly.small_stellated_dodecahedron(Origin,M(0,0,5),true)
g:Dscene3d(
    g:addFacet(F1, {color="Crimson",opacity=0.8}),
    g:addPolyline(A, {color="Pink", width=8}),
    g:addDots(S) )
g:Dlabel("Petit dodécaèdre étoilé",-5*i,{})
g:Restoreattr()
g:Show()
\end{luadraw}
\end{demo}
