
Estoy intentando dibujar un avión. Cuando estaba dibujando la ventana de la cabina, usaba puntos proyectados para obtener ángulos rectos. Pero las cosas no están saliendo como se esperaba. ¿Alguien podría darme una indicación sobre lo que estoy haciendo incorrectamente?
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\pagestyle{empty}
\begin{document}
\def\aeBodyRadius{0.25cm}
\def\aeBodyNoseDistance{0.21cm}
\begin{tikzpicture}[x=5cm,y=5cm,scale=3,every node={transform shape}]
\coordinate (TAIL) at (0,0);
\coordinate (NOSE) at ($(TAIL)+(30:1)$);
\coordinate (MID) at ($(TAIL)!0.75!(NOSE)$);
\coordinate (MID/TOP) at ($(MID)!\aeBodyRadius!90:(NOSE)$);
\coordinate (MID/BOT) at ($(MID)!\aeBodyRadius!-90:(NOSE)$);
\coordinate (NOSE/TIP) at ($(NOSE)!\aeBodyNoseDistance!90:(MID)$);
\coordinate (HIND/TOP) at ($(TAIL)!\aeBodyRadius!90:(NOSE)$);
\coordinate (HIND/BOT) at ($(TAIL)!\aeBodyRadius!-90:(NOSE)$);
\node[fill,circle,inner sep=1pt] at (MID/TOP) {};
\node[fill,circle,inner sep=1pt] at (MID/BOT) {};
\node[fill,circle,inner sep=1pt] at (HIND/TOP) {};
\node[fill,circle,inner sep=1pt] at (HIND/BOT) {};
\draw[rounded corners=10pt]
(HIND/TOP) --
(MID/TOP) --
node [pos=0.25] (WINDOW/TOP/N) {}
node [pos=0.50] (WINDOW/BOT/N) {}
(NOSE/TIP) --
(MID/BOT) --
(HIND/BOT);
\coordinate (WINDOW/TOP) at (WINDOW/TOP/N.center);
\coordinate (WINDOW/BOT) at (WINDOW/BOT/N.center);
\coordinate (WINDOW/RIG/T) at ($(TAIL)!(WINDOW/TOP)!(NOSE)$);
\coordinate (WINDOW/RIG) at ($(WINDOW/TOP)!(WINDOW/BOT)!(WINDOW/RIG/T)$);
\draw (WINDOW/TOP) -- (WINDOW/RIG) -- (WINDOW/BOT);
\draw[red] (TAIL) -- (NOSE);
\end{tikzpicture}
\end{document}
La línea "roja" que recorre el centro del avión muestra claramente cómo miperpendicularno es lo que debería ser.
ACTUALIZAR
Lo que parecenoestar funcionando es el siguiente fragmento de código:
\coordinate (WINDOW/RIG/T) at ($(TAIL)!(WINDOW/TOP)!(NOSE)$);
\coordinate (WINDOW/RIG) at ($(WINDOW/TOP)!(WINDOW/BOT)!(WINDOW/RIG/T)$);
Los puntos proyectados no parecen estar en la perpendicular adecuada. En particular,
(WINDOW/RIG)
debe estar por encima de la línea roja ya que la línea que pasa por (WINDOW/TOP)
y (WINDOW/RIG/T)
debe ser perpendicular a la línea roja que pasa por (TAIL)
y (NOSE)
.
Respuesta1
Como lo mencionaA. Ellett, el error es causado por \pgfpointnormalised
. En este se da una solución para obtener una mejor precisión.respuesta.
Aplicado en el MWE:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\pagestyle{empty}
% use the Mark Wibrow's correction
\makeatletter
\def\pgfpointnormalised#1{%
\pgf@process{#1}%
\pgfmathatantwo{\the\pgf@y}{\the\pgf@x}%
\let\pgf@tmp=\pgfmathresult%
\pgfmathcos@{\pgf@tmp}\pgf@x=\pgfmathresult pt\relax%
\pgfmathsin@{\pgf@tmp}\pgf@y=\pgfmathresult pt\relax%
}
\makeatother
\begin{document}
\def\aeBodyRadius{0.25cm}
\def\aeBodyNoseDistance{0.21cm}
\begin{tikzpicture}[x=5cm,y=5cm,scale=3,every node={transform shape}]
\coordinate (TAIL) at (0,0);
\coordinate (NOSE) at ($(TAIL)+(30:1)$);
\coordinate (MID) at ($(TAIL)!0.75!(NOSE)$);
\coordinate (MID/TOP) at ($(MID)!\aeBodyRadius!90:(NOSE)$);
\coordinate (MID/BOT) at ($(MID)!\aeBodyRadius!-90:(NOSE)$);
\coordinate (NOSE/TIP) at ($(NOSE)!\aeBodyNoseDistance!90:(MID)$);
\coordinate (HIND/TOP) at ($(TAIL)!\aeBodyRadius!90:(NOSE)$);
\coordinate (HIND/BOT) at ($(TAIL)!\aeBodyRadius!-90:(NOSE)$);
\node[fill,circle,inner sep=1pt] at (MID/TOP) {};
\node[fill,circle,inner sep=1pt] at (MID/BOT) {};
\node[fill,circle,inner sep=1pt] at (HIND/TOP) {};
\node[fill,circle,inner sep=1pt] at (HIND/BOT) {};
\draw[rounded corners=10pt]
(HIND/TOP) --
(MID/TOP) --
node [pos=0.25] (WINDOW/TOP/N) {}
node [pos=0.50] (WINDOW/BOT/N) {}
(NOSE/TIP) --
(MID/BOT) --
(HIND/BOT);
\coordinate (WINDOW/TOP) at (WINDOW/TOP/N.center);
\coordinate (WINDOW/BOT) at (WINDOW/BOT/N.center);
\coordinate (WINDOW/RIG/T) at ($(TAIL)!(WINDOW/TOP)!(NOSE)$);
\coordinate (WINDOW/RIG) at ($(WINDOW/TOP)!(WINDOW/BOT)!(WINDOW/RIG/T)$);
\draw (WINDOW/TOP) -- (WINDOW/RIG) -- (WINDOW/BOT);
\draw[red] (TAIL) -- (NOSE);
\end{tikzpicture}
\end{document}
Respuesta2
Probablemente pretendías colocar WINDOW/RIG/T a lo largo del eje principal, pero funcionó. (Si no está roto...)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\pagestyle{empty}
\begin{document}
\def\aeBodyRadius{0.25cm}
\def\aeBodyNoseDistance{0.21cm}
\begin{tikzpicture}[x=5cm,y=5cm,scale=3,every node={transform shape}]
\coordinate (TAIL) at (0,0);
\coordinate (NOSE) at ($(TAIL)+(30:1)$);
\coordinate (MID) at ($(TAIL)!0.75!(NOSE)$);
\coordinate (MID/TOP) at ($(MID)!\aeBodyRadius!90:(NOSE)$);
\coordinate (MID/BOT) at ($(MID)!\aeBodyRadius!-90:(NOSE)$);
\coordinate (NOSE/TIP) at ($(NOSE)!\aeBodyNoseDistance!90:(MID)$);
\coordinate (HIND/TOP) at ($(TAIL)!\aeBodyRadius!90:(NOSE)$);
\coordinate (HIND/BOT) at ($(TAIL)!\aeBodyRadius!-90:(NOSE)$);
\node[fill,circle,inner sep=1pt] at (MID/TOP) {};
\node[fill,circle,inner sep=1pt] at (MID/BOT) {};
\node[fill,circle,inner sep=1pt] at (HIND/TOP) {};
\node[fill,circle,inner sep=1pt] at (HIND/BOT) {};
\draw[rounded corners=10pt]
(HIND/TOP) --
(MID/TOP) --
node [pos=0.25] (WINDOW/TOP/N) {}
node [pos=0.50] (WINDOW/BOT/N) {}
(NOSE/TIP) --
(MID/BOT) --
(HIND/BOT);
\coordinate (WINDOW/TOP) at (WINDOW/TOP/N.center);
\coordinate (WINDOW/BOT) at (WINDOW/BOT/N.center);
%start of modifications
\coordinate (WINDOW/RIG/T) at ($(TAIL)!(WINDOW/TOP)!90:(NOSE)$);
\coordinate (WINDOW/RIG) at ($(WINDOW/TOP)!(WINDOW/BOT)!90:(WINDOW/RIG/T)$);
\node[fill,circle,inner sep=1pt] at (WINDOW/RIG/T) {};% way down near the tail
\draw[blue] (WINDOW/TOP) -- (WINDOW/RIG) -- (WINDOW/BOT);
%end of modifications
\draw[red] (TAIL) -- (NOSE);
\end{tikzpicture}
\end{document}
Respuesta3
Para mostrar lo que quise decir al dibujarlo plano y rotarlo:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\pagestyle{empty}
\newlength{\myx}
\newlength{\myy}
\begin{document}
\def\aeBodyRadius{0.25cm}
\def\aeBodyNoseDistance{0.21cm}
\begin{tikzpicture}[x=5cm,y=5cm,scale=3,every node={transform shape},rotate=30]% changed here
\coordinate (TAIL) at (0,0);
\coordinate (NOSE) at ($(TAIL)+(1,0)$);% changed here
\coordinate (MID) at ($(TAIL)!0.75!(NOSE)$);
\coordinate (MID/TOP) at ($(MID)!\aeBodyRadius!90:(NOSE)$);
\coordinate (MID/BOT) at ($(MID)!\aeBodyRadius!-90:(NOSE)$);
\coordinate (NOSE/TIP) at ($(NOSE)!\aeBodyNoseDistance!90:(MID)$);
\coordinate (HIND/TOP) at ($(TAIL)!\aeBodyRadius!90:(NOSE)$);
\coordinate (HIND/BOT) at ($(TAIL)!\aeBodyRadius!-90:(NOSE)$);
\node[fill,circle,inner sep=1pt] at (MID/TOP) {};
\node[fill,circle,inner sep=1pt] at (MID/BOT) {};
\node[fill,circle,inner sep=1pt] at (HIND/TOP) {};
\node[fill,circle,inner sep=1pt] at (HIND/BOT) {};
\draw[rounded corners=10pt]
(HIND/TOP) --
(MID/TOP) --
node [pos=0.25] (WINDOW/TOP/N) {}
node [pos=0.50] (WINDOW/BOT/N) {}
(NOSE/TIP) --
(MID/BOT) --
(HIND/BOT);
\coordinate (WINDOW/TOP) at (WINDOW/TOP/N.center);
\coordinate (WINDOW/BOT) at (WINDOW/BOT/N.center);
\node[fill,circle,inner sep=1pt] at (NOSE) {};
\node[fill,circle,inner sep=1pt] at (TAIL) {};
\coordinate (WINDOW/RIG/T) at ($(TAIL)!(WINDOW/TOP)!(NOSE)$);
\coordinate (WINDOW/RIG) at ($(WINDOW/TOP)!(WINDOW/BOT)!(WINDOW/RIG/T)$);
\node[fill,circle,inner sep=1pt] at (WINDOW/RIG/T) {};
\draw[blue] (WINDOW/TOP) -- (WINDOW/RIG) -- (WINDOW/BOT);
\draw[red] (TAIL) -- (NOSE);
\end{tikzpicture}
\end{document}