c# - ¿Cómo unirse a círculos superpuestos?
math opengl (3)
Ahora esto funcionará al 100% para ti, incluso la figura es elipse y cualquier número de figuras
private void Form1_Paint(object sender, PaintEventArgs e)
{
Pen p = new Pen(Color.Red, 2);
Rectangle Fig1 = new Rectangle(50, 50, 100, 50); //dimensions of Fig1
Rectangle Fig2 = new Rectangle(100, 50, 100, 50); //dimensions of Fig2
. . .
DrawFigure(e.Graphics, p, Fig1);
DrawFigure(e.Graphics, p, Fig2);
. . .
//remember to call FillFigure after drawing all figures.
FillFigure(e.Graphics, p, Fig1);
FillFigure(e.Graphics, p, Fig2);
. . .
}
private void DrawFigure(Graphics g, Pen p, Rectangle r)
{
g.DrawEllipse(p, r.X, r.Y, r.Width, r.Height);
}
private void FillFigure(Graphics g, Pen p, Rectangle r)
{
g.FillEllipse(new SolidBrush(this.BackColor), r.X + p.Width, r.Y + p.Width, r.Width - 2 * +p.Width, r.Height - 2 * +p.Width); //Adjusting Color so that it will leave border and fill
}
Quiero unir visualmente dos círculos que se superponen para que
se convierte
Ya tengo métodos para círculos parciales, pero ahora necesito saber qué tan grande es el ángulo de superposición para el círculo de búsqueda, y no sé cómo hacerlo.
Alguien tiene una idea?
No tengo tiempo para resolverlo ahora mismo. Pero te daré lo que necesitas para resolverlo:
http://en.wikipedia.org/wiki/Triangle#The_sine.2C_cosine_and_tangent_rules
En la imagen en wikipedia, se ve el triángulo A, B, C. Deje A ser el centro del círculo izquierdo, B el centro del círculo derecho. Y AC el radio del círculo izquierdo y BC el radio del círculo derecho.
Entonces el punto C sería el punto de intersección superior. La esquina en A, α, es la mitad del ángulo en el círculo izquierdo. La esquina en b, β, la mitad del ángulo en el círculo derecho. Estos son los ángulos que necesitas, ¿no?
Wikipedia explica más adelante: "Si se conocen las longitudes de los tres lados de cualquier triángulo, se pueden calcular los tres ángulos".
Pseudocódigo:
a=radius_a
b=radius_b
c=b_x - a_x
alpha=arccos((b^2 + c^2 - a^2) / (2*b*c)) //from wikipedia
left_angle=2*alpha
Buena suerte :)
Phi= ArcTan[ Sqrt[4 * R^2 - d^2] /d ]
HTH!
Editar
Para dos radios diferentes:
Simplificando un poco:
Phi= ArcTan[Sqrt[-d^4 -(R1^2 - R2^2)^2 + 2*d^2*(R1^2 + R2^2)]/(d^2 +R1^2 -R2^2)]
Editar
Si quiere el ángulo visto desde el otro centro del círculo, simplemente cambie R1 por R2 en la última ecuación.
Aquí hay una implementación de muestra en Mathematica:
f[center1_, d_, R1_, R2_] := Module[{Phi, Theta},
Phi= ArcTan[Sqrt[-d^4-(R1^2-R2^2)^2 + 2*d^2*(R1^2 + R2^2)]/(d^2 +R1^2 -R2^2)]
Theta=ArcTan[Sqrt[-d^4-(R1^2-R2^2)^2 + 2*d^2*(R1^2 + R2^2)]/(d^2 -R1^2 +R2^2)]
{Circle[{center1, 0}, R1, {2 Pi - Phi, Phi}],
Circle[{d, 0}, R2, {Pi - Theta, -Pi + Theta}]}
];
Graphics[f[0, 1.5, 1, 1]]
Graphics[f[0, 1.5, 1, 3/4]]
Y...
ImageMultiply[
Binarize@FillingTransform[#],
ImageResize[Import@
"http://i305.photobucket.com/albums/nn235/greeneyedgirlox/blondebabybunny.jpg",
ImageDimensions@#]] &@
Rasterize@Graphics[f[0, 1.5, 1, 1], Background -> Black]
:)