TikZ: предотвращение перекрытия полей при использовании подгонки

TikZ: предотвращение перекрытия полей при использовании подгонки

Я рисую следующий рисунок, на котором я выделяю набор узлов красным цветом. Он должен включать пять узлов, и так и есть. Но это сложная форма для подгонки (вероятно, слишком сложная), поэтому я решил использовать два блока и объединить их. Проблема в том, что это насыщает цвет на узле, где они перекрываются (Z_1). Я хочу, чтобы красный цвет был равномерным по всему выделенному блоку.

введите описание изображения здесь

МВЭ:

\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,decorations,arrows,calc,arrows.meta,fit,positioning}
    \tikzset{
        -Latex,auto,node distance =1 cm and 1 cm,semithick,
        state/.style ={ellipse, draw, minimum width = 0.7 cm},
        point/.style = {circle, draw, inner sep=0.04cm,fill,node contents={}},
        bidirected/.style={Latex-Latex,dashed},
        el/.style = {inner sep=2pt, align=left, sloped}
    }

\begin{document}

        \begin{tikzpicture}[node distance =1cm and 1cm]
            
            % F boxes
            \node (F) [label=above:{$F$},fill=gray,fit=(X0) (Z0) (Y0) (X1) (Z1) (Y1),inner sep=6, opacity=0.2] {};
            \node (Fprime) [label=right:{$F'$},fill=red,fit=(Z0) (Y0) (Z1) (Y1), inner sep=3, opacity=0.4] {};
            \node (Fprime2) [fill=red,fit=(Z1) (X1), inner sep=3, opacity=0.4] {};
            
            % t = 0
            \node (X0) [label=left:{$X_0$},point];
            \node (Z0) [label=left:{$Z_0$},below of = X0,point];
            \node (Y0) [label=left:{$Y_0$},below of = Z0,point];
        
            \path (X0) edge (Z0);
            \path (Z0) edge (Y0);
            
            % t = 1
            \node (X1) [label=right:{$X_1$}, right = of X0,point];
            \node (Z1) [label=right:{$Z_1$},below of = X1,point];
            \node (Y1) [label=right:{$Y_1$},below of = Z1,point];
        
            \path (X1) edge (Z1);
            \path (Z1) edge (Y1);
            \path[bidirected] (X0) edge (Z1);
            \path[bidirected] (Z0) edge (X1);
            \path[bidirected] (Z0) edge (Y1);
            \path[bidirected] (Y0) edge (Z1);
           
            % Transition 
            \path (X0) edge (X1);
            \path (Z0) edge (Z1);
            
        \end{tikzpicture}
\end{document}

решение1

Вы хотите объединить эти красные подходящие узлы с одинаковой непрозрачностью, это можно сделать с помощью области видимости и опции transparency group. Смотрите код ниже. Тем не менее, при этом вы все равно получаете некоторые точки, которыеподэта красная заливка. Вы можете использовать backgroundбиблиотеку, чтобы рисовать каждую часть на разных слоях.

группа прозрачности

\documentclass[tikz,border=3.14mm]{standalone}




\usetikzlibrary{shapes,decorations,arrows,calc,arrows.meta,fit,positioning}

\begin{document}

\tikzset{
    -Latex,auto,node distance =1 cm and 1 cm,semithick,
    state/.style ={ellipse, draw, minimum width = 0.7 cm},
    point/.style = {circle, draw, inner sep=0.04cm,fill,node contents={}},
    bidirected/.style={Latex-Latex,dashed},
    el/.style = {inner sep=2pt, align=left, sloped}
}


        \begin{tikzpicture}[node distance =1cm and 1cm]
            
           
            % t = 0
            \node (X0) [label=left:{$X_0$},point];
            \node (Z0) [label=left:{$Z_0$},below of = X0,point];
            \node (Y0) [label=left:{$Y_0$},below of = Z0,point];
            
            
            
            
            
            
            % t = 1
            \node (X1) [label=right:{$X_1$}, right = of X0,point];
            \node (Z1) [label=right:{$Z_1$},below of = X1,point];
            \node (Y1) [label=right:{$Y_1$},below of = Z1,point];
        
             % F boxes
            
            \node (F) [label=above:{$F$},fill=gray,fit=(X0) (Z0) (Y0) (X1) (Z1) (Y1),inner sep=6, opacity=0.2] {};
                
            \begin{scope}[opacity=.4, transparency group]        
                \node (Fprime) [fill=red,fit=(Z0) (Y0) (Z1) (Y1), inner sep=3] {};
                \node (Fprime2) [fill=red,fit=(Z1) (X1), inner sep=3] {};
            \end{scope}
            
            \path (X0) edge (Z0);
            \path (Z0) edge (Y0);
            \path (X1) edge (Z1);
            \path (Z1) edge (Y1);
            \path[bidirected] (X0) edge (Z1);
            \path[bidirected] (Z0) edge (X1);
            \path[bidirected] (Z0) edge (Y1);
            \path[bidirected] (Y0) edge (Z1);
           
            % Transition 
            \path (X0) edge (X1);
            \path (Z0) edge (Z1);
            
        \end{tikzpicture}

\end{document}

решение2

Вы можете нарисовать путь вокруг узлов, которые вы хотите аннотировать с помощью прозрачной заливки:

\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
                calc, chains,
                decorations,
                fit,
                positioning,
                shapes}
\tikzset{
 node distance = 1 cm and 1 cm,
    arr/.style = {-Latex, semithick},
    alr/.style = {Latex-Latex, dashed},
  point/.style = {circle,  draw, fill, 
                  inner sep=0.04cm, node contents={}},
every label/.append style = {inner sep=1mm, font=\footnotesize},
        }

\begin{document}
    \begin{tikzpicture}[
node distance = 1cm and 1cm,
  start chain = going below,
                        ]
% t = 0, t = 1
    \foreach \i [count=\ii] in {X, Z, Y}
{
\node (\i0) [point, on chain, label=left:{$\i_0$}];
\node (\i1) [point, right=of \i0, label=right:{$\i_1$}];
}
\draw[arr]
        (X0) edge (Z0) (Z0) edge (Y0)
        (X1) edge (Z1) (Z1) edge (Y1) 
% Transition
        (X0) edge (X1) 
        (Z0) edge (Z1);
% Cross
\draw[alr] 
        (X0) edge (Z1) 
        (Z0) edge (X1) 
        (Z0) edge (Y1) 
        (Y0) edge (Z1);
         
% F boxes
\node (F) [inner sep=6, fill=gray, opacity=0.2,
           label=$F$, 
           fit=(X0) (Y1),] {};
\fill[red!50, semitransparent]
        ($(X1)+ (-2mm,2mm)$) -| ($(Y1)+ (2mm,-2mm)$) -|
        ($(Z0)+ (-2mm,2mm)$) -|  cycle;

    \end{tikzpicture}
\end{document}

введите описание изображения здесь

Связанный контент