Calcular los puntos delimitadores para el área de un "segmento circular" y "subáreas"
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
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.
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.
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.
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