Solución:
Dada la ecuación de un círculo y las ecuaciones de los puntos medios:
q = sqrt((x2-x1)^2 + (y2-y1)^2)
y3 = (y1+y2)/2
x3 = (x1+x2)/2
Una respuesta será:
x = x3 + sqrt(r^2-(q/2)^2)*(y1-y2)/q
y = y3 + sqrt(r^2-(q/2)^2)*(x2-x1)/q
El otro será:
x = x3 - sqrt(r^2-(q/2)^2)*(y1-y2)/q
y = y3 - sqrt(r^2-(q/2)^2)*(x2-x1)/q
Suponiendo que las variables para los puntos ya se han declarado, su código debería verse así:
double q = Math.Sqrt(Math.Pow((x2-x1),2) + Math.Pow((y2-y1),2));
double y3 = (y1+y2)/2;
double x3 = (x1+x2)/2;
double basex = Math.Sqrt(Math.Pow(r,2)-Math.Pow((q/2),2))*(y1-y2)/q; //calculate once
double basey = Math.Sqrt(Math.Pow(r,2)-Math.Pow((q/2),2))*(x2-x1)/q; //calculate once
double centerx1 = x3 + basex; //center x of circle 1
double centery1 = y3 + basey; //center y of circle 1
double centerx2 = x3 - basex; //center x of circle 2
double centery2 = y3 - basey; //center y of circle 2
fuente: http://mathforum.org/library/drmath/view/53027.html
C ª#:
private double CenterX(double x1,double y1, double x2, double y2,double radius)
{
double radsq = radius * radius;
double q = Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
double x3 = (x1 + x2) / 2;
return x3 + Math.Sqrt(radsq - ((q / 2) * (q / 2))) * ((y1 - y2) / q);
}
private double CenterY(double x1, double y1, double x2, double y2, double radius)
{
double radsq = radius * radius;
double q = Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
double y3 = (y1 + y2) / 2;
return y3 + Math.Sqrt(radsq - ((q / 2) * (q / 2))) * ((x2-x1) / q);
}
No siempre es posible encontrar un punto central único con dos puntos y un radio. De hecho, hay tres casos distintos:
Caso 1:
ocurre cuando el diámetro dado es menor que la distancia entre los puntos dados. En este caso no hay soluciones.
Caso 2:
ocurre cuando el diámetro dado es exactamente igual a la distancia entre dos puntos. En este caso hay una solución trivial de
Caso 3:
ocurre cuando el diámetro dado es mayor que la distancia entre los dos puntos. En este caso hay dos soluciones de las ecuaciones:
que puede encontrar soluciones, por ejemplo, en esta página:
dónde q
es la distancia entre los dos puntos y [x3, y3]
es el punto medio.
Aquí, en este Gist, estoy tratando de implementarlos en C, sin embargo, aún no he terminado. siéntete libre de continuar desde donde me queda.