如何加入重叠的圆形?

21

我希望能够视觉上连接两个重叠的圆形,以便

AltText

变成

alt text

我已经有了部分圆的方法,但现在我需要知道每个圆的重叠角度有多大,而我不知道如何做到这一点。

有人有想法吗?


这些圆通常不具有相同的半径,但偶尔可能会相同。 - Cobra_Fast
1
使用起始角度和结束角度的半径和三角函数生成点的方程,然后解决问题。 - Ignacio Vazquez-Abrams
我的想法是将它们填充为与边框相同的颜色。 - Javed Akram
1
这只是反过来的余弦定理(http://en.wikipedia.org/wiki/Law_of_cosines)。你已经知道了三角形的所有边,因此可以得到你想要知道的角度。 - Dario
1
这个问题需要进一步澄清,让它更与软件相关。你所说的“joining circles”是什么意思?你是想在Region类中表示它们吗?为边缘定义一个Path?还是在Bitmap上绘制它们?就我而言,我不知道“joining circles”在C#方面意味着什么。除了“math”标签外,所有标签都代表什么意思? - Ran
显示剩余4条评论
3个回答

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

:)


2
这两个半径不一定相同。 - Ignacio Vazquez-Abrams
什么是D?我怎样获得D?为什么它在编辑器中漂浮着? - Cobra_Fast
@Cobra D 是圆心之间的距离。 - Dr. belisarius
@belisarius 出于好奇,你用什么工具制作这些图表? - Phrogz
2
@Phrogz 前两个是使用 Geometry Expressions 完成的,后三个是使用 Mathematica 完成的。代码也是 Mathematica 代码。 - Dr. belisarius

8
现在,即使图形是椭圆形或者有任意数量的图形,这个方法也会百分之百地适用于你。
    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


6
谢谢您不仔细阅读问题和评论。我正在使用OpenGL,而不是.net绘图。 - Cobra_Fast

5

暂时没时间解决,但我会给你需要的东西来解决它:

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

祝你好运 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接