I am a TeX/LaTeX noob, but I am learning rapidly. I am about to attempt to draw the following figure using LaTeX/TeX/TikZ I already have a, (I think) good working knowledge of how to draw circles, braces, lines, segments, and nodes, etc.

The last time I drew one though, I noticed that I spent a lot of time fine tuning parameters, making sure that lines intersected circles at the proper points, making sure lines were parallel, etc.

I need to draw the following figure, so I wanted first inquire if there is a fast/easy way, or anything I should keep in mind, when creating parallel lines (the red ones), as per the following figure:

enter image description here

The main time sinks I foresee are going to be the following:

  1. Making sure the length of the purple lines are exactly correct, so as not to overshoot the red ones.

  2. Making sure the red lines are all parallel to each other.

  3. Making sure than I can draw nodes/dots where lines intersect each other and/or the circle.

Is there any particular way(s) that is recommended to make sure that the above points do not waste too much time? I would appreciate any advice/examples.


P.S. I am making good use of TikZ as well.


I am including a minimal example of my 'skill' set. As you can see, I painstakingly usually just have to fine tune co-ordinates, for where things intersect, etc. I also do not know how to not-waste-time if I wanted to make parallel lines, as shown in the red lines above. Here is my example code:





    \draw [help lines] (-4,-4) grid (4,4);

    % Draw the axes
    \draw [->,black, ] (-4,0) -- (4,0) ;
    \draw [->,black] (0,-4) -- (0,4) ;

    % Draw the circle
    \path [draw, ultra thick,  black] (0,0) circle (3);

    %Radial Lines    

    %Wavefront normal

    \draw[blue](0,1) arc (90:60:1);
    \draw[blue] (0,0.95)arc(90:60:0.95);
    \node[] at (75:1.2)  {$\alpha$};

    \draw[blue] (0.7,1.2)arc(90:30:0.37);
    %\node[] at (50:2) {$\frac{pi}{4}-\alpha$};
        to[out=180,in=90] (50:1.5);

    \path[fill, black](45:3) circle(0.1);
    \node[] at (45:3.3){1};
    \path[fill, black](135:3) circle(0.1);
    \node[] at (133:3.3){4};
    \path[fill,black](225:3) circle(0.1);
    \node[] at (225:3.3){3};
    \path[fill, black](315:3) circle(0.1);
    \node[] at (313:3.3){2};

    \draw[blue, ultra thick](-.5,3.6347)--(3.5,1.3252);
    \draw[blue, ultra thick](-2.5,2.34)--(3.5,-1.1242);
    \draw[blue, ultra thick](-3.2,0.9509)--(2.8,-2.5132);
    \draw[blue, ultra thick](-3.2,-1.4985)--(0.2,-3.4615);

    %Right angle signs

    % Done


The above code is now giving me this:

enter image description here

  • 1
    It would be helpful, to see a small MWE on how you define the circle and the lines. May 16, 2013 at 21:13
  • @Qrrbrbirlbel Ok, I will work on it right now.
    – Spacey
    May 16, 2013 at 21:13
  • There are at least two large packages that make doing this sort of thing easier: pstricks and tikz. They both have an initially steep learning curve. I don't do much work in tikz but I'd be more than happy to make suggestions of what to write for pstricks.
    – A.Ellett
    May 16, 2013 at 21:18
  • I assumed you wanted to use TikZ because of the tag but now that @A.Ellett mentions it, you do not actually mention it in the question. May 16, 2013 at 21:23
  • 1
    @Qrrbrbirlbel I have included a code snippet. Please see my edits. Yes, sorry, I also edited the question to make it clear I would like to use tikZ, if for no other reason than I this is what I have been learning with thus far.
    – Spacey
    May 16, 2013 at 21:25

3 Answers 3


The first TikZ picture shows a rather sloppy idea to draw the parallel lines. The second example shows a more automatic way of drawing secants (one could have used the \angle value directly but I want do show how I’d do it, if the direction of the vector is not known to the user.

The second example also shows that calc’s ($(<p1>)!(<p3>)!(<p2>)$) isn’t very exact for close (<p1>) and (<p2>). Of course, there isn’t even a line when <p1> = <p2>.

The intersections library might be more precise in finding points where the orthogonal line to the vector and the secants intersect.


  m*/.style args={#1:#2}{
    insert path={node [fill=green!50!black, outer sep=+0pt, shape=circle, inner sep=0pt, minimum size=+4pt,#1,label={#2}] {}}
  m/.style={insert path={coordinate (#1)}},
  parLines/.style={draw=red,,shorten <=+-.5cm,shorten >=-.5cm},
  vertLines/.style={draw=purple,shorten >=.5\pgflinewidth},
  @splitLine/.code args={#1 -- #2}{\def\tikztotargetA{#1}\def\tikztotargetB{#2}},
  vert on/.style={
    to path={
      -- ($(\tikztotargetA)!(\tikztostart)!(\tikztotargetB)$) node[right angle node,rotate=90*#1] {}\tikztonodes
  vert on/.default=0,
  right angle node/.style={
    at end,sloped,above,allow upside down,
    anchor=south east,
    inner sep=0pt,
    minimum size=3pt,
    append after command={
      \pgfextra\pgfinterruptpath\draw[right angle node path] (\tikzlastnode.south west) -- (\tikzlastnode.north west) -- (\tikzlastnode.north east);\endpgfinterruptpath\endpgfextra
  right angle node path/.style={draw,thin,black,-,shorten >=.4pt},
    to path={
      let \p{@dir}=(\tikztotarget), \n{@dir}={atan2(\x{@dir},\y{@dir})} in
      (node cs: name=\tikztostart, anchor=#1) [m*={name=m#1}:#1] -- (node cs: name=\tikztostart, anchor={2*(\n{@dir}-90)-#1}) [m=m#1'] \tikztonodes
\clip (-2.5,-2.5) rectangle (2.5,2.5);
\draw[thin, ->] (0,0) [m*={black,minimum size=+3pt,name=O}:] -- node [sloped,above,inner sep=+1pt,font=\scriptsize] {$\vec v$} ++(150:1) coordinate (d);

\draw[thin, ->] (0,0) -- ([rotate=90]d)  [shorten >=-1.3cm];
\draw[thin, ->] (0,0) -- ([rotate=-90]d) [shorten >=-1.3cm];

\node [draw=blue, circle through={(2,0)}] (c) {};

\draw[parLines] (c.50)  [m*={name=m1}:1] -- ++([scale=2] d)    [m=m1'];
\draw[parLines] (c.140) [m*={name=m2}:2] -- ++([scale=-4] d)   [m=m2'];
\draw[parLines] (c.-30) [m*={name=m3}:3] -- ++([scale=4.5] d)  [m=m3'];
\draw[parLines] (c.210) [m*={name=m4}:4] -- ++([scale=-2.5] d) [m=m4'];

\draw[vertLines] (c.center) to[vert on] (m1 -- m1');
\draw[vertLines] (c.center) to[vert on] (m4' -- m4);

\foreach \angle in {0,10,...,359}{% Careful, 36 pages!
\clip (-2.5,-2.5) rectangle (2.5,2.5);
\draw[thin, ->] (0,0) [m*={black,minimum size=+3pt,name=O}:] -- node [sloped,above,inner sep=+1pt,font=\scriptsize] {$\vec v$} ++(\angle:1) coordinate (d);

\draw[thin, ->] (0,0) -- ([rotate=90]d)  [shorten >=-1.3cm];
\draw[thin, ->] (0,0) -- ([rotate=-90]d) [shorten >=-1.3cm];

\node [draw=blue, circle through={(2,0)}] (c) {};

\draw[parLines] (c) to[secant=30]  (d);
\draw[parLines] (c) to[secant=140] (d);
\draw[parLines] (c) to[secant=-30] (d);
\draw[parLines] (c) to[secant=210] (d);

\draw[vertLines] (c.center) to[vert on] (m30 -- m30');
\draw[vertLines] (c.center) to[vert on] (m210' -- m210);


enter image description here

enter image description here

  • Holy christos! You're crazy! Wow! How did you make this animated?! :-)
    – Spacey
    May 17, 2013 at 0:18
  • BTW, see my new edit. I think I have something working... although it is kind of clunky...
    – Spacey
    May 17, 2013 at 0:22
  • 2
    @TyranaSaur: Creating a GIF animation can be found in my other answer. Don't forget to upvote if you find it useful. May 17, 2013 at 2:33
  • 1
    @TyranaSaur It’s a combination of the standalone class (which provides the cropping and splitting of the TikZ picture) and ImageMagick’s convert. Martin Scharrer, the author of standalone, describes the process for beamer slides in his answer to Converting beamer slides to animated images. — I could update my answer with a little more explanation and re-producing your actual example, if you’re not satisfied with Alain’s tkz-euclide answer. May 17, 2013 at 13:08
  • Very interesting solution ! I like the methods that you used in the different parts of your answer. May 17, 2013 at 18:59

Solution with tkz-euclide, we get the parallel lines with

  \tkzDefLine[parallel=through B](a,A)     \tkzGetPoint{b} 

The new line goes through B and it's a parallel to Aa, we get a point b of this line.


    % init the picture
    \tkzGrid \tkzClip
    % definition of points  
    % it was possible to use random points something like
    % \tkzGetRandPointOn[circle = center O radius 3 cm]{A}  
    % definition of parallel lines
    \tkzDefLine[parallel=through B](a,A)     \tkzGetPoint{b}    
    \tkzDefLine[parallel=through C](a,A)     \tkzGetPoint{c}    
    \tkzDefLine[parallel=through D](a,A)     \tkzGetPoint{d}
    % orthogonal projection of O on the first line  
    \tkzDefPointBy[projection=onto A--a](O)  \tkzGetPoint{H}  
    % we can avoid the next line and use tkzInterLL 
    \tkzDefPointBy[projection=onto C--c](O)  \tkzGetPoint{K}     
    \tkzInterLL(K,H)(b,B)                    \tkzGetPoint{L}  
    % now we can draw         
    \tkzDrawCircle[R,thick](O,3 cm)
    \tkzDrawLines[add=1 and 1,color=blue](a,A B,b C,c)
    \tkzDrawLine[add=2 and 1,color=blue](D,d)   
     \tkzDrawSegments(A,C B,D)
    \tkzDrawLine[add=2 and 1,color=red](O,H)
     % mark right angles    
    \tkzMarkRightAngles[fill=lightgray](a,H,O C,K,O B,L,O)
     % draw points
    % mark angles
     \tkzMarkAngle[mark= ,arc=ll,size=1 cm,mkcolor=blue](H,O,B)
     \tkzMarkAngle[mark= ,arc=l,size=2.25 cm,mkcolor=blue](A,O,H)
    % label points
     \tkzLabelPoint[right](A){$1$} \tkzLabelPoint[right](D){$4$}
     \tkzLabelPoint[above](B){$2$}  \tkzLabelPoint[below](C){$3$}

enter image description here

  • Wow! Very nice - I see that you are able to make the intersections without defining actual points?
    – Spacey
    May 17, 2013 at 17:30

Using PSTricks can be regarded as the best practice. The following code should be clear enough so the remaining is intentionally left as your homework.

enter image description here


  • Thanks ClickMe - I gravitated towards TikZ because I was introduced to it first, so why would you say that this PSTricks is better than TikZ? I would like to learn what advantages that might confer since I am new at this. Thanks! :-)
    – Spacey
    May 17, 2013 at 17:31
  • PSTricks supports 3D much much much much much better than PGF/TikZ does. I invested my time in PSTricks just because of this reason. :-) May 17, 2013 at 17:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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