Tengo:
\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}
que pinta un montón de nodos azules y algunos nodos naranjas. Los nodos naranjas están rodeados por un rectángulo naranja BB.
- ¿Cómo puedo cambiar el color solo de los nodos azules contenidos en el rectángulo naranja?
- ¿Existe una forma más inteligente de colocar el rectángulo naranja exactamente en los puntos medios de los nodos naranjas?
¡Gracias!
Respuesta1
La respuesta al segundo punto es usar la fit
biblioteca y simplemente decir fit=(O00)(O33)
. Para el primer punto, puede usar las condiciones \x
y \y
cambiarlas color=
en consecuencia, o más fácil (pero no lo más eficiente) dibujar un clip
camino rectangular y colocar los nodos verdes dentro de él.
\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}
Y el enfoque condicional:
\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}
Respuesta2
Después de discutir con @marmot, arreglé mi idea y ahora hay 8 valores para aprobar. Para ayudar, creé comandos.
\gridBlue{xmin}{xmax}{ymin}{ymax}
\gridOrange{xmin}{xmax}{ymin}{ymax}
para que los círculos creen las celosías [xmin,xmax] \times [ymin,ymax]
(azul y naranja).
Además, observe quesiel círculo toca el rectángulo, no se consideraadentropor lo que sigue siendo azul.
Finalmente, ello más importanteson las partes \x <= \xmaxOrange + 1
y \y <= \ymaxOrange + 2
donde está la sumadebe ser ajustadodependiendo de la perturbación de los círculos naranjas.
Observación:el OP multiplica las coordenadas del nodo por un factor y las traduce; este proceso dificulta el cálculo automático del factor de perturbación.
\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}
Editar:La siguiente imagen muestra cómo la traducción afecta la cuadrícula naranja: la flecha negra apunta desde (\xminOrange*0.5,\yminOrange*0.5)
hasta (\xminOrange*0.5 + .35,\yminOrange*0.5 + .55)
.