在 tikz 中绘制星形聚合物

在 tikz 中绘制星形聚合物

我想在 tikz 中绘制一个类似于下图的结构。绘制必须是二维的,有 4 个臂,每个臂有 6 个单体。最好每个臂都扭曲,就像下面的结构一样,但单体不允许重叠(这是最重要的)。

有没有什么软件包可以帮我做这个?我有 pythontex,所以任何可以做到这一点的 python 代码也是一个完美的解决方案。还是我必须手动定义所有球?

正如评论中所述。我的目的不是让你为我画图,而是如果有任何包,我可以利用它来使它更容易 - 这样我就不必手动绘制所有圆圈。

星形聚合物

我使用以下代码绘制了带有中心珠和 4 个臂的初始结构:

首先当然使用 tikz:

\usepackage{tikz}
\usetikzlibrary{3d,calc}

然后可以将 5 颗珠子画成:

%Center ball
\shade[ball color=red!60] (0,0,0) circle (1cm);

%The 4 directions
\shade[ball color=blue!60] (2,0,0) circle (1cm);
\shade[ball color=blue!60] (-2,0,0) circle (1cm);
\shade[ball color=blue!60] (0,2,0) circle (1cm);
\shade[ball color=blue!60] (0,-2,0) circle (1cm);

答案1

这是您的起点,使用decorations.markingspercusse 建议的 tikz 库。您只需按照您想要的方式调整路径,正确绘制“星星”,路径的装饰由 tikz 完成。顺便问一下,您开始在三维中定义坐标有什么好的理由吗?至少对于获得问题中所示的图片来说,这不是必要的。

\documentclass[tikz, border=3mm]{standalone}
\usetikzlibrary{decorations.markings}
%
\begin{document}
%
\begin{tikzpicture}[
    decoration={
        markings,% switch on markings
        mark=% actually add a mark
        between positions 0 and 1 step 4mm % tells tikz to decorate path from beginning to end (0,1) and every 4 mm (diameter of the balls) defined two lines later
        with
            {\shade[ball color=red!80] (0,0) circle (.2cm);}% this is the definition of the actual marking.
        }
    ]
%
\path[postaction={decorate}] (0,0) .. controls (.5,1) and (1,1) .. (1.5,2);% postaction={decorate} tells tikz to decorate the path after it has been created. Note that \path itself doesn't draw anything but just creates the path to decorate.
\path[postaction={decorate}] (0,0) .. controls (-2,-1) and (-1,-2) .. (-1.5,-2);
\path[postaction={decorate}] (0,0) .. controls (1,-1) and (-1,-2) .. (1.5,-2);
\path[postaction={decorate}] (0,0) .. controls (-1,1) and (0,1.5) .. (-1.5,2);
\shade[ball color=blue!60] (0,0) circle (.2cm);% draw a blue ball over the red one in the center
%
\end{tikzpicture}%
%
\end{document}

在此处输入图片描述

答案2

为了便于将来参考,我还最终找到了一个基于 @DRi 在评论中给出的链接中定义的 for 循环的解决方案。@JMP 的解决方案更快、更优雅 - 但是使用 for 循环可以让我更好地控制珠子的数量,并且更容易使串/臂的路径随机化。

\pgfmathsetmacro{\xvala}{0}
\pgfmathsetmacro{\yvala}{0}
\pgfmathsetmacro{\xvalb}{\xvala}
\pgfmathsetmacro{\yvalb}{\yvala}
\pgfmathsetmacro{\xvalc}{\xvala}
\pgfmathsetmacro{\yvalc}{\yvala}
\pgfmathsetmacro{\xvald}{\xvala}
\pgfmathsetmacro{\yvald}{\yvala}
\pgfmathsetmacro{\size}{0.5}
\pgfmathsetmacro{\radius}{\size/2}
\shade[ball color=red!60] (\xvala,\yvala) circle (\radius);
\pgfplotsforeachungrouped \i in {1,...,6}{
    \pgfmathsetmacro{\noisea}{(rnd-.5)*\size*\i/6*2}
    \pgfmathsetmacro{\noiseb}{(rnd-.5)*\size*\i/6*2}
    \pgfmathsetmacro{\noisec}{(rnd-.5)*\size*\i/6*2}
    \pgfmathsetmacro{\noised}{(rnd-.5)*\size*\i/6*2}

    \pgfmathsetmacro{\xvala}{\xvala + sqrt((\size)^2-(\noisea)^2)}
    \pgfmathsetmacro{\yvala}{\yvala+\noisea}

    \pgfmathsetmacro{\xvalb}{\xvalb - sqrt((\size)^2-(\noiseb)^2)}
    \pgfmathsetmacro{\yvalb}{\yvalb+\noiseb}    

    \pgfmathsetmacro{\yvalc}{\yvalc - sqrt((\size)^2-(\noisec)^2)}
    \pgfmathsetmacro{\xvalc}{\xvalc+\noisec}    

    \pgfmathsetmacro{\yvald}{\yvald + sqrt((\size)^2-(\noised)^2)}
    \pgfmathsetmacro{\xvald}{\xvald+\noised}        

    \shade[ball color=blue!60] (\xvala,\yvala) circle (\radius);
    \shade[ball color=blue!60] (\xvalb,\yvalb) circle (\radius);
    \shade[ball color=blue!60] (\xvalc,\yvalc) circle (\radius);
    \shade[ball color=blue!60] (\xvald,\yvald) circle (\radius);
}

相关内容