5

I am trying to draw the following "flowchart"

enter image description here

After some fiddling I was able to come up with the following solution

enter image description here

What I am struggling with mainly boils down to two things

  • How can I align the arrows so that they hit the boxes at straight angles? Right now I guessed, and approximated where to put them.
  • Is there an easy way to obtain fat arrows as displayed in the image?

Any alternative solutions to obtain the desired image are welcome as always.

Code for my attempt

\documentclass{article} 

\usepackage{xcolor}
\definecolor{UiT-main}{HTML}{003349}
\definecolor{UiT-red}{HTML}{CB333B}
\definecolor{UiT-blue}{HTML}{007396}
\definecolor{UiT-cyan}{HTML}{59BEC9}
\definecolor{UiT-orange}{HTML}{F2A900}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,calc}

% Define block styles
\tikzstyle{sun} = [circle,minimum height=0.6cm, draw, fill=UiT-orange, 
text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt]
\tikzstyle{sunEmpty} = [circle,minimum height=0.6cm, 
text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt]
\tikzstyle{block} = [rectangle, draw, fill=green!20, 
text width=20em, text centered, minimum height=4em]
\tikzstyle{line} = [draw, -latex']

\begin{document}

\begin{tikzpicture}[node distance = 2cm, auto]
% Place nodes
\node [sun] (Sun) {Sun};
\node [sunEmpty,right of=Sun] (SunEmpty) {};
\node [block, right of=Sun, yshift=-2cm] (greenhouse) {Greenhouse layer};
\node [block, fill=black!20, below of=greenhouse, yshift=-2cm] (surface) {surface};
% Draw edges  
\path [line] (Sun) -- node {}($(surface.north west)!0.23!(surface.north east)$);
\path [line,shorten <=0.25cm,shorten >=0.25cm] (surface) -- node {}(greenhouse);
\path [line] ($(greenhouse.north west)!0.64!(greenhouse.north east)$) -- node {}(SunEmpty.north);
\end{tikzpicture}
\end{document}
N3buchadnezzar
  • 11,348
  • 7
  • 55
  • 114

1 Answers1

4

How can I align the arrows so that they hit the boxes at straight angles? Right now I guessed, and approximated where to put them.

The coordinate (surface.north-|sun) will have x-coordinate value of sun and y-coordinate value of surface.north. So the path below will be hitting the box (surface) in straight angle

\path (Sun) -- (surface.north-|Sun);

Is there an easy way to obtain fat arrows as displayed in the image?

Increase line width.

Also, adjusted the outer sep of nodes so that arrows won't touch the nodes. enter image description here

MWE

\documentclass[margin=3mm]{standalone} 
\usepackage{xcolor}
\usepackage{tikz}
\definecolor{UiT-main}{HTML}{003349}
\definecolor{UiT-red}{HTML}{CB333B}
\definecolor{UiT-blue}{HTML}{007396}
\definecolor{UiT-cyan}{HTML}{59BEC9}
\definecolor{UiT-orange}{HTML}{F2A900}

% Define block styles \tikzset{sunEmpty/.style={circle,minimum height=0.6cm, text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt, outer sep=1mm}, sun/.style={sunEmpty,draw,fill=UiT-orange}, block/.style={rectangle, draw, fill=green!20, text width=20em, text centered, minimum height=4em, outer sep=1mm}, line/.style={-latex, line width=1.8mm, draw=blue!40}}

\begin{document} \begin{tikzpicture}[node distance = 2cm, auto] % Place nodes \node [sun] (Sun) {Sun}; \node [sunEmpty,right of=Sun] (SunEmpty) {}; \node [block, right of=Sun, yshift=-2cm] (greenhouse) {Greenhouse layer}; \node [block, fill=black!20, below of=greenhouse, yshift=-2cm] (surface) {surface}; % Draw edges
\path [line,UiT-orange] (Sun) -- (surface.north-|Sun); \path [line] (surface) -- (greenhouse); \path [line] (greenhouse.north-|SunEmpty) -- (SunEmpty.north); \end{tikzpicture} \end{document}

EDIT - A better version (thanks to user121799)

\documentclass[margin=3mm,tikz]{standalone} 
\usetikzlibrary{shapes.arrows,calc,shadows.blur,positioning}
\definecolor{UiT-main}{HTML}{003349}
\definecolor{UiT-red}{HTML}{CB333B}
\definecolor{UiT-blue}{HTML}{007396}
\definecolor{UiT-cyan}{HTML}{59BEC9}
\definecolor{UiT-orange}{HTML}{F2A900}

% Define block styles \tikzset{sun/.style={circle,minimum height=0.6cm, draw, fill=UiT-orange, text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt, outer sep=1mm}, sunEmpty/.style={circle,minimum height=0.6cm, text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt, outer sep=1mm}, block/.style={rectangle, draw, fill=green!20, text width=20em, text centered, minimum height=4em, outer sep=1mm}, line/.style={-latex, double arrow, line width=1.8mm, draw=blue!40}}

\begin{document} \begin{tikzpicture}[node distance = 2cm, auto, fat arrow/.style={% https://tex.stackexchange.com/a/432147/121799 to path={ let \p1 = ($(\tikztotarget)-(\tikztostart)$), \n1 = {int(mod(scalar(atan2(\y1,\x1))+360, 360))}, % calculate angle in range [0,360) \n2 = {veclen(\x1,\y1)} in -- (\tikztotarget) node[inner xsep=0pt,inner ysep=5pt, % use inner ysep to set width minimum height=\n2-\pgflinewidth, single arrow,midway,sloped,anchor=center, #1 % arguments passed to fat arrow added here ] {} \tikztonodes} }, fat arrow/.default=, % empty default for argument of fat arrow pft/.style={single arrow,draw=blue,blur shadow,xshift=-2pt,minimum width=10mm, single arrow head extend=.2cm } ] % Place nodes \node [sun,blur shadow] (Sun) {Sun}; \node [sunEmpty,right=2.2cm of Sun] (SunEmpty) {}; \node [block, right of=Sun, yshift=-2cm,blur shadow,rounded corners=2pt] (greenhouse) {Greenhouse layer}; \node [block, fill=black!20, below of=greenhouse, yshift=-2cm,blur shadow,rounded corners=2pt] (surface) {surface}; % Draw edges
\path [fat arrow={pft,top color=UiT-orange!80,bottom color=UiT-orange}] (Sun.south) to (surface.north-|Sun) ; \path [fat arrow={pft,top color=blue!20,bottom color=blue!40}] (surface.north) to (greenhouse.south); \path [fat arrow={pft,top color=blue!20,bottom color=blue!40,minimum width=5mm}] (greenhouse.north-|SunEmpty) to (SunEmpty.north); \path [fat arrow={pft,top color=blue!20,bottom color=blue!40,minimum width=5mm}] (greenhouse.south-|SunEmpty) to (surface.north-|SunEmpty); \end{tikzpicture} \end{document}

enter image description here

nidhin
  • 7,932