Wie schneidet man einen Hintergrund einschließlich Knoten entsprechend einer beliebigen Form zu?

Wie schneidet man einen Hintergrund einschließlich Knoten entsprechend einer beliebigen Form zu?

Die folgendeWE

\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, fit, backgrounds}

\tikzstyle{backA}=[rectangle,
fill=blue!30,
inner sep=0.2cm,
rounded corners=0mm]

\tikzstyle{backB}=[rectangle,
fill=purple!15,
inner sep=0.2cm,
rounded corners=0mm]

\tikzstyle{backC}=[rectangle,
fill=yellow!40,
inner sep=0.2cm,
rounded corners=0mm]

\tikzset{%
  >={Latex[width=2mm,length=2mm]},
            base/.style = {rectangle, rounded corners, draw=black,
                           minimum width=1cm, minimum height=1cm,
                           text centered,inner sep=0.3cm},
  operation/.style = {base, fill=SkyBlue},
}

\begin{document}    
\begin{tikzpicture}[node distance=0.8cm,
    every node/.style={fill=white}, align=center]
    \node (controller) [operation] {Microcontroller};
    \node (regulator) [operation, below = of controller] {Regulator};
    \node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
    \node (sensor) [operation, above = of controller] {Sensor};
    \node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
    \node (driver1) [operation, right = of sensor] {Driver 1};
    \node (driver2) [operation, left = of sensor] {Driver 2};
    \node (power) [operation, left = of regulator, align=center] {Input \\ Power};
    \node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
    \node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
    \node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
    \coordinate[left = of power] (d1) {};
    \coordinate[above = of d1, yshift=5.5cm] (d2) {};

    \draw[->]             (controller) -- (transceiver);
    \draw[<->]             (controller) -- (sensor);
    \draw[->]             (driver1) -- (motor1);
    \draw[->]             (driver2) -- (motor2);
    \draw[<->]             (sensor) -- (motor2);
    \draw[<->]             (sensor) -- (motor1);
    \draw[->]             (controller) -- (driver1);
    \draw[->]             (controller) -- (driver2);
    \draw[->]             (controller) -- (flash);
    \draw[->]             (regulator) -- (controller);
    \draw[->]             (power) -- (regulator);
    \draw[<->]             (transceiver) -- (computer);
    \draw[->]             (power) -- (d1) |- (motor2);
    \draw[->]             (power) -- (d1) --  (d2) -| (motor1);

    \begin{pgfonlayer}{background}
    \node [backC,
    fit=(driver1) (driver2) (sensor) (motor1) (motor2),
    label=above:{}] {};

    \node [backA,
    fit=(computer) (transceiver),
    label=above:{}] {};

    \node [backB,
    fit=(regulator) (power),
    label=above:{}] {};
    \end{pgfonlayer}
  \end{tikzpicture}
\end{document}

Erträge

Bildbeschreibung hier eingeben

Da der driver1Knoten ausschließlich vom gelben Hintergrund bedeckt sein sollte, muss ich den spezifischen Teil des violetten Hintergrunds abziehen, der den gelben stört. Insbesondere könnte eine akzeptable Grenze für den violetten Hintergrund ungefähr so ​​aussehen:

Bildbeschreibung hier eingeben

Wie kann ich so etwas erreichen?

Antwort1

Ich würde Bereiche nicht mit Weiß überzeichnen. Stellen Sie sich vor, Sie haben einen Hintergrund, den Sie behalten möchten. Und \tikzstyleist veraltet.

\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, fit, backgrounds}

% based on https://tex.stackexchange.com/a/12033/121799
\tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle 
  (current bounding box.north east)} }}

\tikzset{backA/.style={rectangle,
fill=blue!30,
inner sep=0.2cm,
rounded corners=0mm},
backB/.style={rectangle,
fill=purple!15,
inner sep=0.2cm,
rounded corners=0mm},
backC/.style={rectangle,
fill=yellow!40,
inner sep=0.2cm,
rounded corners=0mm}}

\tikzset{%
  >={Latex[width=2mm,length=2mm]},
            base/.style = {rectangle, rounded corners, draw=black,
                           minimum width=1cm, minimum height=1cm,
                           text centered,inner sep=0.3cm},
  operation/.style = {base, fill=SkyBlue},
}

\begin{document}    
\begin{tikzpicture}[node distance=0.8cm,
    every node/.style={fill=white}, align=center]
    \node (controller) [operation] {Microcontroller};
    \node (regulator) [operation, below = of controller] {Regulator};
    \node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
    \node (sensor) [operation, above = of controller] {Sensor};
    \node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
    \node (driver1) [operation, right = of sensor] {Driver 1};
    \node (driver2) [operation, left = of sensor] {Driver 2};
    \node (power) [operation, left = of regulator, align=center] {Input \\ Power};
    \node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
    \node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
    \node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
    \coordinate[left = of power] (d1) {};
    \coordinate[above = of d1, yshift=5.5cm] (d2) {};

    \draw[->]             (controller) -- (transceiver);
    \draw[<->]             (controller) -- (sensor);
    \draw[->]             (driver1) -- (motor1);
    \draw[->]             (driver2) -- (motor2);
    \draw[<->]             (sensor) -- (motor2);
    \draw[<->]             (sensor) -- (motor1);
    \draw[->]             (controller) -- (driver1);
    \draw[->]             (controller) -- (driver2);
    \draw[->]             (controller) -- (flash);
    \draw[->]             (regulator) -- (controller);
    \draw[->]             (power) -- (regulator);
    \draw[<->]             (transceiver) -- (computer);
    \draw[->]             (power) -- (d1) |- (motor2);
    \draw[->]             (power) -- (d1) --  (d2) -| (motor1);

    \begin{pgfonlayer}{background}
    \node [backC,
    fit=(driver1) (driver2) (sensor) (motor1) (motor2),
    label=above:{}] (F1){};

    \node [backB,
    fit=(regulator) (power),
    label=above:{}] {};
    \clip ([xshift=-5pt,yshift=-5pt]F1.south west) -|
    ([xshift=5pt,yshift=5pt]F1.north east) -| cycle  [reverseclip];
    \node [backA,
    fit=(computer) (transceiver),
    label=above:{}] {};
    \end{pgfonlayer}
  \end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

So was?

Bildschirmfoto

\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, fit, backgrounds}
\pgfdeclarelayer{background}
\pgfdeclarelayer{middle}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,middle,foreground}
\tikzstyle{backA}=[rectangle,
fill=blue!30,
inner sep=0.2cm,
rounded corners=0mm]

\tikzstyle{backB}=[rectangle,
fill=purple!15,
inner sep=0.2cm,
rounded corners=0mm]

\tikzstyle{backC}=[rectangle,
fill=yellow!40,
%inner sep=0.2cm,
rounded corners=0mm]

\tikzset{%
  >={Latex[width=2mm,length=2mm]},
            base/.style = {rectangle, rounded corners, draw=black,
                           minimum width=1cm, minimum height=1cm,
                           text centered,inner sep=0.3cm},
  operation/.style = {base, fill=SkyBlue},
}

\begin{document}    
\begin{tikzpicture}[node distance=0.8cm,
    every node/.style={fill=white}, align=center]
    \begin{pgfonlayer}{foreground}
    \node (controller) [operation] {Microcontroller};
    \node (regulator) [operation, below = of controller] {Regulator};
    \node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
    \node (sensor) [operation, above = of controller] {Sensor};
    \node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
    \node (driver1) [operation, right = of sensor] {Driver 1};
    \node (driver2) [operation, left = of sensor] {Driver 2};
    \node (power) [operation, left = of regulator, align=center] {Input \\ Power};
    \node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
    \node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
    \node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
    \coordinate[left = of power] (d1) {};
    \coordinate[above = of d1, yshift=5.5cm] (d2) {};

    \draw[->]             (controller) -- (transceiver);
    \draw[<->]             (controller) -- (sensor);
    \draw[->]             (driver1) -- (motor1);
    \draw[->]             (driver2) -- (motor2);
    \draw[<->]             (sensor) -- (motor2);
    \draw[<->]             (sensor) -- (motor1);
    \draw[->]             (controller) -- (driver1);
    \draw[->]             (controller) -- (driver2);
    \draw[->]             (controller) -- (flash);
    \draw[->]             (regulator) -- (controller);
    \draw[->]             (power) -- (regulator);
    \draw[<->]             (transceiver) -- (computer);
    \draw[->]             (power) -- (d1) |- (motor2);
    \draw[->]             (power) -- (d1) --  (d2) -| (motor1);
\end{pgfonlayer}
    \begin{pgfonlayer}{middle}
    \node [backC,
    fit=(driver1) (driver2) (sensor) (motor1) (motor2),
    label=above:{}] {};
\end{pgfonlayer}
    \begin{pgfonlayer}{main}
    \node [fill=white,inner sep=3mm,
    fit=(driver1) (driver2) (sensor) (motor1) (motor2),
    label=above:{}] {};
\end{pgfonlayer}
\begin{pgfonlayer}{background}
    \node [backA,
    fit=(computer) (transceiver),
    label=above:{}] {};
\end{pgfonlayer}
    \node [backB,
    fit=(regulator) (power),
    label=above:{}] {};
  \end{tikzpicture}
\end{document}

Antwort3

Für beliebige Formen (keine Knoten) kann die Anpassung nicht verwendet werden. Demo

\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, calc, backgrounds}

\tikzset{%
  >={Latex[width=2mm,length=2mm]},
            base/.style = {rectangle, rounded corners, draw=black,
                           minimum width=1cm, minimum height=1cm,
                           text centered,inner sep=0.3cm},
  operation/.style = {base, fill=SkyBlue},
}

\begin{document}    
\begin{tikzpicture}[node distance=0.8cm,
    every node/.style={fill=white}, align=center]
    \node (controller) [operation] {Microcontroller};
    \node (regulator) [operation, below = of controller] {Regulator};
    \node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
    \node (sensor) [operation, above = of controller] {Sensor};
    \node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
    \node (driver1) [operation, right = of sensor] {Driver 1};
    \node (driver2) [operation, left = of sensor] {Driver 2};
    \node (power) [operation, left = of regulator, align=center] {Input \\ Power};
    \node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
    \node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
    \node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
    \coordinate[left = of power] (d1) {};
    \coordinate[above = of d1, yshift=5.5cm] (d2) {};

    \draw[->]             (controller) -- (transceiver);
    \draw[<->]             (controller) -- (sensor);
    \draw[->]             (driver1) -- (motor1);
    \draw[->]             (driver2) -- (motor2);
    \draw[<->]             (sensor) -- (motor2);
    \draw[<->]             (sensor) -- (motor1);
    \draw[->]             (controller) -- (driver1);
    \draw[->]             (controller) -- (driver2);
    \draw[->]             (controller) -- (flash);
    \draw[->]             (regulator) -- (controller);
    \draw[->]             (power) -- (regulator);
    \draw[<->]             (transceiver) -- (computer);
    \draw[->]             (power) -- (d1) |- (motor2);
    \draw[->]             (power) -- (d1) --  (d2) -| (motor1);

    \begin{pgfonlayer}{background}
    \path (driver1.east |- computer.north) ++ (0.2,0.2) coordinate(int1);
    \path (driver2.south -| transceiver.west) ++ (-0.2,-0.2) coordinate(int2);

    \fill[yellow!40] ($(driver2.south west)+(-0.2,-0.2)$) |- ($(motor2.north)+(0,0.2)$) -| (int1) -- (int2) -- cycle;
    \fill[blue!30] ($(transceiver.south west)+(-0.2,-0.2)$) -- (int2) -- (int1) -- 
      ($(computer.north)+(0,0.2)$) -| ($(computer.east)+(0.2,0)$) |- cycle;
    \fill[purple!15] ($(power.south west)+(-0.2,-0.2)$) |- ($(power.north)+(0,0.2)$) -| ($(regulator.east)+(0.2,0.2)$) |- cycle;
    \end{pgfonlayer}
  \end{tikzpicture}
\end{document}

verwandte Informationen