使用 tikz 绘制此图

使用 tikz 绘制此图

我对使用 TikZ 创建下图很感兴趣,尽管我对这种“机器”还很陌生。

在此处输入图片描述

谢谢这篇旧帖子,我成功创建了以下内容

在此处输入图片描述

问题:

  1. 我怎样才能在形状内部和周围添加所有这些小球?
  2. 如何添加相应的字母符号?
  3. 有没有办法可以改变边界的颜色?

非常感谢您付出的时间和帮助!

答案1

当你在等待 tikz-help 时,这里有一个版本元帖子利用两个随机数生成器:uniformdeviate nnormaldeviate

在此处输入图片描述

您应该用以下方法编译它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};
    

相关内容