2010-12-16 4 views
21

私は視覚的に重複するサークルに参加するにはどうすればよいですか?

AltText

は、私はすでに部分的に円のための方法を持っていますが、今、私がどれだけ大きいかを知る必要があり

alt text

なるように重なっている二つの円を参加したいです渦巻き円のための重なり合う角度は、私はそれをする方法を知らない。

誰でもアイデアがありますか?

+0

任意の数うーん良いものです!中心と半径を知っていれば、円の交点を見つけることができます。そこから、重なり合うセグメントを見つけることができるはずです - 交点によって作成された各円の2つのセグメントのうちの小さいほうが助けになりますか?私はこれをコーディングしようとしたことはありませんが、おそらくいくつかの疑似コードを試すことができます... – FrustratedWithFormsDesigner

+0

円は同じ半径を持っていますか? – Ishtar

+0

サークルは時には同じラジオを持つことができますが、一般的にはそうではありません。 –

答えて

36

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

HTH!

編集

二つの異なる半径の場合:少しの簡素化

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

2つの半径は必ずしも同じではありません。 –

+0

@Ignacio編集を参照してください –

+0

Dとは何ですか? Dはどのように入手できますか?なぜそれが編集のどこかに浮かんでいますか? –

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、βは、右の円の角度の半分です。これらはあなたが必要とする角度ですよね?

さらに、「三角形の3辺の長さがすべてわかっていると、3つの角度を計算できます。

擬似コード:

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

+6

質問とコメントを注意深く読まないでいただきありがとうございます。私はOpenGLではなく、.netの図面を使って作業しています。 –

関連する問題