Вычисление граничных точек для площади «Сегмента круговой диаграммы» и «подобластей»

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

  •  06-09-2019
  •  | 
  •  

Вопрос

Фон:

Недавно я экспериментировал с GDI+, чтобы нарисовать «Диск», отображающий резкое изменение цвета на 360 градусов.(Я откопал код HSL для RGB, чтобы пройти через HSL(1,1,1) -> HSL(360,1,1))

Что касается диска, я сначала нарисовал полный сплошной круг, используя приведенное выше изображение, а затем второй круг серого цвета над центром, чтобы получить следующее:

alt text

Так что с этим все в порядке...но я понял, что GDI+ изолирует нас от многих сложных ситуаций, происходящих здесь, посредством FillPie метод.Также, FillPie требует, чтобы вы указали ограничивающий прямоугольник для круговой диаграммы, а не длину радиуса.Он также выполняет полную заливку сегмента и не позволяет указать только часть этого сегмента.

Вопрос:

Может ли кто-нибудь указать мне направление некоторых математических функций или дать какое-либо объяснение того, на каком форуме мне понадобится вычислить площадь и точки графика следующей «Зеленой заполненной области»:

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

Ссылки на источники по математике хороши, но я быстро погуглил, посмотрел Wolfram Math и смог найти то, что искал.Кроме того, если бы существовал какой-то способ генерировать последовательность ограничивающих координат (x,y), которую можно было бы передать как Point[] в Graphics.FillPolygon, это тоже было бы круто.

Это было полезно?

Решение

Площадь – это разница внешней и внутренней частей диска.Площадь части диска пропорциональна углу стреловидности:

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

a и b должно быть выражено в радианах.Для b-a = 2*Pi, area = Pi*(r+r2)^2 - Pi*r^2 – это разница площадей внешнего и внутреннего дисков.

Вы можете генерировать точки на внутреннем/внешнем круге, используя

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

Где t варьируется от a к b.

Другие советы

Надеюсь это поможет.Во второй части представлен метод расчета площади сектора круга.

http://www.wikihow.com/Calculate-the-Area-of-a-Circle

Площадь сегмента круга — это просто угол дуги (в радианах), умноженный на радиус.Таким образом, площадь зеленого круга, очевидно, равна:

(B-A) * r2

Вам нужно нарисовать линии (это псевдокод):

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)

для достаточно небольшого приращения углов и достаточно малых радиусов все должно быть в порядке.

Точки, которые вы ищете: (x1,y1) и (x2,y2) для каждого угла aa.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top