Camino fuera de lugar de una manera sorprendente

Camino fuera de lugar de una manera sorprendente

¿Por qué está mal colocada la elipse superior? Se define de la misma manera que los otros dos.

Editar

Observación: ni siquiera la elipse inferior está colocada correctamente.

Los nodos for calculados para ser el eje grande sonenlas elipses. ¿Quizás haya errores de cálculo debido a pgftransformtriangle?

Editar 2

Lo intento con \pgftransformreset, pero es lo mismo.

ingrese la descripción de la imagen aquí

\documentclass[tikz]{standalone}

\usepackage{tikz,ifthen}
\usetikzlibrary{calc,intersections,fpu}

\def\Azi{30}%30
\def\Alt{20}%20

\def\Radius{1.5}
\def\Length{5}
\def\AngleMax{atan(2*\Radius/\Length)}

\newcommand{\SetRelAngle}[1]{%
    \def\RelAngle{#1}   
    % max +23 Min -30
    \def\Angle{\AngleMax+#1}

    \pgfmathsetmacro\RadCos{\Radius*cos(\Angle)}
    \pgfmathsetmacro\RadSin{\Radius*sin(\Angle)}
    \pgfmathsetmacro\LCos{\Length*cos(\Angle)}
    \pgfmathsetmacro\LSin{\Length*sin(\Angle)}

    \pgfmathsetmacro\CosAlt{cos(\Alt)}
    \pgfmathsetmacro\SinAlt{sin(\Alt)}
    \pgfmathsetmacro\CosAzi{cos(\Azi)}
    \pgfmathsetmacro\SinAzi{sin(\Azi)}

    \pgfmathsetmacro\SinAziSinAlt{\SinAzi*\SinAlt}
    \pgfmathsetmacro\CosAziSinAlt{\CosAzi*\SinAlt}

    \pgfmathsetmacro\CosAngle{cos(\Angle)}
    \pgfmathsetmacro\SinAngle{sin(\Angle)}
    \pgfmathsetmacro\TanAngle{tan(\Angle)}

    %                           ----- Centre
    %                           ----- de l'ellipse surface
    \pgfmathsetmacro\CX{\LCos-\RadCos/\TanAngle}
    \pgfmathsetmacro\CZ{\LSin-\RadCos}

    %                           ---- Contact surface bord
    %                           ---- sup cylindre 
    \pgfmathsetmacro\CXX{\LCos+\RadSin}     

    %                           ----- grand axe au fond
    \pgfmathsetmacro\GAZ{1.5}
    \pgfmathsetmacro\GAX{-\GAZ*tan(\Angle)}
    \pgfmathsetmacro\GAY{%
        \GAZ*(tan(\Angle)*tan(\Azi)+tan(\Alt)/cos(\Azi))}
    }

% #1 premier point               ---- Angle entre 2 nodes ----
% #2 second point
% On récupère le résultat dans \MyAngle
\newcommand{\NodeAngle}[2]{%
\pgfextra{
    \pgfmathanglebetweenpoints%
        {\pgfpointanchor{#1}{center}}%
        {\pgfpointanchor{#2}{center}}%
        \global\let\MyAngle\pgfmathresult
}}

%                                   ---- Calculate projection
\newcommand{\CoorXY}[4][MyNode]{%
    \pgfmathsetmacro\PjX{%
         #2*\CosAzi
        -#3*\SinAzi}
    \pgfmathsetmacro\PjY{%
         #2*\SinAziSinAlt
        +#3*\CosAziSinAlt
        +#4*\CosAlt}
    \coordinate (#1) at (\PjX,\PjY) ;
    }

%                               ---- with a dot for debugging
\newcommand{\CoorXYT}[4][MyNode]{%
    \CoorXY[#1]{#2}{#3}{#4}
    \node[small dot,label={[font=\scriptsize]#1}] at (#1) {}
    }

%%%%                        ---- Use path several times
%%%%                        ---- thanks to Andrew Stacey
\makeatletter
\tikzset{
  use path for main/.code={%
    \tikz@addmode{%
      \expandafter\pgfsyssoftpath@setcurrentpath\csname tikz@intersect@path@name@#1\endcsname
    }%
  },
  use path for actions/.code={%
    \expandafter\def\expandafter\tikz@preactions\expandafter{\tikz@preactions\expandafter\let\expandafter\tikz@actions@path\csname tikz@intersect@path@name@#1\endcsname}%
  },
  use path/.style={%
    use path for main=#1,
    use path for actions=#1,
  }
}
\makeatother

%%%%                        ---- Définition des styles ----
\tikzset{%
    small dot/.style={fill=black,circle,scale=0.3},
    surface/.style={blue!75!black!75,fill=blue!10,smooth},
    fond/.style={blue!75!black!75,fill=blue!80!black!20}
    }

% ##############
\begin{document}
% ##############
%\foreach \An in {36,15,1,0,-1,-12}{%
%\SetRelAngle{\An}

\SetRelAngle{5}
\begin{tikzpicture}[scale=2]


\clip (-\Radius-.5,-1.5*\Radius)
    rectangle (\Length+1,\Length+.5) ;

%%%% Debugging

% Repère 
\CoorXY[CB]{0}{0}{0} ; 
%\CoorXYT[X]{2}{0}{0} ; 
%\CoorXYT[Y]{0}{3}{0} ; 
%\CoorXYT[Z]{0}{0}{2} ; 
%\draw[red,<-] (X) -- ($ (X)!2!(CB) $) ;
%\draw[red,<-] (Y) -- ($ (Y)!2!(CB) $) ;
%\draw[red,<-] (Z) -- ($ (Z)!2!(CB) $) ;

% Ellipse du haut
\CoorXY[CH]{\LCos}{0}{\LSin} ;
\CoorXY[XH]{\LCos}{-\Radius}{\LSin} ;

% Ellipse surface
\CoorXY[SH]{\CX}{0}{\CZ} ;
\CoorXY[SXH]{\CX}{-\Radius}{\CZ} ;
\CoorXY[SYH]{\CXX}{0}{\CZ} ;

%\draw[thin,dashed] (SH)--(SYH) ;

% Ellipse du bas
%\CoorXYT[BD]{0}{\Radius}{0} ;
\CoorXY[BG]{0}{-\Radius}{0} ;
\CoorXY[BH]{-\RadSin}{0}{\RadCos} ;
%\CoorXYT[BB]{\RadSin}{0}{-\RadCos} ;

% Grand Axe
\CoorXY[GA]{\GAX}{\GAY}{\GAZ} ;


%%%%                        ---- Plan cylindre bas ----
\begin{scope}
\pgftransformtriangle
    {\pgfpointanchor{CB}{center}}
    {\pgfpointanchor{BG}{center}}
    {\pgfpointanchor{BH}{center}} ;
%\draw (-1pt,-1pt) rectangle (1pt,1pt) ;
%\draw (0pt,-1pt) -- (0pt,1pt) (-1pt,0pt) -- (1pt,0pt) ;
\NodeAngle{CB}{GA} ;    
\coordinate (GaBL) at (\MyAngle:1pt) ;
\coordinate (GaBR) at (180+\MyAngle:1pt) ;

\path [name path global=fondL]
    (GaBL) arc (\MyAngle:\MyAngle+180:1pt) ;
\path [name path global=fondR]
    (GaBL) arc (\MyAngle+360:\MyAngle+180:1pt) ;

\end{scope}

%%%%                        ---- Plan cylindre haut ----
\begin{scope}
\pgftransformtriangle
    {\pgfpointanchor{CH}{center}}
    {\pgfpointanchor{XH}{center}}
    {\pgfpointanchor{SYH}{center}} ;
%\draw (-1pt,-1pt) rectangle (1pt,1pt) ;
%\draw (0pt,-1pt) -- (0pt,1pt) (-1pt,0pt) -- (1pt,-0pt) ;
%\draw (0,0) circle (1pt) ;
% Attention dans ce plan l'axe y est vers le bas
\coordinate (GaHL) at (-\MyAngle:1pt) ;
\coordinate (GaHR) at (180-\MyAngle:1pt) ;  

\path [name path global=hautL]
    (GaHL) arc (-\MyAngle:180-\MyAngle:1pt) ;
\path [name path global=hautR]
    (GaHL) arc (-\MyAngle+360:-\MyAngle+180:1pt) ;

%\draw (GaHR)--(GaHL) ;
\end{scope}

%%%%                        ---- Plan de la surface ----
\begin{scope}
\pgftransformtriangle
    {\pgfpointanchor{SH}{center}}
    {\pgfpointanchor{SXH}{center}}
    {\pgfpointanchor{SYH}{center}} ;
%\draw (-1pt,-1pt) rectangle (1pt,1pt) ;
%\draw (0pt,-1pt) -- (0pt,1pt) (-1pt,0pt) -- (1pt,-0pt) ;
\coordinate (bobR) at (180-\MyAngle:1pt) ;
\coordinate (bobL) at (-\MyAngle:1pt) ;
\path [name path global=surface] (0pt,0pt) circle (1pt) ;
\end{scope}


%\pgfmathifthenelse{\AngleMax>\Angle}{0}{1} ;
%\ifthenelse{\pgfmathresult=1}{%
    %%%%%%%%%%%%%%%%%%%%%
    %%%% Cas ellipse %%%%
    %%%%%%%%%%%%%%%%%%%%%

    % remplissage
    %\fill[fond]
    %   (GaBL)--(bobL)--(bobR)--(GaBR) --cycle ;

    % dessin de la surface
    \draw [use path=surface,surface] ;
    \draw [use path=fondL] ;
    \draw [use path=fondR] ;
    \draw [use path=hautL] ;
    \draw [use path=hautR] ;

    %}{%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%% cas ellipse tronquée %%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %}      

\draw (GaBL)--(GaHL) ;
\draw (GaBR)--(GaHR) ;
\end{tikzpicture}
\end{document}

información relacionada