public static double[] GetTangentPoints(
double px,
double py,
double cx,
double cy,
double radius)
{
var points = new double[4];
var dx = cx - px;
var dy = cy - py;
if (dx == 0 && dy == 0)
return null;
var pc2 = dx * dx + dy * dy;
var pc = Math.Sqrt(pc2);
if (pc < radius)
return null;
var r2 = pc2 - radius * radius;
var d = r2 / pc;
var h = Math.Sqrt(r2 - d * d);
points[0] = px + (dx * d - dy * h) / pc;
points[1] = py + (dy * d + dx * h) / pc;
points[2] = px + (dx * d + dy * h) / pc;
points[3] = py + (dy * d - dx * h) / pc;
return points;
}