Как объединить пересекающиеся круги? - PullRequest
21 голосов
/ 16 декабря 2010

Я хочу визуально соединить два круга, которые перекрываются, так что

AltText

становится

alt text

У меня уже есть методы для неполных кругов, но теперь мне нужно знать, насколько велик угол перекрытия для круга earch, и я не знаю, как это сделать.

Кто-нибудь получил идею?

Ответы [ 3 ]

36 голосов
/ 16 декабря 2010

image

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

HTH!

Edit

For two different radii:

image

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

И ...

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

:)

8 голосов
/ 19 декабря 2010

Теперь это будет работать на 100% для вас, даже если это эллипс и любое количество цифр

    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

5 голосов
/ 16 декабря 2010

Нет времени, чтобы решить это прямо сейчас.Но я дам вам то, что вам нужно для работы:

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

На картинке в Википедии вы видите треугольник A, B, C.Пусть A - центр левого круга, B - центр правого круга.А AC - радиус левого круга, а BC - радиус правого круга.

alt text

Тогда точка C будет верхней точкой пересечения.Угол в A, α равен половине угла в левом круге. Угол в b, β равен половине угла в правом круге.Это именно те углы, которые вам нужны, верно?

Википедия объясняет далее: «Если известны длины всех трех сторон любого треугольника, можно рассчитать три угла».*

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

Удачи:)

...