채우기와 그리기 간의 불투명도 균형 조정

채우기와 그리기 간의 불투명도 균형 조정

아마도 내 제목은 그다지 유익하지 않을 것입니다. 내 문제는 다음 코드를 사용하여 일부 정점에 하이퍼에지를 "그리려고" 한다는 것입니다.

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

그러면 다음이 생성됩니다.

완전 불투명

나쁘지는 않지만 교차로가 그다지 눈에 띄지 않습니다. 하이퍼에지의 불투명도를 0.5로 설정하면:

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

나는 얻다:

여기에 이미지 설명을 입력하세요

여기서 교차점이 더 잘 보이지만, 순환의 '채우기'와 '선'도 교차하기 때문에 영향을 받은 부분이 더 불투명(?)해집니다. 이 상황에 대한 해결 방법이 있습니까? 어쩌면 채우기와의 교차를 피하고 주기의 한쪽에만 선을 그릴 수도 있지만 가능합니까?

답변1

적절한 해결책은 이것이라고 생각합니다. 설명서에서 찾았습니다.

"hyperedge" 스타일에서 불투명도를 제거합니다.

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

모든 가장자리를 자체 투명도 그룹에 넣습니다.

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

해결책

답변해 주셔서 감사합니다!

답변2

더러운 해킹:

특정 모양의 선이 조금 더 넓은 경우 선이 전체 모양을 채우므로 채우기 색상에 대해 걱정할 필요가 없습니다.

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

여기에 이미지 설명을 입력하세요

답변3

사용 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}

여기에 이미지 설명을 입력하세요

관련 정보