Calcolo dei punti di contorno per la zona di un “segmento Pie” e “aree sub”
Domanda
Sfondo :
Mi è stato recentemente giocando intorno con GDI + per disegnare un "disco" la visualizzazione di un cambiamento di colore ampio di 360 gradi. (Ho scavato un po 'HSL in codice RGB collegare attraverso HSL (1,1,1) -> HSL (360,1,1))
Per quanto riguarda il disco, ho richiamato un cerchio pieno completo utilizzando il sopra, e poi un secondo cerchio in grigio sopra il centro che invia il seguente
Quindi questo è tutto bene ... ma mi sono reso conto che GDI + di noi è isolante da un sacco di partita difficile che sta succedendo qui attraverso il metodo di FillPie
. Inoltre, FillPie
richiede di fornire un rettangolo di delimitazione per la torta al contrario di un lunghezza del raggio. Inoltre non un segmento completo riempimento e entrate consentono di specificare una parte di quel segmento unico.
Domanda:
Qualcuno mi può puntare nella direzione di alcune funzioni matematiche o dare alcuna spiegazione su quello che forumla avrei bisogno di calcolare i punti della seguente "zona piena verde" dell'area & trama dato:
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.
I link alle fonti per la matematica vanno bene ma ho avuto una rapida di Google & guardare Wolfram matematica e potrebbe trovare quello che stavo cercando. Inoltre, se ci fosse un modo per generare una sequenza di delimitazione (x, y) co-o di che potrebbe essere passato come Point[]
a Graphics.FillPolygon, che sarebbe troppo cool.
Soluzione
La zona è la differenza delle parti esterna ed interna del disco. L'area di una parte a disco è proporzionale alla scansione angolare:
area = (b-a)*((r+r2)^2-r^2)/2
a
e b
devono essere espressi in radianti.
Per b-a = 2*Pi
, area = Pi*(r+r2)^2 - Pi*r^2
è la differenza delle aree dei dischi esterni ed interni.
È possibile generare punti sul cerchio interno / esterno utilizzando
x = cx + r * cos(t) / x = cx + (r+r2) * cos(t)
y = cy + r * sin(t) / y = cy + (r+r2) * sin(t)
Dove t
varia da a
a b
.
Altri suggerimenti
Spero che questo aiuti. La seconda parte fornisce un metodo per calcolare l'area di un settore circolare
L'area di un segmento di un cerchio è semplicemente l'angolo dell'arco (in radianti) volte il raggio. Così l'area del cerchio verde è ovviamente:
(B-A) * r2
È necessario disegnare le linee (questo pseudo codice):
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)
per una piccola-abbastanza incremento negli angoli, e piccole-abbastanza raggi, questo dovrebbe essere OK.
I punti che stai cercando sono (x1, y1) e (x2, y2) per ogni aa angolo