Equilibrando opacidades entre preenchimento e desenho

Equilibrando opacidades entre preenchimento e desenho

Provavelmente meu título não é tão informativo. Meu problema é que tento "desenhar" hiperarestas em alguns vértices com o seguinte código:

\usepackage{tikz}

\tikzstyle{vertex} = [fill, shape=circle, opacity=1, node distance=80pt]
\tikzstyle{hyperedge} = [fill, opacity=1, cap=round, join=round, line width=60pt]
\tikzstyle{elabel} = [fill, shape=circle, node distance=30pt]

\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

\begin{document}

\begin{tikzpicture}
\node[vertex,label=above left:$v_1$] (v1) {};
\node[vertex,right of=v1,label=above right:$v_2$] (v2) {};
\node[vertex,below of=v1,label=below left:$v_3$] (v3) {};
\node[vertex,right of=v3,label=below right:$v_4$] (v4) {};

\begin{pgfonlayer}{background}

\draw[hyperedge, color=yellow] (v1.center)--(v2.center)--(v3.center)--cycle;
\draw[hyperedge, color=pink, line width=45pt] (v2.center)--(v3.center)--(v4.center)--cycle;

\end{pgfonlayer}

\node[elabel,color=yellow,label=right:$C_1$]  (e1) at (-3,0) {};
\node[elabel,below of=e1,color=pink,label=right:$C_2$]  (e2) {};
\end{tikzpicture}

\end{document}

Isso produz o seguinte:

fullopacidade

Não é ruim, mas o cruzamento não é tão visível. Se eu definir a opacidade das hiperarestas para 0,5:

\tikzstyle{hyperedge} = [fill, opacity=0.5, cap=round, join=round, line width=60pt]

Eu recebo:

insira a descrição da imagem aqui

A intersecção é mais visível aqui, mas como o “preenchimento” e as “linhas” dos ciclos também se cruzam, as partes afetadas tornam-se mais opacas(?). Existe uma solução alternativa para esta situação? Talvez traçar as linhas apenas de um lado do ciclo evitando a interseção com o preenchimento, mas é possível?

Responder1

Eu acho que a solução adequada é esta. Encontrei no manual:

Remova a opacidade do estilo "hiperedge":

\tikzstyle{hyperedge} = [fill, cap=round, join=round, line width=60pt]

Coloque cada aresta em seu próprio grupo de transparência:

\begin{scope}[transparency group,  opacity=0.5]
\draw[hyperedge, color=yellow] (v1.center)--(v2.center)--(v3.center)--cycle;
\end{scope}


\begin{scope}[transparency group,  opacity=0.5]
\draw[hyperedge, color=pink, line width=45pt] (v2.center)--(v3.center)--(v4.center)--cycle;
\end{scope}

solução

Obrigado a todos por suas respostas!

Responder2

Hack sujo:

Se as linhas da sua forma específica forem um pouco mais largas, você não precisa se preocupar com nenhuma cor de preenchimento, pois as linhas preenchem toda a forma:

\documentclass{standalone}

\usepackage{tikz}

\tikzset{
  vertex/.style={fill, shape=circle, opacity=1, node distance=80pt},
  hyperedgeline/.style={opacity=0.5, cap=round, join=round,line width=60pt},
  elabel/.style={fill, shape=circle, node distance=30pt}
}

\pgfdeclarelayer{background}
\pgfsetlayers{background,main}


\begin{document}

\begin{tikzpicture}
\node[vertex,label=above left:$v_1$] (v1) {};
\node[vertex,right of=v1,label=above right:$v_2$] (v2) {};
\node[vertex,below of=v1,label=below left:$v_3$] (v3) {};
\node[vertex,right of=v3,label=below right:$v_4$] (v4) {};

\begin{pgfonlayer}{background}

\draw[hyperedgeline, color=yellow] (v1.center)--(v2.center)--(v3.center)--cycle;
\draw[hyperedgeline, color=pink, line width=47pt] (v2.center)--(v3.center)--(v4.center)--cycle;

\end{pgfonlayer}

\node[elabel,color=yellow,label=right:$C_1$]  (e1) at (-3,0) {};
\node[elabel,below of=e1,color=pink,label=right:$C_2$]  (e2) {};
\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

Responder3

Usar fill opacity.

\documentclass{article}
\usepackage{tikz}

\tikzstyle{vertex} = [fill, shape=circle, opacity=1, node distance=80pt]
\tikzstyle{hyperedge} = [opacity=0.5,fill opacity=1, cap=round, join=round, line width=60pt]
\tikzstyle{elabel} = [fill, shape=circle, node distance=30pt]

\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

\begin{document}

\begin{tikzpicture}
\node[vertex,label=above left:$v_1$] (v1) {};
\node[vertex,right of=v1,label=above right:$v_2$] (v2) {};
\node[vertex,below of=v1,label=below left:$v_3$] (v3) {};
\node[vertex,right of=v3,label=below right:$v_4$] (v4) {};

\begin{pgfonlayer}{background}

\draw[hyperedge, color=yellow] (v1.center)--(v2.center)--(v3.center)--cycle;
\draw[hyperedge, color=pink, line width=45pt] (v2.center)--(v3.center)--(v4.center)--cycle;

\end{pgfonlayer}

\node[elabel,color=yellow,label=right:$C_1$]  (e1) at (-3,0) {};
\node[elabel,below of=e1,color=pink,label=right:$C_2$]  (e2) {};
\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

informação relacionada