Q:

Соединить две окружности. В чём ошибка?

Пытаюсь повторить полигон, тот что изображен зеленой линией на рисунке ниже. Пользовался этими советами:
Совет первый
Совет второй
Оба дают результат с некоторым смещением вдоль окружностей.
Помогите, пожалуйста, в чем моя ошибка. 
Jsfiddle проект 
Писал на JS, но подойдёт любое другое решение.
Даже без кода, в чистой теории, в чем неверен мой подход.

//

A:

Поскольку нужны только внешние касательные (могут быть ещё внутренние), то подход может быть не слишком сложным:
Пусть центр большей окружности CR, меньшей cr. Вектор разности d, его длина и нормализованный вектор:
 d = cr - CR
 dlen = length(d)
 ud = d / dlen

Общие касательные к окружностям разного радиуса пересекаются где-то в точке OP. Касательная вместе с радиусами к точкам касания образует два подобных прямоугольных треугольника (поскольку радиус перпендикулярен касательной). Из подобия следует
Coeff = R / (R - r)
OP = CR + d * Coeff

Синус и косинус угла A этого треугольника  
ca = R / (dlen * Coeff)
sa = Sqrt(1-ca*ca)

Точки касания большой окружности могут быть получена поворотом вектора ud*R на A и -A
P.x = CR.x + ca * R * ud.x + sa * R * ud.y
P.y = CR.y - sa * R * ud.x + ca * R * ud.y
Q.x = CR.x + ca * R * ud.x - sa * R * ud.y
Q.y = CR.y + sa * R * ud.x + ca * R * ud.y

Аналогично для малой окружности с использованием её центра и радиуса. 
Тест:

fiddle:  (подправил последовательность точек и знаки углов)
let c1 = this.state.circles[0];
let c2 = this.state.circles[1];

let l = getVectorLen(c1,c2);

let v = {x: c2.x-c1.x, y: c2.y-c1.y};
let uv = {x: v.x / l, y: v.y / l};

let ca = (c2.r - c1.r) / l;
let sa = Math.sqrt(1 - ca*ca);

let ps = [

    c1.x - ca * c1.r * uv.x - sa * c1.r * uv.y, 
    c1.y + sa * c1.r * uv.x - ca * c1.r * uv.y,
    c1.x - ca * c1.r * uv.x + sa * c1.r * uv.y,
    c1.y - sa * c1.r * uv.x - ca * c1.r * uv.y,

    c2.x - ca * c2.r * uv.x + sa * c2.r * uv.y,
    c2.y - sa * c2.r * uv.x - ca * c2.r * uv.y, 
    c2.x - ca * c2.r * uv.x - sa * c2.r * uv.y, 
    c2.y + sa * c2.r * uv.x - ca * c2.r * uv.y 
];

