c# math opengl circle opentk

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]

:)