Calculando os pontos delimitadora para a área de um “segmento Pie” e “sub áreas”
Pergunta
Fundo :
Recentemente eu estava brincando com GDI + para desenhar um "Disco" exibindo uma mudança de cor de varredura em 360 graus. (Eu desenterrar alguns HSL ao código RGB para percorrer HSL (1,1,1) -> HSL (360,1,1))
Em relação ao disco, que primeiro chamou a um círculo sólido completo utilizando o acima, e, em seguida, um segundo círculo em cinza sobre o centro para se obter o seguinte
Então, isso é tudo muito bem ... mas percebi que GDI + está nos isolante de um monte do jogo complicado que está acontecendo aqui por meio do método FillPie
. Além disso, FillPie
requer que você forneça um retângulo delimitador para a torta em oposição a um comprimento do raio. Ele também faz um preenchimento segmento completo e não permite que você especifique uma parte desse segmento somente.
Pergunta:
pode apontar ninguém me na direção de algumas funções matemáticas ou dar qualquer explicação sobre o que forumla eu precisaria calcular os pontos da área e enredo de seguir "Área Verde Cheio" o dado:
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.
Os links para fontes de matemática são bons, mas eu tive um google rápido & olhada Wolfram Math e poderia encontrar o que eu estava procurando. Além disso, se havia alguma maneira de gerar uma sequência de delimitadora (x, y) co-ou do que poderia ser passado como um Point[]
para Graphics.FillPolygon, que seria legal também.
Solução
A área é a diferença das peças de disco exteriores e interiores. A área de uma parte do disco é proporcional à varredura ângulo:
area = (b-a)*((r+r2)^2-r^2)/2
a
e b
deve ser expresso em radianos.
Para b-a = 2*Pi
, area = Pi*(r+r2)^2 - Pi*r^2
é a diferença das áreas dos discos externos e internos.
Você pode gerar pontos no círculo interno / externo usando
x = cx + r * cos(t) / x = cx + (r+r2) * cos(t)
y = cy + r * sin(t) / y = cy + (r+r2) * sin(t)
Onde t
varia de a
para b
.
Outras dicas
Espero que isso ajude. A segunda parte fornece um método para calcular a área de um sector de um círculo
A área de um segmento de um círculo é simplesmente o ângulo do arco (em radianos) vezes o raio. Assim, a área do círculo verde é obviamente:
(B-A) * r2
Você precisa desenhar linhas (este código 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)
para um incremento pequeno-suficiente nos ângulos e raios de pequena o suficiente, esta deve ser OK.
Os pontos que você está procurando são (x1, y1) e (x2, y2) para cada aa ângulo