尝试绘制一个随机聚合物网格,我打算通过在 (x,0) 和 (x,1) 之间绘制一系列随机游动来将其可视化,其中 x 是任意的。我的第一次尝试已完成,并且已编译。但如果我更改某些内容,它会给出错误消息“Package tikz 错误:放弃此路径。您忘记了分号吗?}}”鉴于此,我的第一次尝试并未取得任何进展。
我所说的“某些事情”是指,例如删除“nicefrac”或有时任意更改 \foreach 语句。或者,即使我将坐标 A 的起始坐标更改为例如 (rand,rnd)。
那么下面的代码显然并不理想。如果线条没有画得非常细,那么每个关节处都会有难看的缝隙,会出现我不明白的错误信息。那么,我怎样才能更好地绘制杂乱的网格呢?
规则很简单:网格中的每个聚合物链都绘制为一组长度相等的连接段。这些连接段之间的接头应仅能偏离一定角度(取决于聚合物刚度),并且它们都应保持在绘制表面的给定距离内。如果达到此极限,则聚合物将根据情况向下或向上弯曲。
\documentclass{article}
\usepackage{tikz}
\usepackage{nicefrac}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{calc}
\newcommand*{\ExtractCoordinate}[1]{\path (#1); \pgfgetlastxy{\XCoord}{\YCoord};}%
\begin{document}
\begin{tikzpicture}
\clip (-.5,-.5)rectangle(.5,2);
\foreach \x in {-1.0,-.9,...,1}{
\draw[ultra thin] (\x,0.1) coordinate[name=A];
\foreach \y in {0,.2,...,10}{
\ExtractCoordinate{A}
\ifthenelse{\lengthtest{\YCoord <28 pt}}%Checked if below 1.
{%Is below 1.
\ifthenelse{\lengthtest{\YCoord >0 pt}}{%Check if above 0
\draw[ultra thin] (A)--++(rand*120:.05) coordinate[name=A];%Yes, above zero
}{\draw[ultra thin] (A)--++(rnd*89:.05) coordinate[name=A];}%NOT above zero
}%Is not below 1
{\draw[ultra thin] (A)--++(-rnd*89:.05) coordinate=name=A];
}%ELSE 1
}}
\draw[fill=blue!15] (-1,0)rectangle(1,-1);%surface coated by the mesh
\end{tikzpicture}
\end{document}
代码结果类似于此:
或者这样,具有正常的线条粗细:
这与我想要的结果非常接近,尽管我想稍微调整一下角度的行为,以便可以改变每个聚合物段的弯曲程度(从而模拟不同的聚合物刚度)。此外,此时,所有聚合物都倾向于向右移动,它们的运动并不是真正随机的,而是朝着一个方向。
答案1
我不知道剪切路径或底部的矩形。但您可以轻松地在一条路径上绘制一条随机线。
我使用坐标作为因子的参考,c-0
而不是使用单位,该计算将基于 PGF/TikZ 的坐标系。c-1
rand
pt
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[
line join=round, line cap=round,
inner sep=+1pt, near end, nodes={fill=white}]
\path[very thin] coordinate (c-0) at (-1,0) (c-0) edge node {0} ++(right:5)
coordinate (c-1) at (-1,1) (c-1) edge node {1} ++(right:5);
\foreach \x[evaluate={\col=((\x+1)/2)*100}] in {-1.0, -.9, ..., 1}
\draw[color=blue!\col!red] (\x, .5) \foreach \cnt in {1,...,50}{
coordinate (@) let \p0=($(@)-(c-1)$),
\p1=($(@)-(c-0)$) in
-- ++ ({rand*ifthenelse(and(\x0>0,\x1<0),120,89)}:.05)};
\end{tikzpicture}
\end{document}