How to join overlapping circles?

后端 未结 3 448
失恋的感觉
失恋的感觉 2021-02-02 11:18

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

\"AltText\"

becomes

相关标签:
3条回答
  • 2021-02-02 11:58

    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.

    alt text

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

    0 讨论(0)
  • 2021-02-02 11:59

    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]]
    

    alt text

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

    alt text

    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]
    

    alt text

    :)

    0 讨论(0)
  • 2021-02-02 12:05

    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 
        }
    

    alt text

    0 讨论(0)
提交回复
热议问题