我对使用 TikZ 创建下图很感兴趣,尽管我对这种“机器”还很陌生。
谢谢这篇旧帖子,我成功创建了以下内容
问题:
- 我怎样才能在形状内部和周围添加所有这些小球?
- 如何添加相应的字母符号?
- 有没有办法可以改变边界的颜色?
非常感谢您付出的时间和帮助!
答案1
当你在等待 tikz-help 时,这里有一个版本元帖子利用两个随机数生成器:uniformdeviate n
和normaldeviate
。
您应该用以下方法编译它lualatex
(或者研究如何使其适应普通 MP):
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
% make some nice colours
color orange, berry, claret, pine;
orange = 1/256(252, 128, 8);
berry = 1/256(70, 122, 168);
claret = 1/256(168, 75, 68);
pine = 1/256(74, 170, 122);
% define a roughly circular boundary
path boundary;
boundary = for i=0 upto 7: (50 + uniformdeviate 20) * dir (45i-30) .. endfor cycle;
% and draw it with a thick pen and in orange
draw boundary withpen pencircle scaled 3 withcolor orange;
% put 12 random green circles inside the boundary
for i=1 upto 12:
path p; p = fullcircle scaled 4
shifted (uniformdeviate 7/8)[origin, point uniformdeviate 8 of boundary];
fill p withcolor pine; draw p;
endfor
% and now add n red/blue circles round the outside
numeric t, n, dt;
t = 0; n = 32; 2 dt = arclength boundary / n;
for i=1 upto n-1:
t := t + 5/4 dt + 3/2 uniformdeviate dt;
numeric a; a = arctime t of boundary;
path p; p = fullcircle scaled 4
shifted point a of boundary
shifted 4 unitvector(direction a of boundary rotated -90);
fill p withcolor if normaldeviate > 0: claret else: berry fi;
draw p;
endfor
% add labels, the "-30" in the definition of boundary
% means that the 0 point is roughly bottom right
label.ulft("$\Omega$", point 0 of boundary);
label.lrt("$\Gamma$", point 0 of boundary) withcolor orange;
endfig;
\end{mplibcode}
\end{document}
每次编译时它(当然)都会给您略有不同的输出,并且由于我没有进行任何碰撞的美学检查,所以您可能需要编译几次才能获得漂亮的图表。
您可以通过顶部的链接找到 Metapost 的教程和参考资料。
笔记
uniformdeviate n
返回一个随机数,在 0 和 之间均匀分布n
,其中n
是任何有效的 MP 数字。意思是1/2 n
如果调用足够多次,返回的值将大致如此。normaldeviate
返回一个服从正态分布的随机数,平均值 = 0,标准差 = 1。返回的数字中大约有一半为负数,而且很少有数字超出范围 (-3, 3)。颜色定义为 RGB 颜色。MP 使用三个数字组成的元组来表示 RGB 颜色,并期望三个元素均介于 0 和 1 之间。任何小于 0 的值都会被截断为 0,任何大于 1 的值都会被截断为 1。因此,要表示 WebSafe 颜色
#FF6633
,您首先需要将其转换为十进制元组(255, 102, 51)
,然后将所有值缩小到 0 到 1 的范围,而不是 0 到 255。您可以通过将元组除以 255 来做到这一点,就像这样,(255, 102, 51)/255
或者因为 MP 支持分数常数和隐式乘法1/255(255, 102, 51)
。如果您更喜欢使用 Latex 文档中定义的常规颜色,那么使用另一种
luamplib
魔法,您仍然可以在 MP 图形中访问它们。因此,如果您\definecolor{mmm}{rgb}{.6, .3, .1}
在常规 LaTeX 序言中有(比如说),那么您可以在这样的环境中直接使用它mplibcode
:draw boundary withcolor \mpcolor{mmm};