МВЭ

МВЭ

Этот вопрос в какой-то степени связан сhttps://math.stackexchange.com/questions/3449433/выбор-карт-для-формирования-честной-игры?noredirect=1#comment7090962_3449433. Я пытаюсь наглядно проиллюстрировать способы, которыми можно вытащить 3 шара из кучки N+Mшаров, где N— количество синих, а M— количество зеленых.

Ниже представлена ​​моя попытка сделать это в tikz. Здесь я сначала расставляю шары по порядку, а затем показываю, как они выглядят, если убрать один шар. Линия между двумя шарами указывает на то, что выбраны эти два шара ПЛЮС пунктирный шар.

введите описание изображения здесь

Однако мне бы хотелось внести некоторые изменения.

  1. Итак, мы выбираем 3 шара, два из которых соединены линией ПЛЮС пунктирный. Если эти три шара имеют одинаковый цвет, я хочу, чтобы линия, соединяющая их, была в стиле X (пунктирная, красная или т. д.)
  2. Если три мяча разного цвета, я хочу, чтобы линия, соединяющая их, была в стиле Y (сплошная линия, оранжевая и т. д.)
  3. Почему мой код не работает в конкретном случае 2?
  4. Есть ли способ заставить код работать для разного количества синих и зеленых шариков?
  5. Как мне выбрать поворот центрального многоугольника, чтобы он совпадал с углами внешнего? Теперь я изменил внутренний, чтобы вручную подогнать.
  6. Есть ли конкретная причина, по которой приведенный ниже код не работает?

    \foreach \x in {1,...,\n}{
      \begin{scope}[shift={(b.corner \x)}]
        \missingPentagonTemp{2}{c};
      \end{scope}
    } 
    

Вот как я хочу, чтобы это выглядело (предоставлено Paint).

введите описание изображения здесь

МВЭ

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

решение1

Это попытка ответить на вопрос с помощью pic. Этот код проверяет, находится ли вершина в списке отсутствующих или выделенных вершин (да, теперь вы можете использовать списки) и рисует ребра соответствующим образом.

Что касается Ваших пунктов:

  1. Сделанный.
  2. Готово. На этом этапе стиль готов. Его можно изменить.
  3. Честно говоря, я не пытался продумать код. Извините.
  4. Да. Вот это списки.
  5. Изменено. Можно также просто вращать полигон, но мне больше нравятся условия мод. ;-)
  6. Опять же, я не пробовал. Извините.

Полный код:

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

введите описание изображения здесь

Связанный контент