노드가 직사각형에 포함될 때 다른 색상

노드가 직사각형에 포함될 때 다른 색상

나는 가지고있다:

\documentclass{scrartcl}

\usepackage{tikz}
\usetikzlibrary{parrows, arrows.meta, math, matrix, positioning}

\begin{document}

\begin{tikzpicture}[
  vertex/.style={draw, circle, inner sep=0, minimum size=0.12cm}
  ]
  \foreach \x in {0,1,...,6} {
    \foreach \y  in {0,1,...,7} {
      \node at (\x*0.4,\y*0.4) [vertex, color=blue] {};
    }
  }
  \foreach \x in {0,1,...,3} {
    \foreach \y  in {0,1,...,3} {
      \node at (\x*0.5+0.35,\y*0.5+0.55) (O\x\y)[vertex, draw=none, fill=orange] {};
    }
  }
  \node[draw, dashed, color=orange, minimum size=2.35cm, thick] (BB) at (1.1,1.3) {};
 \end{tikzpicture}

\end{document}

이는 여러 개의 파란색 노드와 일부 주황색 노드를 칠합니다. 주황색 노드는 주황색 직사각형 BB로 둘러싸여 있습니다.

  • 주황색 직사각형에 포함된 파란색 노드의 색상만 어떻게 변경할 수 있나요?
  • 주황색 노드의 중간 지점에 주황색 직사각형을 정확하게 배치하는 더 영리한 방법이 있습니까?

감사해요!

답변1

두 번째 요점에 대한 대답은 라이브러리를 사용 fit하고 그냥 말하는 것 입니다 fit=(O00)(O33). 첫 번째 점의 경우 \x및 조건을 사용하여 \y그에 따라 변경 color=하거나 더 쉽게(그러나 가장 효율적이지는 않음) 직사각형 clip경로를 그리고 녹색 노드를 그 안에 넣을 수 있습니다.

\documentclass{scrartcl}

\usepackage{tikz}
\usetikzlibrary{fit}

\begin{document}

\begin{tikzpicture}[
  vertex/.style={draw, circle, inner sep=0, minimum size=0.12cm}
  ]
  \newcommand{\drawcircles}[1]{%
  \foreach \x in {0,1,...,6} {
    \foreach \y  in {0,1,...,7} {
      \node at (\x*0.4,\y*0.4) [vertex, color=#1] {};
    }
  }}
  \drawcircles{blue}
  \foreach \x in {0,1,...,3} {
    \foreach \y  in {0,1,...,3} {
      \node at (\x*0.5+0.35,\y*0.5+0.55) (O\x\y)[vertex, draw=none,  fill=orange] {};
    }
  }
  \node[draw, dashed, color=orange, thick, fit=(O00)(O33)] (BB){};
  \path [clip] (BB.north west) rectangle (BB.south east);
  \drawcircles{green,thick}
 \end{tikzpicture}

\end{document}

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

조건부 접근 방식은 다음과 같습니다.

\documentclass{scrartcl}

\usepackage{tikz,ifthen}    % <---
\usetikzlibrary{fit}

\begin{document}

\begin{tikzpicture}[
  vertex/.style={draw, circle, inner sep=0, minimum size=0.12cm}
  ]
  \foreach \x in {0,1,...,6} {
    \foreach \y  in {0,1,...,7} {
      \ifthenelse{\x>0\AND\x<6 \AND \y>0\AND\y<6}            % condition 
        {\node at (\x*0.4,\y*0.4) [vertex, color=green] {};} % true
        {\node at (\x*0.4,\y*0.4) [vertex, color=blue] {};}  % false    
    }
  }
  \foreach \x in {0,1,...,3} {
    \foreach \y  in {0,1,...,3} {
      \node at (\x*0.5+0.35,\y*0.5+0.55) (O\x\y)[vertex, draw=none,  fill=orange] {};
    }
  }
  \node[draw, dashed, color=orange, thick, fit=(O00)(O33)] (BB){};
 \end{tikzpicture}

\end{document}

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

답변2

@marmot님과 논의한 후 아이디어를 수정했고 이제 통과해야 할 값이 8개 남았습니다. 도움을 드리기 위해 명령어를 만들었습니다.

\gridBlue{xmin}{xmax}{ymin}{ymax}
\gridOrange{xmin}{xmax}{ymin}{ymax}

원이 격자 [xmin,xmax] \times [ymin,ymax](파란색과 주황색)를 만들도록 합니다.

또한,만약에원이 직사각형에 닿으면 고려되지 않습니다.내부에그래서 파란색으로 남아있습니다.

마지막으로,가장 중요한부품이 있고 \x <= \xmaxOrange + 1추가 \y <= \ymaxOrange + 2되는 부분은 어디입니까?조정되어야 한다주황색 원의 교란에 따라 달라집니다.

주목:OP는 노드 좌표에 인수를 곱하고 변환합니다. 이 프로세스는 섭동 요인을 자동으로 계산하는 것을 어렵게 만듭니다.

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

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

% grid format
% [#1,#2] \times [#3,#4]
\newcommand{\gridBlue}[4]{
\pgfmathtruncatemacro{\xminBlue}{#1}
\pgfmathtruncatemacro{\xmaxBlue}{#2}

\pgfmathtruncatemacro{\yminBlue}{#3}
\pgfmathtruncatemacro{\ymaxBlue}{#4}
}

\newcommand{\gridOrange}[4]{
\pgfmathtruncatemacro{\xminOrange}{#1}
\pgfmathtruncatemacro{\xmaxOrange}{#2}

\pgfmathtruncatemacro{\yminOrange}{#3}
\pgfmathtruncatemacro{\ymaxOrange}{#4}
}

\begin{document}
% [1,7] \times [1,6]
\gridBlue{1}{7}{1}{6}
% [2,4] \times [1,3]
\gridOrange{2}{4}{1}{3}

\begin{tikzpicture}[
vertex/.style={draw, circle, inner sep=0, minimum size=0.12cm}
]
\foreach \x in {\xminBlue,...,\xmaxBlue} {
\foreach \y in {\yminBlue,...,\ymaxBlue} {
\pgfmathsetmacro{\mycolor}{ifthenelse(\x >= \xminOrange+2 && \x <= \xmaxOrange+1  && \y >= \yminOrange+2 && \y <= \ymaxOrange+2, "green","blue")}
\node at (\x*0.4,\y*0.4) [vertex, color=\mycolor] {};
}
}
\begin{scope}[local bounding box=BB]
\foreach \x in {\xminOrange,...,\xmaxOrange} {
\foreach \y in {\yminOrange,...,\ymaxOrange} {
\node at (\x*0.5+0.35,\y*0.5+0.55) [vertex, draw=none, fill=orange] {};
}
}
\end{scope}
\draw[color=orange, thin]
([xshift=-1pt,yshift=-1pt]BB.south west) rectangle ([xshift=1pt,yshift=1pt]BB.north east);
\end{tikzpicture}

\end{document}

편집하다:아래 이미지는 변환이 주황색 그리드에 어떤 영향을 미치는지 보여줍니다. 검은색 화살표는 에서 을 가리 (\xminOrange*0.5,\yminOrange*0.5)킵니다 (\xminOrange*0.5 + .35,\yminOrange*0.5 + .55).

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

관련 정보