Как присоединиться к перекрывающимся кругам?
Я хочу визуально соединить два круга, которые перекрываются, чтобы
![AltText]()
становится
![alt text]()
У меня уже есть методы для частичных кругов, но теперь мне нужно знать, насколько большой угол перекрытия для круга earch, и я не знаю, как это сделать.
Кто-нибудь получил Идею?
Ответы
Ответ 1
![zMsoz.png]()
Phi= ArcTan[ Sqrt[4 * R^2 - d^2] /d ]
НТН!
Изменить
Для двух разных радиусов:
![1VxWW.png]()
Упрощение немного:
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]()
:)
Ответ 2
Теперь это будет работать на 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]()
Ответ 3
У меня нет времени на его решение прямо сейчас. Но я дам вам то, что вам нужно для его разработки:
http://en.wikipedia.org/wiki/Triangle#The_sine.2C_cosine_and_tangent_rules
На картинке в Википедии вы видите треугольник A, B, C. Пусть А - центр левого круга, В - центр правого круга. И 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
Удачи:)