Calcular los puntos delimitadores para el área de un "segmento circular" y "subáreas"

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

  •  06-09-2019
  •  | 
  •  

Pregunta

Fondo:

Recientemente estuve jugando con GDI+ para dibujar un "Disco" que muestra un cambio de color amplio en 360 grados.(Desenterré algo de código HSL a RGB para recorrer HSL (1,1,1) -> HSL (360,1,1))

Con respecto al disco, primero dibujé un círculo sólido completo usando lo anterior, y luego un segundo círculo en gris sobre el centro para dar lo siguiente

alt text

Entonces todo esto está bien...pero me di cuenta de que GDI+ nos está aislando de muchas de las complicadas coincidencias que están ocurriendo aquí a través de la FillPie método.También, FillPie requiere que proporcione un rectángulo delimitador para el pastel en lugar de una longitud de radio.También rellena un segmento completo y no le permite especificar solo una parte de ese segmento.

Pregunta:

¿Alguien puede indicarme algunas funciones matemáticas o darme alguna explicación sobre qué foro necesitaría para calcular el área y los puntos de trazado de la siguiente "Área rellena de verde" dada:

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

Los enlaces a fuentes de matemáticas están bien, pero busqué rápidamente en Google, miré Wolfram Math y pude encontrar lo que estaba buscando.Además, si hubiera alguna forma de generar una secuencia de co-or delimitadores (x,y) que pudieran pasarse como Point[] a Graphics.FillPolygon, eso también sería genial.

¿Fue útil?

Solución

El área es la diferencia entre las partes exterior e interior del disco.El área de una parte del disco es proporcional al ángulo de barrido:

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

a y b debe expresarse en radianes.Para b-a = 2*Pi, area = Pi*(r+r2)^2 - Pi*r^2 es la diferencia de las áreas de los discos exterior e interior.

Puede generar puntos en el círculo interior/exterior usando

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

Dónde t varía de a a b.

Otros consejos

Espero que esto ayude.La segunda parte proporciona un método para calcular el área de un sector de un círculo.

http://www.wikihow.com/Calcular-el-área-de-un-círculo

El área de un segmento de un círculo es simplemente el ángulo del arco (en radianes) multiplicado por el radio.Entonces el área del círculo verde es obviamente:

(B-A) * r2

Necesitas dibujar líneas (este pseudocódigo):

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)

para un incremento suficientemente pequeño en los ángulos y radios suficientemente pequeños, esto debería estar bien.

Los puntos que buscas son (x1,y1) y (x2,y2) para cada ángulo aa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top