¿Cómo recortar un fondo que incluye nodos según una forma arbitraria?

¿Cómo recortar un fondo que incluye nodos según una forma arbitraria?

La siguienteWE

\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}

rendimientos

ingrese la descripción de la imagen aquí

Dado que el driver1nodo debería haber estado cubierto exclusivamente por el fondo amarillo, necesito restar la parte específica del fondo violeta que interfiere con el amarillo. En particular, un límite aceptable para el fondo violeta podría ser más o menos así:

ingrese la descripción de la imagen aquí

¿Cómo puedo lograr algo así?

Respuesta1

No sobredibujaría áreas con blanco, imagina que tienes algún fondo que quieres conservar. Y \tikzstyleestá en desuso.

\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}

ingrese la descripción de la imagen aquí

Respuesta2

¿Como esto?

captura de pantalla

\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}

Respuesta3

Para formas arbitrarias (no nodos), no se puede utilizar el ajuste. manifestación

\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}

información relacionada