ノードが四角形内に含まれている場合は色が異なります

ノードが四角形内に含まれている場合は色が異なります

私は持っている:

\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

2 番目のポイントの答えは、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)

ここに画像の説明を入力してください

関連情報