
Меня интересует раскраска определенных ячеек картинки TikZ. Она следующая:
Я сделал это, используя сетку и создавая числа. Я представляю код, который я создал выше:
\begin{tikzpicture}[scale = 0.7] \draw[lightgray] (0,0) grid (9,9); \draw[blue] (2,2) grid (7,7); %Ciclo de cuadrado auxiliar \foreach \i in {0,1,2,3,4}{ \foreach\j in {0,1,2,3,4}{ \draw[red,thick,opacity = 0.5] (\i + \j,4 +\j - \i) rectangle (\i + \j + 1, 5 + \j - \i); } } %Cuadrado principal \draw[blue,opacity = 0.5] (2,2) grid (7,7); %Ubicación de números \foreach \i in {0,1,2,3,4}{ \foreach \j in {0,1,2,3,4}{ \pgfmathtruncatemacro{\label}{\i + \j + 4*\i + 1}; %\pgfmathparse[3 <= \i <= 5 && 0 <= j <= 1 ? int(1) : int(0)} %\ifnum\pgfmathresult = 1 %\node[teal] at (\i + \j + 0.5,4 +\j - \i + 0.5) {\label}; %\else \node at (\i + \j + 0.5,4 +\j - \i + 0.5) {\label}; %\fi } } \end{tikzpicture}
Внутри цикла есть несколько закомментированных строк. Дело в том, что я хочу раскрасить только те числа, которые появляются из синего квадрата, на самом деле те, которые находятся под ним (16,22,21). Однако я получил несколько ошибок! Это список до 24 ошибок. Я подозреваю, что у меня проблема с написанием условия.
Вопросы:
Знаете ли вы, какие ошибки в условии? Не могли бы вы порекомендовать ссылку, чтобы почитать об этих условиях?
Обновлять
Извините, что ушел, но я вернулся. Ответ был очень полезен, однако мне нужно внести некоторые изменения, чтобы получить ожидаемый результат. Есть пример кода и полученное изображение
\begin{figure}[H] \centering \begin{tikzpicture}[scale=0.7] %\draw[lightgray] (0,0) grid (9,9); %Cuadrado auxiliar con desplazados resaltados \foreach \i in {0,...,4}{ \foreach \j in {0,...,4}{ \draw[red!50,thick] (\i+\j,4+\j-\i) rectangle +(1,1); \pgfmathparse{\i - \j > 2 ? 1 : 0} \ifnum\pgfmathresult = 1 \def\mycolor{white} \node[\mycolor] at (\i+\j+0.5,4+\j-\i+0.5) {\inteval{5*\i+\j+1}}; \else \pgfmathparse{\j - \i > 2 ? 1 : 0} \ifnum\pgfmathresult = 1 \def\mycolor{white} \node[\mycolor] at (\i+\j+0.5,4+\j-\i+0.5) {\inteval{5*\i+\j+1}}; \else \pgfmathparse{\i + \j < 2 ? 1 : 0} \ifnum\pgfmathresult = 1 \def\mycolor{cyan} \node[\mycolor] at (\i+\j+0.5,4+\j-\i+0.5) {\inteval{5*\i+\j+1}}; \else \def\mycolor{black} \node[\mycolor] at (\i+\j+0.5,4+\j-\i+0.5) {\inteval{5*\i+\j+1}}; \fi \fi \fi } } %Cuadrado principal \draw[blue] (2,2) grid (7,7); %Resaltado en cuadrado principal de anteriores \node[teal] at (3.5,6.5) {$16$}; \node[teal] at (4.5,5.5) {$21$}; \node[teal] at (5.5,6.5) {$22$}; \node[violet] at (3.5,2.5) {$4$}; \node[violet] at (4.5,3.5) {$5$}; \node[violet] at (5.5,2.5) {$10$}; %Ubicacion de numeros nuevos \draw[->,cyan!50,thick] (1.5,5.5) to (6.5,5.5); \node[cyan] at (6.5,5.5) {$2$}; \draw[->,cyan!50,thick] (0.5,4.5) to (5.5,4.5); \node[cyan] at (5.5,4.5) {$1$}; \draw[->,cyan!50,thick] (1.5,3.5) to (6.5,3.5); \node[cyan] at (6.5,3.5) {$6$}; \end{tikzpicture}
Я использовал другой цвет для каждого шага, я очень благодарен за помощь. Есть идеи по моему второму вопросу?
решение1
Относительно кода в вопросе:
- После
[
должно\pgfmathparse
быть{
. - Использование нескольких
<=
в одном условии\pgfmathparse
может привести к неожиданным результатам. - Внутри
\pgfmathparse
должноj
быть\j
. - Можно
int(1)
заменить на1
иint(0)
на0
. - С
\foreach
,0,1,2,3,4
можно заменить на0,...,4
. - После этого
\pgfmathtruncatemacro
нет не;
требуется.
Условие \pgfmathparse
было изменено.
Сначала определяется цвет. Затем код для узла нужно разместить только один раз, а не два раза.
При использовании \inteval
нет необходимости определять \label
с помощью \pgfmathtruncatemacro
.
Код для квадратов можно упростить с помощью rectangle +(1,1)
.
\documentclass[border=6pt]{standalone}
\usepackage{xfp}%not necessary from 2022-06-01: see https://ctan.org/pkg/xfp
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=0.7]
\draw[lightgray] (0,0) grid (9,9);
\draw[blue] (2,2) grid (7,7);
\foreach \i in {0,...,4}{
\foreach \j in {0,...,4}{
\pgfmathparse{\i+\j<2||\i+\j>6||\i-\j>2||\j-\i>2?1:0}
\ifnum\pgfmathresult=1
\def\mycolor{teal}
\draw[red!50,thick] (\i+\j,4+\j-\i) rectangle +(1,1);
\else
\def\mycolor{black}
\fi
\node[\mycolor] at (\i+\j+0.5,4+\j-\i+0.5) {\inteval{5*\i+\j+1}};
}
}
\end{tikzpicture}
\end{document}