Вычисление ограничивающих точек для области «Сегмент пирога» и «Подзоны» - PullRequest
3 голосов
/ 31 мая 2009

Фон

Недавно я играл с 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

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

Ответы [ 4 ]

3 голосов
/ 31 мая 2009

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

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.

0 голосов
/ 31 мая 2009

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

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

0 голосов
/ 31 мая 2009

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

(B-A) * r2
0 голосов
/ 31 мая 2009

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

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

...