How to join overlapping circles?

2019-03-11 04:15发布

问题:

I want to visually join two circles that are overlapping so that

becomes

I already have methods for partial circles, but now I need to know how large the overlapping angle for earch circle is, and I don't know how to do that.

Anyone got an Idea?

回答1:

Phi= ArcTan[ Sqrt[4 * R^2 - d^2] /d ]

HTH!

Edit

For two different radii:

Simplifying a little:

Phi= ArcTan[Sqrt[-d^4 -(R1^2 - R2^2)^2 + 2*d^2*(R1^2 + R2^2)]/(d^2 +R1^2 -R2^2)]

Edit

If you want the angle viewed from the other circle center, just exchange R1 by R2 in the last equation.

Here is a sample implementation in 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]]  

And...

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]

:)



回答2:

Now this will work 100% for you even the figure is ellipse and any number of figures

    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 
    }



回答3:

Don't have the time to solve it right now. But I'll give you what you need to work it out:

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

In the picture on wikipedia you see the triangle A,B,C. Let A be the center of the left circle, B the center of the right circle. And AC the radius of the left circle and BC the radius of the right circle.

Then point C would be the top intersection point. The corner in A, α, is half the angle in the left circle.The corner in b, β, half the angle in the right circle. These are the angles you need, right?

Wikipedia explains further: 'If the lengths of all three sides of any triangle are known the three angles can be calculated.'

Pseudocode:

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

Good luck :)