平均能量损失

平均能量损失

这个问题与https://math.stackexchange.com/questions/3449433/selecting-cards-to-form-a-fair-game?noredirect=1#comment7090962_3449433。我试图直观地说明如何从一堆N+M球中抽出 3 个球,其中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}
    } 
    

这是我想要的效果(由油漆提供)。

在此处输入图片描述

平均能量损失

\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. 已更改。也可以只旋转多边形,但我喜欢 mod 条件。;-)
  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}

在此处输入图片描述

相关内容