Andere Farbe, wenn der Knoten in einem Rechteck enthalten ist

Andere Farbe, wenn der Knoten in einem Rechteck enthalten ist

Ich habe:

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

Dadurch werden eine Reihe blauer und einige orangefarbene Knoten gezeichnet. Die orangefarbenen Knoten sind von einem orangefarbenen Rechteck BB umgeben.

  • Wie kann ich nur die Farbe der blauen Knoten ändern, die im orangefarbenen Rechteck enthalten sind?
  • Gibt es eine cleverere Möglichkeit, das orangefarbene Rechteck genau an den Mittelpunkten der orangefarbenen Knoten zu positionieren?

Danke!

Antwort1

Die Antwort auf den zweiten Punkt ist, die fitBibliothek zu verwenden und einfach zu sagen fit=(O00)(O33). Für den ersten Punkt können Sie entweder Bedingungen für \xund verwenden \yund die entsprechend ändern color=oder einfacher (aber nicht am effizientesten) einen rechteckigen clipPfad zeichnen und die grünen Knoten darin platzieren.

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

Bildbeschreibung hier eingeben

Und der Konditionalansatz:

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

Bildbeschreibung hier eingeben

Antwort2

Nach einer Diskussion mit @marmot habe ich meine Idee umgesetzt und jetzt gibt es 8 Werte, die übergeben werden müssen. Um zu helfen, habe ich Befehle erstellt

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

so dass die Kreise die Gitter bilden[xmin,xmax] \times [ymin,ymax] (blau und orange) bilden.

Beachten Sie auch, dassWennder Kreis das Rechteck berührt, wird es nicht berücksichtigtinnenbleibt also blau.

Endlich, dasam wichtigstenTeile sind \x <= \xmaxOrange + 1und\y <= \ymaxOrange + 2 wo die Ergänzungsollte angepasst werdenabhängig von der Störung der orangefarbenen Kreise.

Anmerkung:Der OP multipliziert die Knotenkoordinaten mit einem Faktor und übersetzt sie. Dieser Vorgang erschwert die automatische Berechnung des Störungsfaktors.

Bildbeschreibung hier eingeben

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

Bearbeiten:Das folgende Bild soll zeigen, wie sich die Übersetzung auf das orangefarbene Raster auswirkt: Der schwarze Pfeil zeigt von (\xminOrange*0.5,\yminOrange*0.5)nach (\xminOrange*0.5 + .35,\yminOrange*0.5 + .55).

Bildbeschreibung hier eingeben

verwandte Informationen