
Ich möchte eine Grafik wie die folgende erstellen:
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
\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 Rasterizer
Knotenplatzierung 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 edge
diese 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 Direct2D
dem Knoten direkt über der Mitte des Software Rasterizer
Knotens. Dieselbe Idee für (I.south-|{$(H.north)!.5!(H.north east)$})
, aber etwas komplizierter. Jetzt ist es der Punkt auf dem Direct2D
Knoten 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 G
und J
aus 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 fit
Berechnung 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}
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: