2010-12-16 16 views
21

me quiero unir visualmente dos círculos que se superponen de manera que¿Cómo unirse a círculos superpuestos?

AltText

convierte

alt text

Ya tengo métodos para círculos parciales, pero ahora necesito saber cuán grande es el el ángulo superpuesto para el círculo de earch es, y no sé cómo hacer eso.

¿Alguien tiene una idea?

+0

Hmmm buena! Puedes encontrar los puntos de intersección de los círculos si conoces sus centros y radios. A partir de ahí, podrás descubrir los segmentos superpuestos: el más pequeño de los dos segmentos en cada círculo creado por los puntos de intersección ... ¿eso ayuda? Nunca he intentado codificar esto, pero podría intentar algún seudocódigo ... – FrustratedWithFormsDesigner

+0

¿Los círculos tienen los mismos radios? – Ishtar

+0

Los círculos ocasionalmente pueden tener el mismo radi pero en general no lo hacen. –

Respuesta

36

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 desea el ángulo visto desde el otro centro del círculo, simplemente cambie R1 por R2 en la última ecuación.

Aquí está un ejemplo de implementación 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]] 

alt text

Graphics[f[0, 1.5, 1, 3/4]] 

alt text

Y ...

ImageMultiply[ 
[email protected][#], 
ImageResize[[email protected] 
"http://i305.photobucket.com/albums/nn235/greeneyedgirlox/blondebabybunny.jpg", 
    [email protected]#]] &@ 
[email protected][f[0, 1.5, 1, 1], Background -> Black] 

alt text

:)

+2

Los dos radios no son necesariamente los mismos. –

+0

@Ignacio Ver edición –

+0

¿Qué pasa con D? ¿Cómo obtengo D? ¿Por qué está flotando en algún lugar de la edición? –

5

No tengo tiempo para resolverlo en este momento. Pero te voy a dar lo que tiene que trabajar hacia fuera:

http://en.wikipedia.org/wiki/Triangle#The_sine.2C_cosine_and_tangent_rules

En la imagen de Wikipedia que 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.

alt text

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 adicionalmente: '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 :)

8

Ahora bien, esto funciona al 100% para que incluso la cifra es elipse y cualquier número de cifras

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 
    } 

alt text

+6

Gracias por no leer la pregunta y los comentarios detenidamente. Estoy trabajando con OpenGL, NO dibujo .net. –