Yves Combe nous propose deux macros pour la construction d'éprouvettes. J'ai juste ajouté un peu de transparence (qu'on ne voit pas vraiment :)).
volume.mp [ source brut ]
%@Auteur:Yves Combe input geometriesyr16; % quelques variables sans intérêts color couleur_liquide; couleur_liquide = ciel; numeric rebord, taille_graduation, marque_graduation, heuteur_graduation; rebord = 0.1u; taille_graduation = 0.05u; marque_graduation = 5; hauteur_graduation = 0.9; vardef eprouvette(expr origine, hauteur, largeur, n_graduations, grad_liquide, unite)= begingroup pair A,B,C,D,E,F,G,H, grad; numeric a; % le contour A = origine + (-rebord, hauteur); %show (A); B - A = (rebord, 0); %show (B); B - C = ( 0 , hauteur); D - C = (largeur, 0); E - D = B - C; F - E = B - A; % le liquide G - C = (0, grad_liquide*hauteur_graduation*hauteur/n_graduations); H - D = G - C; fillcolor:=couleur_liquide; transparence (G--H--D--C--cycle); draw A--B--C--D--E--F; % la graduation for a:=1 upto n_graduations: grad := D + ( 0, a*hauteur_graduation*hauteur/n_graduations); if (a mod 5)=0: draw grad--(grad + (2taille_graduation,0)); label.rt(decimal a, grad + (2taille_graduation,0)); else: draw grad--(grad + (taille_graduation,0)); fi endfor % l'unite s'affiche en haut label.rt(unite, F); endgroup enddef; numeric caillou_points, caillou_delta; caillou_points = 10; caillou_delta = 0.05; color caillou_couleur; caillou_couleur = red; vardef caillou (expr origine, hauteur, largeur) = begingroup numeric a; path caillou, cc; z[1] = origine + (largeur/2, 0); z[2] = origine + (0, hauteur/2); z[3] = origine + (largeur/2, hauteur); z[4] = origine + (largeur, hauteur/2); cc = z[1]..z[2]..z[3]..z[4]..cycle; caillou = z[1].. for a:=1 upto caillou_points-1: (point (length cc)*a/caillou_points of cc + (largeur*caillou_delta*normaldeviate, hauteur*caillou_delta*normaldeviate)).. endfor cycle; fillcolor:=red; transparence caillou; draw caillou; endgroup enddef;

beginfig(1); eprouvette( u*(1,1), 5u, 2u, 20, 13, "dL"); endfig;

beginfig(2); caillou( u*(1.5,1.1), 1.5u, 1u); eprouvette( u*(1,1), 5u, 2u, 20, 16, "dL"); endfig; end