Je voudrais réaliser une pyramide (tétraédrique, SABCD) de côté 2 cm dans un repère rouge d'origine (A) = (0,0), puis de tracer un triangle vert sur la face ((S), (B), (C)).
Pour cela il faudrait sans doute déterminer momentanément un nouveau système de référence (bleu) d'origine (B), d'abscisse confondue avec la demi-droite [BC), donc parallèle à l'axe des ordonnées du repère principal rouge, et dont l'axe des ordonnées du repère momentané soit confondu avec la demi-droite [Mbc,S), où Mbc est le milieu de BC donc inclinée à 60 degrés sur l'axe des abscisses du repère bleu.
Pour la suite du projet, le triangle vert doit être dessiné en utilisant le chemin
(début) -- ++(60:\cote) -- ++(-60:\cote) -- cycle
.L'objectif final sera une pyramide de Sierpinski.
Je n'arrive pas à finaliser les lignes de code pour calculer les arguments de
\tdplotsetrotatedcoords{\alpha}{\beta}{\gamma}
.Le code ci-dessous compile correctement. Seul le calcul faux.
Peut-on contourner cette difficulté ?
Code : Tout sélectionner
\input{./preambule-utf8.ltx}
\begin{document}
\newcommand{\DefinePoints}[1]{%
\foreach \x/\y/\z/\name in {#1} {
\coordinate (\name) at (\x, \y, \z);
}
}
\tdplotsetmaincoords{70}{120}%
\begin{tikzpicture} [
tdplot_main_coords,
cube/.style={very thick,black},
grid/.style={very thin,gray},
axis/.style={->,blue,thick},
rotated axis/.style={->,purple,thick},
line cap=round,
line join=round,
>=triangle 45,
scale=3]
% Dessiner les arêtes de la pyramide
\draw[axis, tdplot_main_coords, red] (0,0,0) -- (4,0,0) node[anchor=south]{$x$};
\draw[axis, tdplot_main_coords, red] (0,0,0) -- (0,3,0) node[anchor=north west]{$y$};
\draw[axis, tdplot_main_coords, red] (0,0,0) -- (0,0,3) node[anchor=west]{$z$};
\def\cote{2}
\pgfmathsetmacro{\hauteur}{\cote * sqrt(2) * 0.5}
\pgfmathsetmacro{\SMbc}{sqrt( (\cote)^2 - (0.5*\cote)^2 }
\pgfmathsetmacro{\SMad}{\SMbc}
\DefinePoints{
0/ 0/ 0/A,
\cote/ 0/ 0/B,
\cote/ \cote/ 0/C,
0/ \cote/ 0/D,
0.5*\cote/ 0.5*\cote/ \hauteur /S,
0/ 0/ \cote /Z,
\cote/ 0.5*\cote/ 0/Mbc,
0/ 0.5*\cote/ 0/Mad%
}
\draw[ ] (A) -- (B) -- (C) -- (D) -- cycle;
\foreach \point in {A, B, C, D} {
\draw (S) -- (\point);
}
\draw[ ] (A) -- (S) -- (B);
\draw[ ] (B) -- (S) -- (C);
\tdplotsetrotatedcoordsorigin{(B)}
% ---------------------------------------------------
% Lorsque le triangle vert est dessiné dans le repère bleu, il est "incliné" de 60 degrés par rapport au plan xy. Il n'est donc pas prarallèle au plan BAC
% L'axe Ax' du repère bleu doit être parallèle à l'axe des y rouge (AB)
% L'axe Ay' du repère bleu doit être incliné à 60 degrés c'est-à-dire parallèle à la médiane (S) (Mbc)
% L'axe Az' doit etre orthogonal aux deux précédents Ax', Ay'
% Calculate \alpha (Rotation about the World X-Axis)
\pgfmathanglebetweenpoints%
{\pgfpointanchor{B}{center}}%
{\pgfpointanchor{S}{center}}
\let\alpha\pgfmathresult
% Calculate \beta (Rotation about the World Y-Axis)
\pgfmathanglebetweenpoints%
{\pgfpointanchor{C}{center}}
{\pgfpointanchor{B}{center}}
\let\beta\pgfmathresult
% Calculate \gamma (Rotation about the World Z-Axis)
\pgfmathanglebetweenpoints%
{\pgfpointanchor{A}{center}}%
{\pgfpointanchor{S}{center}}
\let\gamma\pgfmathresult
% Faute de mieux en attendant de trouver la réponse
% \def\alpha{0}
% \def\beta{60}
% \def\gamma{90}
\tdplotsetrotatedcoordsorigin{(B)}
% \tdplotsetrotatedcoords{\alpha}{\beta}{\gamma}
\tdplotsetrotatedcoords{\alpha}{\beta}{\gamma}
% ---------------------------------------------------
\begin{scope}[tdplot_rotated_coords]
% draw the rotated coordinate frame axes
\draw[rotated axis, blue, line width=1pt] (0,0,0) -- (3,0,0) node[anchor=west]{$x'$};
\draw[rotated axis, blue, line width=1pt] (0,0,0) -- (0,4,0) node[anchor=south west]{$y'$};
\draw[rotated axis, blue, line width=1pt] (0,0,0) -- (0,0,3) node[anchor=west]{$z'$};
\draw (0,0,0) -- (\cote,0,0) -- (\cote, \cote, 0) -- (0,\cote,0) -- cycle ;
% Tracer le triangle vert avec un chemin relatif dans le plan (SBC)
\draw[-, green, line width=2pt] (B) -- ++(60:\cote) -- ++(-60:\cote) ; % -- cycle ;
% \draw[-, green, line width=2pt] (B) -- (0.5\cote, \SMbc) ;
\end{scope}
\node at (1,-1, -2) {alpha : \alpha } ;
\node at (1,-1, -2.25) {beta : \beta} ;
\node at (1,-1, -2.5) {gamma : \gamma} ;
\foreach \n/\pos in {S/above, A/{above left}, B/{above left}, C/below, D/{above right}, Z/right, Mbc/below}{
\tkzDrawPoint (\n)
\tkzLabelPoints[\pos](\n)
}
\end{tikzpicture}
\end{document}