Вычисление граничных точек для площади «Сегмента круговой диаграммы» и «подобластей»
Вопрос
Фон:
Недавно я экспериментировал с GDI+, чтобы нарисовать «Диск», отображающий резкое изменение цвета на 360 градусов.(Я откопал код HSL для RGB, чтобы пройти через HSL(1,1,1) -> HSL(360,1,1))
Что касается диска, я сначала нарисовал полный сплошной круг, используя приведенное выше изображение, а затем второй круг серого цвета над центром, чтобы получить следующее:
Так что с этим все в порядке...но я понял, что 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.
Ссылки на источники по математике хороши, но я быстро погуглил, посмотрел 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
.
Другие советы
Надеюсь это поможет.Во второй части представлен метод расчета площади сектора круга.
Площадь сегмента круга — это просто угол дуги (в радианах), умноженный на радиус.Таким образом, площадь зеленого круга, очевидно, равна:
(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.