"파이 세그먼트"및 "하위 영역"의 영역에 대한 경계점 계산
문제
배경:
나는 최근에 GDI+와 함께 360도를 통해 스윕 색상 변화를 표시하는 "디스크"를 그리기 위해 놀았습니다. (HSL을 RGB 코드로 파헤쳐 HSL (1,1,1) -> HSL (360,1,1))
디스크와 관련하여, 나는 먼저 위를 사용하여 전체 단단한 원을 그린 다음 중앙 위의 회색으로 두 번째 원을 그렸습니다.
그래서 이것은 모두 괜찮습니다 ... 그러나 나는 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.
수학 소스에 대한 링크는 괜찮지 만 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
.
다른 팁
도움이 되었기를 바랍니다. 두 번째 부분은 원의 섹터 영역을 계산하는 방법을 제공합니다.
원의 세그먼트 영역은 단순히 아크 (라디안)의 각도가 반경을 곱한 것입니다. 따라서 녹색 원의 영역은 분명히 다음과 같습니다.
(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)입니다.