2009-05-31 3 views
3

Hintergrund:Berechnung der Begrenzungspunkte für den Bereich einer „Tortenstück“ und „Unterbereiche“

ich vor kurzem wurde das Spiel mit GDI + eine „Disc“ ziehen einen weiten Farbwechsel um 360 Grad Anzeige . (Ich grub einige HSL in RGB-Code, um durch HSL (1,1,1) -> HSL (360,1,1))

Schleife zu durchlaufen Ich zog zuerst einen vollen Kreis mit dem oben genannten, und dann einen zweiten Kreis in Grau über der Mitte geben die folgende

alt text

Also das ist alles in Ordnung ... aber ich erkannte, dass GDI + isolierend uns von vielen der schwierigen Spiel, das hier vor sich geht mittels der FillPie Methode. Außerdem müssen Sie in FillPie ein Begrenzungsrechteck für den Kreis angeben, im Gegensatz zu einer Radiuslänge. Es macht auch eine vollständige Segmentfüllung und erlaubt Ihnen nicht, nur einen Teil dieses Segments anzugeben.

Frage:

Kann jemand mich in die Richtung einiger Mathematische Funktionen hinweisen oder eine Erklärung geben, auf welche forumla ich brauchen würde, um die Gegend & Plotpunkte der folgenden „Green Filled Area“ gegeben berechnen:

Point `c` - an x,y co-ordinate 
Angle `A` - an angle from horizontal 
Angle `B - an angle from horizontal where `B` - `A` == the sweep angle 
Length `r` - a distance from `c` 
Length `r2` - a distance from `c` where `r2` - `r` == the `height` of the segment to be filled. 

alt text

Links zu Math Quellen sind in Ordnung, aber ich habe einen schnellen google-& Blick hat bei Wolfram Math und konnte finden, wonach ich suchte. Wenn es eine Möglichkeit gäbe, eine Abfolge von Bounding (x, y) -Co-Oder zu generieren, die als Point[] an Graphics.FillPolygon übergeben werden könnte, wäre das auch cool.

Antwort

3

Der Bereich ist der Unterschied der äußeren und inneren Scheibenteile. Die Fläche eines Scheibenteils ist proportional zur Winkel Kröpfung:

area = (b-a)*((r+r2)^2-r^2)/2 

a und b müssen in Radiant ausgedrückt werden. Für b-a = 2*Pi, area = Pi*(r+r2)^2 - Pi*r^2 ist der Unterschied der Bereiche der äußeren und inneren Scheiben.

Sie können

x = cx + r * cos(t) / x = cx + (r+r2) * cos(t) 
y = cy + r * sin(t) / y = cy + (r+r2) * sin(t) 

mit Punkten auf der inneren/äußeren Kreis erzeugen Wo ta-b variiert.

+0

+1 eric Je kleiner das Inkrement von t zwischen A und B ist, desto besser ist die Auflösung Ihrer Punkte ... zB wenn A 30 * und B 45 * ist, dann werden die Inkremente zwischen dem A & B, dem besser die Auflösung Ihrer Kurve ... Niedrig Res = (30, 35, 40, 45) Hohe Res = (30, 30.5, 31, 31.5, ... 44.5, 45) –

+0

Ja, idealerweise sollte das Inkrement entsprechen einer Anzahl von Pixeln auf der äußeren cir cle. Die Bogenlänge zwischen Punkten auf dem äußeren Kreis ist (r + r2) * dt, wobei dt der Winkelzuwachs in Radianten ist. –

+0

+1. @Eoin, siehe http://hyperphysics.phy-astr.gsu.edu/hbase/vect.html für Vektorkonstruktions-/Operationsformeln, um zu sehen, wo Erics Formeln herkommen. –

0

Hoffe, das hilft. Der zweite Teil stellt ein Verfahren für den Bereich eines Sektors eines Kreisberechnungs

http://www.wikihow.com/Calculate-the-Area-of-a-Circle

+0

Cheers, es in Einheiten^2, die ich suche nicht so sehr die tatsächliche Fläche ist aber die Punkte, die diesen Bereich auf der Ebene definieren ... Ich habe das Frageobjekt aktualisiert, um dies zu reflektieren. Prost, gute Quelle. –

+0

Sollen wir annehmen, dass wir den Punkt c, die Winkel A und B und die Radien r1 und r2 kennen, und wollen Sie * die Schnittpunkte? z.B. der Punkt, der erzeugt wird, indem man den von A und r1 erzeugten Vektor zu c addiert (um einen inneren Punkt zu erhalten, dann Ar1 + Ar2 + c, um den äußeren Punkt auf dem gleichen Pfad zu erhalten ... dann dito für die B-Seite? –

+0

@ Jonathan. Yep Angenommen, c, A, B, r & r2 sind bekannte Eingaben für eine Formel, die ein Point [] - Array ausspuckt, das zum Zeichnen einer Linie verwendet werden könnte, die diesen Bereich bouddet –

0

Die Fläche eines Segments eines Kreises ist einfach der Winkel des Bogens (in Radiant) mal der Radius ist. So ist der Bereich des grünen Kreises offensichtlich:

0

Sie müssen Linien zeichnen (dieser Pseudo-Code):

for aa from A to B 
    set color to required color // you could use aa in an equation with HSL to get something like your sample 
    x1=r*cos(aa)+x 
    y1=r*sin(aa)+y 
    x2=r1*cos(aa)+x 
    y2=r1*sin(aa)+y 
    draw line between (x1,y1) and (x2,y2) 

für einen Klein genug Zuwachs in den Winkeln und kleine Radien genug, soll dies in Ordnung sein.

Die Punkte Sie suchen sind (x1, y1) und (x2, y2) für jeden Winkel aa

Verwandte Themen