
Привет, я хочу нарисовать несколько геодезических, ускоряющихся друг к другу, используя TikZ. Я украл код из онлайн-примера, чтобы настроить две плоскости одну над другой (верхняя невидима — я просто использую ее, чтобы начать там геодезические).
Проблема, с которой я столкнулся, заключается в рисовании линий (или геодезических) между двумя плоскостями. Это работает нормально, если мне нужны кривые линии, но мне нужно, чтобы они были кривыми — в частности, я хочу, чтобы они изгибались друг к другу по мере приближения к своим соответствующим конечным точкам на нижней плоскости.
На данный момент мой код выглядит следующим образом:
\begin{tikzpicture}[scale=.9,every node/.style={minimum size=1cm},on grid]
\begin{pgfonlayer}{bottom}
\begin{scope}[
% Lower layer
yshift=0,every node/.append style={
yslant=0.5,xslant=-1,rotate=-10},
yslant=0.5,xslant=-1,rotate=-10]
\fill[black,fill opacity=0.9] (0,0) rectangle (5,5);
\draw[black] (0,0) rectangle (5,5);
\node[name=B,draw,scale=0.4,black,very thick,text width=0.95,text height=0.95,inner sep=0pt,] at (2.525,2.525) {};
\end{scope}![enter image description here][1]\end{pgfonlayer}
\begin{scope}[ % Upper layer
yshift=105,every node/.append style={
yslant=0.5,xslant=-1,rotate=-10},yslant=0.5,xslant=-1,rotate=-10
]
\fill[fill=none,fill opacity=0.5, opacity=0.5] (0,0) rectangle (5,5);
\node[scale=.9,draw,fill=none,draw=none, fill opacity=0.9,opacity=0,very thick,name=A,text width=3cm,text height=3cm,inner sep=0pt] at (2.5,2.5) {};
\begin{pgfonlayer}{bottom}
\foreach \i in {north east, north west, south east, south west}
\draw[green,very thick] (A.\i) parabola (B.\i);
\end{pgfonlayer}
\end{scope}
\end{tikzpicture}
Это дает следующее:
Как вы видите, линии не изгибаются друг к другу приятным образом - я хочу, чтобы они становились все ближе и ближе друг к другу по мере достижения черной поверхности, а не делали это таким странным параболическим образом. Очевидно, проблема в том, что я использовал команду параболы. Я пробовал возиться с различными другими доступными кривыми, но у меня просто не получается заставить это работать.
Кто-нибудь знает, как это сделать? Это вообще возможно?
Было бы неплохо также иметь стрелки в середине входящих линий, если это возможно?
Большое спасибо.
решение1
Вот одна идея. Я по сути начал заново с кода, так как предоставленный пример не компилировался и содержал несколько ошибок после добавления необходимого кода.
Вид чертежа определяется настройками единичного вектора x={(<x-dim>,<y-dim>)}
и т. д., применяемыми к tikzpicture
среде. Обратите внимание на добавление z-координаты ко всем точкам. Я считаю, что это проще использовать и визуализировать, чем настраивать xslant
, yslant
, и rotate
.
Кривизну зеленых линий можно регулировать, изменяя контрольные точки для кривых линий. Я использую библиотеку calc
для удобного расчета этих контрольных точек на основе начальных и конечных координат кривых.
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[x={(0.935cm,0.126cm)},y={(-0.354cm,0.312cm)},z={(0cm,1cm)}]
\draw[fill,fill opacity=0.9] (0,0,0) -- ++(5,0,0) -- ++(0,5,0) -- ++(-5,0,0) -- cycle;
\draw[very thick] ( 2.3,2.3,0) coordinate (B1)
-- ++( 0.4,0.0,0) coordinate (B2)
-- ++( 0.0,0.4,0) coordinate (B3)
-- ++(-0.4,0.0,0) coordinate (B4) -- cycle;
\fill[opacity=0.1] (0,0,2) -- ++(5,0,0) -- ++(0,5,0) -- ++(-5,0,0) -- cycle;
\path ( 1.15,1.15,2) coordinate (A1)
-- ++( 2.70,0.00,0) coordinate (A2)
-- ++( 0.00,2.70,0) coordinate (A3)
-- ++(-2.70,0.00,0) coordinate (A4) -- cycle;
\foreach \i in {1,...,4}
\draw[green,very thick] (A\i) ..
controls ($(A\i)!0.5!(2.5,2.5,1)$) and ($(B\i)+(0,0,0.4)$) .. (B\i);
\end{tikzpicture}
\end{document}
Думаю, у меня получилось то, что вам нужно, но если нет, оставьте комментарий, и я постараюсь приблизиться к желаемому результату.