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

alt text

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.

alt text

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.

È stato utile?

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

http://www.wikihow.com/Calculate-the -Area-di-un-Circle

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top