2010-12-16 17 views
21

Chcę wizualnie połączyć dwa okręgi, które są nakładających się tak, żeJak dołączyć do nakładających się kręgów?

AltText

staje

alt text

mam już metody częściowych kręgach, ale teraz muszę wiedzieć, jak duża nakładający się kąt dla koła earch jest, i nie wiem jak to zrobić.

Ktoś ma pomysł?

+0

Hmmm dobry! Punkty przecięcia kół można znaleźć, jeśli znasz ich centra i promienie. Stamtąd powinieneś być w stanie określić nakładające się segmenty - czy mniejszy z dwóch segmentów na każdym okręgu utworzonym przez punkty przecięcia ... czy to pomaga? Nigdy nie próbowałem kodowania tego, ale mógłbym spróbować pseudokod może ... – FrustratedWithFormsDesigner

+0

Czy koła mają te same promienie? – Ishtar

+0

Kręgi czasami mogą mieć ten sam promień, ale generalnie nie. –

Odpowiedz

36

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

HTH!

Edit

dla dwóch różnych promieniach:

Upraszczając nieco:

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

Edit

Jeśli chcesz zobaczyć kąt z drugiego środka okręgu, wymień R1 przez R2 w ostatnim równaniu.

Oto próbka realizacja w 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

I ...

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

Dwa promienie niekoniecznie muszą być takie same. –

+0

@Ignacio Zobacz edytuj –

+0

Co z D? Jak mogę uzyskać D? Dlaczego pływa gdzieś w edytorze? –

5

Nie mam czasu, aby rozwiązać problem już teraz. Ale dam ci to, czego potrzebujesz, aby się dogadać:

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

Na zdjęciu można zobaczyć na wikipedii trójkąta A, B, C. Niech A będzie środkiem lewego koła, B środkiem prawego koła. A AC promień lewego koła i BC promień prawego koła.

alt text

Następnie punkt C będzie górny punkt przecięcia. Naroże w A, α, jest połową kąta w lewym okręgu. Naroże wb, β, połowa kąta w prawym okręgu. To są potrzebne kąty, prawda?

Wikipedia wyjaśnia dalej: "Jeśli znane są długości wszystkich trzech boków trójkąta, można obliczyć trzy kąty".

Pseudokod:

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 

Powodzenia :)

8

Teraz to będzie działać w 100% dla ciebie nawet postać jest elipsa i dowolną liczbę figur

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

Dziękuję za nie przeczytanie dokładnie tego pytania i komentarzy. Pracuję z OpenGL, NIE rysuję .net. –

Powiązane problemy