
Diese Frage ist vage verwandt mithttps://math.stackexchange.com/questions/3449433/selecting-cards-to-form-a-fair-game?noredirect=1#comment7090962_3449433. Ich versuche visuell darzustellen, wie man aus einem Haufen N+M
Bälle drei Bälle ziehen kann, wobei N
die Zahl der blauen und M
die Zahl der grünen Bälle ist.
Mein Versuch, dies in Tikz zu tun, ist unten zu sehen. Hier ordne ich zuerst die Bälle der Reihe nach an und zeige dann, wie sie aussehen, wenn ein Ball entfernt wird. Eine Linie zwischen zwei Bällen zeigt an, dass diese beiden Bälle PLUS der gepunktete Ball ausgewählt sind.
Es gibt jedoch einige Änderungen, die ich gerne vornehmen würde.
- Also wählen wir 3 Bälle, die beiden, die durch die Linie verbunden sind, PLUS den gepunkteten. Wenn diese drei Bälle die gleiche Farbe haben, möchte ich, dass die Linie, die sie verbindet, im Stil X ist (gestrichelt oder rot oder so).
- Wenn die drei Bälle unterschiedliche Farben haben, soll die Linie, die sie verbindet, im Stil Y sein (durchgezogene Linie, orange usw.).
- Warum schlägt mein Code in diesem speziellen Fall fehl
2
? - Gibt es eine Möglichkeit, den Code für eine unterschiedliche Anzahl blauer und grüner Bälle funktionieren zu lassen?
- Wie kann ich die Drehung des mittleren Polygons so auswählen, dass sie mit den Ecken des äußeren übereinstimmt? Jetzt habe ich das innere so geändert, dass es manuell passt.
Gibt es einen bestimmten Grund, warum der folgende Code nicht funktioniert?
\foreach \x in {1,...,\n}{ \begin{scope}[shift={(b.corner \x)}] \missingPentagonTemp{2}{c}; \end{scope} }
So soll es aussehen (mit freundlicher Genehmigung von Paint).
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}
Antwort1
Dies ist ein Versuch, die Frage mit einem zu beantworten pic
. Dieser Code prüft, ob ein Scheitelpunkt in der Liste der fehlenden oder hervorgehobenen Scheitelpunkte enthalten ist (ja, Sie können jetzt Listen verwenden) und zeichnet die Kanten entsprechend.
Zu Ihren Punkten:
- Erledigt.
- Fertig. An diesem Punkt steht der Stil fest. Man kann ihn ändern.
- Ehrlich gesagt habe ich nicht versucht, den Code zu durchdenken. Tut mir leid.
- Ja, das sind Listen.
- Geändert. Man kann das Polygon auch einfach drehen, aber ich mag Mod-Bedingungen. ;-)
- Noch einmal, ich habe es nicht versucht. Es tut mir leid.
Vollständiger Code:
\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}