Calculer les points de délimitation de la zone d'un « segment Pie » et « sous-zones »

StackOverflow https://stackoverflow.com/questions/931807

  •  06-09-2019
  •  | 
  •  

Question

Historique :

J'ai récemment joué avec GDI + pour dessiner un « Disc » l'affichage d'un changement de couleur de balayage à 360 degrés. (Je déterré un certain HSL au code RGB en boucle par HSL (1,1,1) -> HSL (360,1,1))

En ce qui concerne le disque, j'ai traça un cercle complet à l'aide solide ci-dessus, puis un second cercle en gris sur le centre pour donner les éléments suivants

text alt

Alors tout cela est très bien ... mais j'ai réalisé que GDI + nous isolant de beaucoup du match difficile qui se passe ici par la méthode FillPie. En outre, FillPie vous oblige à fournir un rectangle de délimitation pour la tarte, par opposition à une longueur de rayon. Elle ne un segment complet et remplir doesnt vous permet de spécifier une partie de ce segment uniquement.

Question:

Quelqu'un peut-il me diriger dans la direction de certaines fonctions mathématiques ou donner des explications sur ce que je forumla besoin de calculer les points de la région et l'intrigue de ce qui suit « zone remplie vert » donné:

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.

text alt

Liens vers des sources mathématiques sont très bien mais j'ai eu un rapide Google et regarder Wolfram Math et pourrait trouver ce que je cherchais. De plus, s'il y avait un moyen de générer une séquence de délimitation (x, y) co-ou de qui pourrait être passé en Point[] à Graphics.FillPolygon, ce serait cool aussi.

Était-ce utile?

La solution

Cette région est la différence entre les parties de disque extérieure et intérieure. La superficie d'une partie du disque est proportionnel à l'angle de balayage:

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

a et b doivent être exprimés en radians. Pour b-a = 2*Pi, area = Pi*(r+r2)^2 - Pi*r^2 est la différence des surfaces des disques extérieurs et intérieurs.

Vous pouvez générer des points sur le cercle extérieur / intérieur en utilisant

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

t varie de a à b.

Autres conseils

Espérons que cela aide. La seconde partie fournit un procédé de calcul de la surface d'un secteur de cercle

http://www.wikihow.com/Calculate-the -Zone-of-a-cercle

L'aire d'un segment de cercle est simplement l'angle de l'arc (en radians) fois le rayon. Ainsi, la zone du cercle vert est évidemment:

(B-A) * r2

Vous devez tracer des lignes (ce code pseudo):

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)

pour une augmentation petite assez dans les angles, et les petits rayons assez, cela devrait être OK.

Les points que vous recherchez sont (x1, y1) et (x2, y2) pour chaque aa angle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top