2010-12-16 3 views
21

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

AltText

становится

alt text

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

У кого-нибудь есть идея?

+0

Хммм хороший! Вы можете найти точки пересечения кругов, если вы знаете их центры и радиусы. Оттуда вы должны иметь возможность определить перекрывающиеся сегменты - меньший из двух сегментов на каждом круге, созданный точками пересечения ... это помогает? Я никогда не пробовал кодировать это, но я мог бы попробовать некоторые псевдокоды, возможно ... – FrustratedWithFormsDesigner 2010-12-16 18:10:01

+0

У кругов одинаковые радиусы? – Ishtar 2010-12-16 18:11:33

+0

Кружки изредка могут иметь одинаковый радиус, но обычно они этого не делают. – 2010-12-16 18:13:27

ответ

36

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

НТН!

Редактировать

Для двух различных радиусов:

Упрощая немного:

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

Редактировать

Если вы хотите, чтобы угол был обращен от другого центра окружности, просто замените R1 на R2 в последнем уравнении.

Вот пример реализации в 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[ 
[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

:)

5

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

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

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

alt text

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

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

псевдокод:

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 

Удачи :)

8

Теперь это будет работать на 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

Смежные вопросы