TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want to draw something like this using TikZ:

curve example

I can probably make the curve using controls but that wouldn't allow me to draw the points on it.

share|improve this question
Just for the maintenance purposes: Is it OK if we replace the image with the result of the answer? I can't tell since the image does not exist anymore. – percusse Nov 15 '11 at 21:59
@GuanHao: Stackexchange has a special subdomain for imgur.com (stack.imgur.com), where images usually never expire, what they will do otherwise after some time. For uploading them to that special subdmn one must use the according button for image including or the keyboard shortcut Ctrl+G inside the edit function. (Why the original image, that was on stack.imgur.com, not is accessible anymore, I don’t know.) – Speravir May 4 '12 at 20:37
Probably MetaPost is a better tool for that. – mbork May 4 '12 at 21:08
up vote 12 down vote accepted

You could use the intersections library. Here is a modified version of one of the examples from the pgfmanual (TikZ 2.0). It's reasonable close to your figure and you should be able to modify it.

\clip (-2,-2) rectangle (2,2);
\draw [name path=curve] (-2,1) .. controls (8,1) and (-8,-1) .. (2,-1);
\path[name path=line 1] (0,-2) -- (0,2)  (-1,-2) -- (-1,2) (1,-2) -- (1,2);
\draw [name intersections={of=curve and line 1, name=i}] 
  (i-6) -- (i-7) (i-5) -- (i-8);
\draw [name intersections={of=curve and line 1, name=i},name path=line 2]
  (i-5) --(i-3) -- (i-7) (i-6) -- (i-2) -- (i-8); 

\fill [name intersections={of=curve and line 1, name=i}][blue, opacity=0.5]
\foreach \s in {1,2,3,5,6,7,8}{(i-\s) circle (2pt)};

\fill [name intersections={of=curve and line 2, name=i}][blue, opacity=0.5]
\foreach \s in {5,7}{(i-\s) circle (2pt) node {\footnotesize\s}};

This might be better?



\path[name path=circle] 
  (0,0) circle (2cm);

\path[name path=cross] 
  (-2,-2) -- (2,2) 
  (-2,2) -- (2,-2) 
  (0,2) -- (0,-2);

\draw [% 
  name intersections={of=circle and cross, name=i},
  name path=line
  (i-1) -- (i-5) -- (i-3) 
  (i-4) -- (i-2) -- (i-6) 
  (i-1) -- (i-4) 
  (i-3) -- (i-6);

\fill [% 
  name intersections={of=line and line, name=i}
] [blue, opacity=0.5]
  \foreach \s in {1,2,3,6,8,10,11,21,25}{(i-\s) circle (2pt)};

\draw [%
  name intersections={of=line and line, name=i}
  (i-8) ++(-0.5,0) -- (i-8) 
    to[out=45,in=180]  (i-10) 
    to[out=0,in=135]   (i-3)
        to[out=-45,in=0]   (i-2)
    to (i-21) to (i-6) 
    to[out=180,in=135] (i-11)
    to[out=-45,in=180] (i-1)
    to[out=0,in=225]   (i-25) 

share|improve this answer

You can draw the points (and give each point a name for convenience when drawing the curve) and the straight lines first.

When drawing the curve check out the in and out options which control the angles. Search "in=" or "out=" in the manual and you will get tons of examples.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.