# Placing points on circles defined by two points and radii

I would like to draw the following picture in tikz

All arcs are part of circles. I would like to specify the following information only : the coordinates of the points a and b, varying radii for the different circle portions, and fractions or percentages t to place purple and pink points along the circles at a specified fraction of the way between two previously defined points.

So for instance I would like to say that the big purple points on the right arc are 60% and 80% along the way from a to b, while the big purple points on the left arc are 40% and 70% along the way from a to b, while the pink points are midway on some circular arc joining pairs of previously defined big purple points.

If I could place some pink circles "harmoniously" in the center of the curved triangles ...

My main problem is the following : suppose I have two points a and b (given by cartesian coordinates) and a radius \rad : this specifies two circles passing through these points of given radius. How do I place a point on one of these circles that is t % along the way from a to b ?

An equivalent problem is the following : suppose I have a center point centerab and two points a and b, whose coordinates are expressed in cartesian coordinates : how do I find their polar coordinates relative to the point centerab ?

Do I have to use linear algebra (such matrix rotation, but also finding angles using arcsin), or can tikz provide me with a simple solution ?

The code below only finds the centers of such circles, but I don't know how to find the polar coordinates of a and b relative to this center, or how to place a point t percent along the way from a to b.

\documentclass[11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{calc, intersections}

\begin{document}

\begin{center}
\begin{tikzpicture}
\coordinate (b) at (5,8);
\coordinate (a) at (0,0);
\draw [fill=green] (a) circle (2pt);
\draw [fill=green] (b) circle (2pt);
\path [name path = acirc] (a) circle (\rad);
\path [name path = bcirc] (b) circle (\rad);
\path [name intersections={of=acirc and bcirc}];
\coordinate (centerab) at (intersection-1);
\draw (centerab) circle (2pt);
\end{tikzpicture}
\end{center}

\end{document}

• Maybe helpful package \usepackage{tkz-euclide}. – Bobyandbob May 2 '17 at 18:50
• The center of the circle is located on the perpendicular bisector to $\overbar{ab}$, or simply use the intersections tikzlibrary for the intersections of circles (paths only) of radius \rad centered at a and b. Use the [pos=.5] (for example) option for coordinates along a path. @Bobyandbob - Have they translated the tks-euclide manual into anything besides french yet? – John Kormylo May 2 '17 at 20:14
• @JohnKormylo . No, i only know the french version. – Bobyandbob May 2 '17 at 20:17

I think this is called bipolar coordinates.

Here is a naïve implementation

\documentclass[border=9,tikz]{standalone}

\begin{document}

\makeatletter
\tikzset{
cs/.cd,
F1/.store in=\tikz@cs@Fone,
F1={-1,0},
F2/.store in=\tikz@cs@Ftwo,
F2={1,0},
sigma/.store in=\tikz@cs@sigma,
sigma=180,
s/.store in=\tikz@cs@sigma,
tau/.store in=\tikz@cs@tau,
tau=0,
t/.store in=\tikz@cs@tau,
}

\tikzdeclarecoordinatesystem{bipolar}
{%
\tikzset{cs/.cd,#1}%
\tikz@scan@one@point\pgf@process(\tikz@cs@Fone)\pgfmathsetmacro\Fax{\pgf@x}\pgfmathsetmacro\Fay{\pgf@y}%
\tikz@scan@one@point\pgf@process(\tikz@cs@Ftwo)\pgfmathsetmacro\Fbx{\pgf@x}\pgfmathsetmacro\Fby{\pgf@y}%
\pgfmathsetmacro\Fmidx{(\Fax+\Fbx)/2}\pgfmathsetmacro\Fmidy{(\Fay+\Fby)/2}%
\pgfmathsetmacro\Funitx{(\Fbx-\Fax)/2}\pgfmathsetmacro\Funity{(\Fby-\Fay)/2}%
\pgfmathsetmacro\compou{(sinh(\tikz@cs@tau))/(cosh(\tikz@cs@tau)-cos(\tikz@cs@sigma))}%
\pgfmathsetmacro\compov{(sin(\tikz@cs@sigma))/(cosh(\tikz@cs@tau)-cos(\tikz@cs@sigma))}%
\pgfmathsetlength\pgf@x{\Fmidx+\compou*\Funitx-\compov*\Funity}%
\pgfmathsetlength\pgf@y{\Fmidy+\compou*\Funity+\compov*\Funitx}%
}

\tikz{
\fill[green]
(0,0)circle(.1)coordinate(a)
(8,3)circle(.1)coordinate(b);
\draw[purple]foreach\tau in{-2,-1.8,...,2}{
(bipolar cs:F1=a,F2=b,sigma=90,tau=\tau)circle(.1)
};
\draw[cyan]foreach\sigma in{10,20,...,350}{
(bipolar cs:F1=a,F2=b,sigma=\sigma,tau=1)circle(.1)
};
}

\end{document}


Here is another example

\tikz{
\fill[green]
(0,0)circle(.1)coordinate(a)
(8,3)circle(.1)coordinate(b);
\fill[purple]foreach\sigma in{30,40,...,330}{
foreach\tau in{-2,-1.8,...,2}{
(bipolar cs:F1=a,F2=b,sigma=\sigma,tau=\tau)circle(.1)
}
};
\draw[->](bipolar cs:F1=a,F2=b,sigma=340,tau=2)->+(1,2)node[above]{$\sigma$};
\draw[->](bipolar cs:F1=a,F2=b,sigma=340,tau=2)->+(2,-1)node[right]{$\tau$};
}