
Esta pregunta está vagamente relacionada conhttps://math.stackexchange.com/questions/3449433/selecting-cards-to-form-a-fair-game?noredirect=1#comment7090962_3449433. Estoy tratando de ilustrar visualmente las formas en que se pueden sacar 3 bolas de un montón de N+M
bolas, donde N
está el número de azules y M
el número de verdes.
Mi intento de hacer esto en tikz se puede ver a continuación. Aquí primero coloco las bolas en orden y luego muestro cómo aparecen cuando se quita una bola. Una línea entre dos bolas indica que estas dos bolas se eligen MÁS la bola punteada.
Sin embargo, hay algunos cambios que me gustaría hacer.
- Entonces elegimos 3 bolas, las dos conectadas por la línea MÁS la de puntos. Si estas tres bolas tienen el mismo color, quiero que la línea que las conecta tenga el estilo X (discontinua, roja, etc.)
- Si las tres bolas tienen colores diferentes, quiero que la línea que las conecta tenga el estilo Y (línea continua, naranja, etc.)
- ¿Por qué mi código falla en este caso particular
2
? - ¿Hay alguna manera de hacer que el código funcione para diferentes números de bolas azules y verdes?
- ¿Cómo puedo elegir la rotación del polígono central para que coincida con las esquinas del polígono exterior? Ahora cambié el interior para que encaje manualmente.
¿Existe alguna razón particular por la que el siguiente código no funciona?
\foreach \x in {1,...,\n}{ \begin{scope}[shift={(b.corner \x)}] \missingPentagonTemp{2}{c}; \end{scope} }
Así es como quiero que se vea (cortesía de pintura).
MWE
\documentclass[a4paper,11pt,margin=5pt]{standalone}
\usepackage{tikz,xcolor}
\usetikzlibrary{arrows}
\usetikzlibrary{trees}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{decorations}
\usepackage{ifthenx}
\newcommand{\missingPentagon}[2]{
% draw edges
\node[draw=none, minimum size=3cm, regular polygon, regular polygon sides = \n] (#2) {};
\def\n{6}
\pgfmathsetmacro{\start}{int(min(#1+1, \n))};
\pgfmathsetmacro{\stop}{int(max(#1-1, 2))};
\ifthenelse{\equal{#1}{1}}{
\foreach\x in{2,...,\n}{
\foreach\y in{\x,...,\n}{
\draw[color = black, dashed](#2.corner \x)--(#2.corner \y);
}
}
\foreach \x in {1}{
\draw[fill=green!20,dashed](#2.corner \x) circle[radius=1em] node {\x};
}
\foreach \x in {2,...,\n}{
\draw[fill=blue!20](#2.corner \x) circle[radius=1em] node {\x};
}
}{
\foreach\x in {1,...,\stop}{
\foreach\y in {\x,...,\n}{
\ifthenelse{\equal{#1}{\y}}{}{
\draw[color = black, dashed](#2.corner \x) -- (#2.corner \y)};
}
}
\foreach\x in {\start,...,\n}{
\foreach\y in {\x,...,\n}{
\ifthenelse{\equal{#1}{\y}}{}{
\draw[color = black, dashed](#2.corner \x) -- (#2.corner \y)};
}
}
\foreach \x in {1}{
\draw[fill=green!20](#2.corner \x) circle[radius=1em] node {\x};
}
\foreach \x in {2,...,\n}{
\ifthenelse{\equal{#1}{\x}}{
\draw[fill=blue!20,dashed](#2.corner \x) circle[radius=1em] node {\x};
}{
\draw[fill=blue!20](#2.corner \x) circle[radius=1em] node {\x};
};
}
}
}
\begin{document}
\begin{tikzpicture}
\def\n{6}
\node[draw=none, minimum size=3cm, regular polygon, regular polygon sides = \n] (a) {};
\node[draw=none, minimum size=10cm, regular polygon, regular polygon sides = \n] (b) {};
\foreach \x in {4}{
\draw[fill=green!20](a.corner \x) circle[radius=1em] node {1};
}
\foreach \x in {1,...,3}{
\pgfmathparse{int(\x+3)}
\draw[fill=blue!20](a.corner \x) circle[radius=1em] node {\pgfmathresult};
}
\foreach \x in {5,...,6}{
\pgfmathparse{int(\x-3)}
\draw[fill=blue!20](a.corner \x) circle[radius=1em] node {\pgfmathresult};
}
%\foreach \x in {1,...,\n}{
% \begin{scope}[shift={(b.corner \x)}]
% \missingPentagonTemp{2}{c};
% \end{scope}
%}
\begin{scope}[shift={(b.corner 1)}]
\missingPentagon{4}{c};
\end{scope}
\begin{scope}[shift={(b.corner 2)}]
\missingPentagon{5}{c};
\end{scope}
\begin{scope}[shift={(b.corner 3)}]
\missingPentagon{6}{c};
\end{scope}
\begin{scope}[shift={(b.corner 4)}]
\missingPentagon{1}{c};
\end{scope}
\begin{scope}[shift={(b.corner 5)}]
\missingPentagon{2}{c};
\end{scope}
\begin{scope}[shift={(b.corner 6)}]
\missingPentagon{3}{c};
\end{scope}
\end{tikzpicture}
\end{document}
Respuesta1
Este es un intento de responder la pregunta con un pic
. Este código verifica si un vértice está o no en la lista de vértices faltantes o resaltados (sí, ahora puedes usar listas) y dibuja los bordes en consecuencia.
En cuanto a tus puntos:
- Hecho.
- Hecho. En este punto el estilo es sólido. Uno puede cambiarlo.
- Honestamente, no intenté pensar en el código. Lo siento.
- Sí. Ahora estas son listas.
- Cambió. También se puede simplemente rotar el polígono, pero me gustan las condiciones mod. ;-)
- Nuevamente no lo intenté. Lo siento.
Código completo:
\documentclass[a4paper,11pt,margin=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\makeatletter
\pgfmathdeclarefunction{memberQ}{2}{%
\begingroup%
\edef\pgfutil@tmpb{0}%memberQ({\lstPast},\inow)
\edef\pgfutil@tmpa{#2}%
\expandafter\pgfmath@member@i#1\pgfmath@token@stop
\edef\pgfmathresult{\pgfutil@tmpb}%
\pgfmath@smuggleone\pgfmathresult%
\endgroup}
\def\pgfmath@member@i#1{%
\ifx\pgfmath@token@stop#1%
\else
\edef\pgfutil@tmpc{#1}%
\ifx\pgfutil@tmpc\pgfutil@tmpa\relax%
\gdef\pgfutil@tmpb{1}%
\fi%
\expandafter\pgfmath@member@i
\fi}
\makeatother
\tikzset{circ/.style={circle,minimum size=2em,draw},
pics/missing polygon/.style={code={
\tikzset{missing polygon/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/missing polygon/##1}}
\node[draw=none, minimum size=\pv{size},
regular polygon, regular polygon sides =\pv{n}] (-poly) {};
% test if the highlighted node is in the missin nodes
\edef\lsthigh{\pv{highlight}}
\foreach \XX in \lsthigh
{\pgfmathtruncatemacro{\ktest}{memberQ(\pv{miss},\XX)}
\xdef\pgfmathresult{\ktest}}
\edef\ktest{\pgfmathresult}
\foreach \XX in {1,...,\the\numexpr\pv{n}-1}
{
\foreach \YY in {2,...,\pv{n}}
{
\pgfmathtruncatemacro{\itest}{memberQ(\pv{miss},\XX)+memberQ(\pv{miss},\YY)}
\ifnum\itest=0
\pgfmathtruncatemacro{\jtest}{memberQ(\pv{highlight},\XX)+memberQ(\pv{highlight},\YY)}
\draw \ifnum\jtest=0 [dashed]\fi \ifnum\ktest=1 [solid]\fi
(-poly.corner \XX) -- (-poly.corner \YY);
\fi
}
}
\foreach \XX in {1,...,\pv{n}}
{\pgfmathtruncatemacro{\itest}{memberQ(\pv{highlight},\XX)}
\ifnum\itest=1
\node[missing polygon/highlighted] (-poly-vertex-\XX) at (-poly.corner \XX){\XX};
\else
\pgfmathtruncatemacro{\jtest}{memberQ(\pv{miss},\XX)}
\ifnum\jtest=1
\node[missing polygon/missing] (-poly-vertex-\XX) at (-poly.corner \XX){\XX};
\else
\node[missing polygon/regular] (-poly-vertex-\XX) at (-poly.corner \XX){\XX};
\fi
\fi
}
}},missing polygon/.cd,size/.initial=3cm,n/.initial=6,
miss/.initial={2},highlight/.initial={1},
highlighted/.style={circ,fill=green!20},
missing/.style={circ,fill=blue!20,dashed},
regular/.style={circ,fill=blue!20}
}
\begin{document}
\begin{tikzpicture}
\def\n{6}
\node[draw=none, minimum size=3cm, regular polygon, regular polygon sides = \n] (a) {};
\node[draw=none, minimum size=10cm, regular polygon, regular polygon sides = \n] (b) {};
\foreach \X in {1,...,\n}{
\pgfmathparse{int(1+Mod(\X-4,6))}
\draw \ifnum\X=4 [fill=green!20] \else [fill=blue!20]\fi
(a.corner \X) circle[radius=1em] node {\pgfmathresult};
}
\path foreach \X in {1,...,\n}
{ [/utils/exec=\pgfmathtruncatemacro{\mymiss}{int(1+Mod(\X-4,6))}]
(b.corner \X) pic(m\X){missing polygon={miss={\mymiss}}}};
\end{tikzpicture}
\end{document}