4

I'd like to draw some sets and subsets with Tikz, for a course on set theory. I came up with this:

\documentclass{article}
\usepackage{tikz}
\newcommand{\spt}{\scriptstyle}
\begin{document}
  \begin{tikzpicture}[croix/.pic={\draw[thick,black] (-0.067,-0.067)
    -- (0.067,0.067) (-0.067,0.067)--(0.067,-0.067);}]
    \filldraw[draw=black,fill=black!10!white] (0,0)
       circle[radius=2.8];
    \filldraw[draw=red,fill=red!10!white,rounded corners]
      (-0.5,2.5) -- (-0.5,-0.5) -- (2.2,-1.5) -- (2.2,1.5) -- cycle;
    \filldraw[draw=blue,fill=blue!10!white,rounded corners]
      (-2.2,1) -- (-1.7,1.5) -- (-1.2,1) -- (-1.2,-0.5) -- (0,-1.5) --
      (0.5,-2) -- (0,-2.5) -- (-2.2,-1.5) -- cycle;
    \filldraw[draw=green,fill=green!10!white,rounded corners,opacity=0.5]
      (-2.3,1.5) -- (0,2.5) -- ((0.5,2) -- (0.5,0) -- (0,-0.5) --
      (-2.3,0.5)  -- cycle;
    \draw (0,0) pic {croix} node[above=1mm]{$\spt3$}
          (90:2) pic {croix} node[below=1mm]{$\spt1$}
          (150:2) pic {croix} node[below=1mm]{$\spt6$}
          (210:2) pic {croix} node[below right=1mm]{$\spt2$}
          (-90:2) pic {croix} node[left=1mm]{$\spt4$}
          (-30:2) pic {croix} node[above=1mm]{$\spt7$}
          (30:2) pic {croix} node[above=1mm]{$\spt5$};
    \draw[red,thick] (2.18,1.43) -- (2.7,2) node[above right]{$A$};
    \draw[blue,thick] (-2.17,-1.47) -- (-2.7,-2) node[below left]{$B$};
    \draw[green,thick] (-2.27,1.47) -- (-2.8,2) node[above left]{$C$};
  \end{tikzpicture}
\end{document}

The result is far from good looking. The subsets are ugly :

set drawing

Is there a way I can make this nicer without computing a lot of points by hand?

10
  • 1
    Can you provide a complete MWE? What do you mean with nicer? What is \spt?
    – azetina
    Commented Nov 15, 2020 at 20:49
  • There is a question somewhere about this exact thing...
    – Alenanno
    Commented Nov 15, 2020 at 21:54
  • 3
    Possible duplicate: padded boundary of convex hull Related: tex.stackexchange.com/a/211302/4778, tex.stackexchange.com/q/297222/4778, and many more...
    – Alenanno
    Commented Nov 15, 2020 at 22:04
  • @azetina at the beginning of the code he wrote \newcommand{\spt}{\scritpstyle}.
    – Alenanno
    Commented Nov 15, 2020 at 22:05
  • @Alenanno The \newcommand{\spt}{\scritpstyle} wasn't there when azetina wrote their comment. BTW, shouldn't it be \scriptstyle?
    – user228539
    Commented Nov 15, 2020 at 22:29

1 Answer 1

1

OK, I came up with this "solution" with the second link from @Alenanno :

\documentclass{article}
\usepackage{tikz}
\newcommand{\spt}{\scriptstyle}
\begin{document}
\begin{center}
  \begin{tikzpicture}[croix/.pic={\draw[thick,black] (-0.067,-0.067) --
      (0.067,0.067) (-0.067,0.067)--(0.067,-0.067);}]
    %% L'ensemble E
    \filldraw[draw=black,fill=black!10!white] (0,0)
    circle[radius=2.8];
    %% Les positions des éléments
    \coordinate (p1) at (90:2);
    \coordinate (p2) at (210:2);
    \coordinate (p3) at (0,0);
    \coordinate (p4) at (-90:2);
    \coordinate (p5) at (30:2);
    \coordinate (p6) at (150:2);
    \coordinate (p7) at (-30:2);
    %% La partie A
    %% Les coordonnées des extrémités des arcs de cercles
    \coordinate (p1a) at ($(p1)+(180:0.5)$);
    \coordinate (p3a) at ($(p3)+(-120:0.5)$);
    \coordinate (p7a) at ($(p7)+(0:0.5)$);
    \coordinate (p5a) at ($(p5)+(60:0.5)$);
    %% Le dessin de la partie A
    \filldraw[draw=red,fill=red!10!white,rounded corners]
    (p1a) arc[start angle=180, end angle=60, radius=0.5] ..
    controls ++(-30:1) and ++(150:0.2) ..
    (p5a) arc[start angle=60, end angle=0, radius=0.5] ..
    controls ++(-90:0.2) and ++(90:0.2) ..
    (p7a) arc[start angle=0, end angle=-120, radius=0.5] ..
    controls ++(150:0.2) and ++(-30:0.2) ..
    (p3a) arc[start angle=-120, end angle=-180, radius=0.5] ..
    controls ++(90:0.2) and ++(-90:0.2) .. cycle;
    %% La partie B
    %% Les coordonnées des extrémités des cercles
    \coordinate (p6b) at ($(p6)+(180:0.5)$);
    \coordinate (p2b) at ($(p2)+(-120:0.5)$);
    \coordinate (p4b) at ($(p4)+(60:0.5)$);
    %% Le dessin de la partie B
    \filldraw[draw=blue,fill=blue!10!white,rounded corners]
    (p6b) arc[start angle=180, end angle=0, radius=0.5] ..
    controls ++(-90:2) and ++(150:2) ..
    (p4b) arc[start angle=60, end angle=-120, radius=0.5] ..
    controls ++(150:0.2) and ++(-30:0.2) ..
    (p2b) arc[start angle=-120, end angle=-180, radius=0.5] ..
    controls ++(90:0.2) and ++(-90:0.2) .. cycle;
    %% La partie C
    %% Les coordonnées des extrémités des arcs de cercles
    \coordinate (p1b) at ($(p1)+(120:0.4)$);
    \coordinate (p6c) at ($(p6)+(-120:0.4)$);
    \coordinate (p3c) at ($(p3)+(0:0.4)$);
    %% Le dessin de la partie C
    \filldraw[draw=green,fill=green!10!white,rounded corners,opacity=0.5]
    (p1b) arc[start angle=120, end angle=0, radius=0.4] ..
    controls ++(-90:0.2) and ++(90:0.2) ..
    (p3c) arc[start angle=0, end angle=-120, radius=0.4] ..
    controls ++(150:0.2) and ++(-30:0.2) ..
    (p6c) arc[start angle=-120, end angle=-240, radius=0.4] ..
    controls ++(30:0.2) and ++(-210:0.2) .. cycle;
    \draw (p1) pic {croix} node[below=1mm]{$\spt1$}
          (p2) pic {croix} node[below right=1mm]{$\spt2$}
          (p3) pic {croix} node[above=1mm]{$\spt3$}
          (p4) pic {croix} node[left=1mm]{$\spt4$}
          (p5) pic {croix} node[above=1mm]{$\spt5$}
          (p6) pic {croix} node[below=1mm]{$\spt6$}
          (p7) pic {croix} node[above=1mm]{$\spt7$};
     \draw[red,thick] (2.18,1.43) -- (2.7,2) node[above right]{$A$};
     \draw[blue,thick] (-2.17,-1.47) -- (-2.7,-2) node[below left]{$B$};
     \draw[green,thick] (-2.27,1.47) -- (-2.8,2) node[above left]{$C$};
  \end{tikzpicture}
\end{center}
\end{document}

As you can see, the result is much better, but I still have some "glitches" that I don't quite understand : for example, the arcs don't seem to start and end at the angles I programmed. And there is a serious glitch around point $1$ for the green set, due, I guess, to the ".. cycle", which I surely don't understand.

New try for set theory

I'll try to fine tune it later. For now, if you have some remarks on my code, they would be appreciated

1
  • 1
    Always post compilable code - this is not. You have decided to draw arcs, so you should remove all rounded corners options - they only hurt you here. The last segment in every closed loop can be drawn with --cycle Commented Nov 21, 2020 at 17:04

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .