Calculando os pontos delimitadora para a área de um “segmento Pie” e “sub áreas”

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

  •  06-09-2019
  •  | 
  •  

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

text alt

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.

text alt

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.

Foi útil?

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

http://www.wikihow.com/Calculate-the -Área-de-um-Circle

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top