문제

배경:

나는 최근에 GDI+와 함께 360도를 통해 스윕 색상 변화를 표시하는 "디스크"를 그리기 위해 놀았습니다. (HSL을 RGB 코드로 파헤쳐 HSL (1,1,1) -> HSL (360,1,1))

디스크와 관련하여, 나는 먼저 위를 사용하여 전체 단단한 원을 그린 다음 중앙 위의 회색으로 두 번째 원을 그렸습니다.

alt text

그래서 이것은 모두 괜찮습니다 ... 그러나 나는 GDI+가 우리를 FillPie 방법. 또한, FillPie 반경 길이와 달리 파이의 경계 사각형을 공급해야합니다. 또한 전체 세그먼트 채우기를 수행하며 해당 세그먼트의 일부만 지정할 수 없습니다.

의문:

누구든지 일부 수학 기능의 방향으로 나를 지적하거나 다음 "녹색 채워진 영역"의 영역 및 플롯 포인트를 계산 해야하는 Forumla에 대한 설명을 제공 할 수 있습니까?

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의 빠른 Google을 가지고 Wolfram Math를 살펴보고 내가 찾고있는 것을 찾을 수 있습니다. 또한, 일련의 경계 (X, y) co-or를 생성하는 방법이 있다면 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)

각도가 작고 작은 반경을 늘리면 괜찮을 것입니다.

당신이 찾고있는 포인트는 각 각도 AA에 대한 (x1, y1) 및 (x2, y2)입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top