Wie erstelle ich diese Grafik mit TikZ?

Wie erstelle ich diese Grafik mit TikZ?

Ich möchte eine Grafik wie die folgende erstellen:

Bildbeschreibung hier eingeben

Unten ist mein Code:

    \documentclass[11pt]{article}
    \usepackage{tikz}
    \usetikzlibrary{arrows}

    \newcommand{\psign}{+}
    \newcommand{\ppsign}{++}

    \begin{document}

    \noindent
    \begin{tikzpicture}
    \tikzstyle{my node} = [draw,rectangle,minimum width=2.2cm,minimum height=0.8cm, node distance=2cm]
    %\draw[black!20] (-0.5cm,-0.5cm) grid (14cm,7cm);
    \node [my node] (A) {GDI DDI};
    \node [my node] (B) [above of=A] {GDI};

    \begin{scope}[xshift=3cm]
    \node                       (C)     {Graphics Driver};
    \node [my node] (D) [above of=C]    {GDI\psign Flat API};
    \node [my node] (E) [above of=D]    {GDI\psign\ C\ppsign API};
    \end{scope}

    \begin{scope}[xshift=6cm]
    \node [my node] (F) {DX DDI};
    \node [my node] (G) [above of=F] {DXGI};
    \node [my node] (H) [above of=G] {Direct3D};
    \node [my node] (I) [above of=H,minimum width=4cm,right=0pt] {Direct2D};
    \node [my node] (J) [right of=I,right=0pt,node distance=3cm] {DirectWrite};
    \node [my node] (K) [right of=F, node distance=4cm] {Software Rasterizer};
    \end{scope}

    \begin{scope}[->,>=triangle 45,semithick]
    \path (B) edge (A);
    \path (E) edge (D);
    \path (H) edge (G);
    \path (G) edge (F);
    \path (J) edge (I);
    \end{scope}

    \draw [dashed] (-1.25,1cm) -- (14,1cm);
    \end{tikzpicture}

    \end{document}

Antwort1

Bildbeschreibung hier eingeben

\documentclass[11pt]{article}
\usepackage{tikz,xcolor}
\usetikzlibrary{arrows,calc,fit,backgrounds}

\definecolor{fcolor}{HTML}{F1F1F1}

\newcommand{\psign}{+}
\newcommand{\ppsign}{++}

\begin{document}

\noindent
\begin{tikzpicture}
\tikzstyle{my node} = [draw,rectangle,minimum width=2.2cm,minimum height=0.8cm, node distance=2cm]
%\draw[black!20] (-0.5cm,-0.5cm) grid (14cm,7cm);
\node [my node] (A) {GDI DDI};
\node [my node] (B) [above of=A] {GDI};

\begin{scope}[xshift=3cm]
\node                       (C)     {Graphics Driver};
\node [my node] (D) [above of=C]    {GDI\psign Flat API};
\node [my node] (E) [above of=D]    {GDI\psign\ C\ppsign API};
\end{scope}

\begin{scope}[xshift=6cm]
\node [my node] (F) {DX DDI};
\node [my node] (G) [fill=white,above of=F] {DXGI};
\node [my node] (H) [fill=white,above of=G] {Direct3D};
\node [my node] (I) [fill=white,above of=H,minimum width=4.5cm,right=0pt] {Direct2D};
\node [my node] (J) [fill=white,right of=I,right=0pt,node distance=3.5cm] {DirectWrite};
\node [my node] (K) [fill=white,right of=G, node distance=4cm] {Software Rasterizer};
\end{scope}

\begin{scope}[->,>=triangle 45,semithick]
\path (B) edge (A);
\path (E) edge (D);
\path (H) edge (G);
\path (G) edge (F);
\path (J) edge (I);
\path (I.south-|K) edge (K);
\path (I.south-|{$(H.north)!.5!(H.north east)$}) edge ($(H.north)!.5!(H.north east)$);
\end{scope}

\begin{scope}[on background layer]
\node[rectangle,fill=fcolor,fit=(G.south west) (J.north east)] {};
\end{scope}

\draw [dashed] (-1.25,1cm) -- (14,1cm);
\end{tikzpicture}

\end{document}

Zuerst habe ich die Software RasterizerKnotenplatzierung korrigiert right of=G:

\node [my node] (K) [right of=G, node distance=4cm] {Software Rasterizer};

Dann habe ich für die verbleibenden zwei Pfeilverbindungen edgediese beiden Zeilen zu Ihren hinzugefügt:

\path (I.south-|K) edge (K);
\path (I.south-|{$(H.north)!.5!(H.north east)$}) edge ($(H.north)!.5!(H.north east)$);

Hier (I.south-|K)ist der Punkt auf Direct2Ddem Knoten direkt über der Mitte des Software RasterizerKnotens. Dieselbe Idee für (I.south-|{$(H.north)!.5!(H.north east)$}), aber etwas komplizierter. Jetzt ist es der Punkt auf dem Direct2DKnoten direkt über dem Mittelpunkt zwischen Nord- und Nordostknoten Direct3D.

Die hervorgehobenen fünf Blöcke können von der Bibliothek abgerufen werden fit, diesmal jedoch innerhalb eines Gültigkeitsbereichs ( on background layer), um das doppelte Zeichnen der Knoten zu vermeiden. Wir wählen zwei beliebige äußerste Knoten wie Gund Jaus und geben ihre äußersten Ecken (G.south west)bzw. an (J.north east).

Antwort2

Dies ist in etwa das, was Sie suchen. Beachten Sie fit, dass oben gezeichnet wird. Wenn Sie darunter eine Vollfarbe benötigen, müssen Sie diese Knoten möglicherweise zweimal zeichnen (einmal, um die Knoten für die fitBerechnung zu erhalten, und einmal, um sie erneut auf den Anpassungsbereich zu zeichnen. Sie können den Zeichencode einfach in einem Makro speichern und dieses Makro zweimal ausführen).

\documentclass[11pt]{article}
  \usepackage{tikz}
  \usetikzlibrary{arrows,calc}
  \usetikzlibrary{positioning,fit}
    \newcommand{\psign}{+}
    \newcommand{\ppsign}{++}

    \begin{document}

    \noindent
    \begin{tikzpicture}
    \tikzstyle{my node} = [draw,rectangle,minimum width=2.2cm,minimum height=0.8cm, node distance=2cm]
    %\draw[black!20] (-0.5cm,-0.5cm) grid (14cm,7cm);
    \node [my node] (A) {GDI DDI};
    \node [my node] (B) [above of=A] {GDI};

    \begin{scope}[xshift=3cm]
    \node                       (C)     {Graphics Driver};
    \node [my node] (D) [above of=C]    {GDI\psign Flat API};
    \node [my node] (E) [above of=D]    {GDI\psign\ C\ppsign API};
    \end{scope}

    \begin{scope}[xshift=6cm]
    \node [my node] (F) {DX DDI};
    \node [my node] (G) [above of=F] {DXGI};
    \node [my node] (H) [above of=G] {Direct3D};
    \node [my node] (I) [above of=H,minimum width=4cm,right=0pt] {Direct2D};
    \node [my node] (J) [right of=I,right=0pt,node distance=3cm] {DirectWrite};
    \node [my node] (K) [right of=G, node distance=4cm] {Software Rasterizer};
    \end{scope}


  \begin{scope}[ transform canvas={xshift=1cm},
    ->,>=triangle 45,semithick]
    \draw (I)  --  (I |- K.north);
  \end{scope}
  \begin{scope}[ transform canvas={xshift=-4em},
    ->,>=triangle 45,semithick]
    \draw (I)  --  (I |- H.north);
  \end{scope}

    \begin{scope}[->,>=triangle 45,semithick]
    \path (B) edge (A);
    \path (E) edge (D);
    \path (H) edge (G);
    \path (G) edge (F);
    \path (J) edge (I);
    \end{scope}

    \draw [dashed] (-1.25,1cm) -- (14,1cm);


    \node [fill=gray,opacity=0.2,dotted,fit = (H) (I) (J) (K) ] {};



    \end{tikzpicture}

    \end{document}

Bildbeschreibung hier eingeben

Ich gehe davon aus, dass Sie herausfinden können, wie Sie die Legende über dem grauen Bereich hinzufügen.

Antwort3

Leicht modifizierte und vereinfachte @daleif- und @AboAmmar-Lösungen (sie scheinen mir fast gleich zu sein :-)):

\documentclass[11pt, border=1mm,
               tikz,
               preview]{standalone}
\usetikzlibrary{arrows,calc,fit,backgrounds}
    \newcommand{\psign}{+}
    \newcommand{\ppsign}{++}

    \begin{document}
\begin{tikzpicture}[
    node distance = 2cm,
every node/.style = {draw, rectangle,
                    fill=white, % if you liked, otherwise should be omitted
                     minimum width=2.2cm, minimum height=0.8cm}
                    ]
\node  (A) {GDI DDI};
\node  (B) [above of=A] {GDI};

\begin{scope}[xshift=3cm]
\node  (C) [draw=none]     {Graphics Driver};
\node  (D) [above of=C]    {GDI\psign Flat API};
\node  (E) [above of=D]    {GDI\psign\ C\ppsign API};
\end{scope}

\begin{scope}[xshift=6cm]
\node  (F) {DX DDI};
\node  (G) [above of=F] {DXGI};
\node  (H) [above of=G] {Direct3D};
\node  (I) [above of=H,minimum width=4.5cm,right=0pt] {Direct2D};
\node  (J) [right of=I,right=0pt,node distance=3.5cm] {DirectWrite};
\node  (K) [right of=G, node distance=4cm] {Software Rasterizer};
\end{scope}

\coordinate (L) at ([xshift=7mm] H.north);
\path[-triangle 45,semithick]
    (B) edge (A)    (E) edge (D)    (H) edge (G)
    (G) edge (F)    (J) edge (I)    (I.south-|K) edge (K)
    (I.south -| L) edge (L)
    (I.south-|{$(H.north)!.5!(H.north east)$}) -- ($(H.north)!.5!(H.north east)$);

\scoped[on background layer]
    \node (M) [rectangle,fill=gray!30,fit=(G.south west) (J.north east)] {};

\coordinate (N) at ($(A.west)!0.5!(B.west)$);
\draw [dashed]  (N) -- (N -| M.east);
\end{tikzpicture}
        \end{document}

Dieser Code gibt:

Bildbeschreibung hier eingeben

verwandte Informationen