2014-10-15 3 views
2

현재 여러 개의 타원이 있습니다. 이것들은 중심점에 의해 정의되고, 두 벡터, 최소 축과 최대 축에 대해 정의됩니다.타원을 폴리 라인으로 변환

그러나이 프로그램을 만들려면 이러한 모양을 폴리 라인으로 처리 할 수 ​​있어야합니다. 내가 가지고있는 사용 가능한 데이터로부터 포인트 세트를 생성하는 공식이 있어야한다고 확신하지만, 어떻게해야하는지에 대해서는 확신 할 수 없다.

아무에게도이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

감사합니다.

+0

이것을 테셀레이션이라고합니다. 봐봐. 커브를 테셀레이션하려는 경우 가장 쉬운 방법은 곡선의 파라 메트릭 표현에서 시작하는 것입니다. 이것도보세요. –

+0

이 폴리선에 대한 요구 사항을 정의해야합니다. – MBo

+0

이것을 곡선 평탄화라고합니다. –

답변

5

는 각 angle에서 생략 부호의 중심에서 냄새가 나는데 방사형 선이있는 경우

을 (타원 축을 대표하는 두 벡터가 좌표축에 parllel있는 가정 하에서), 그 선은 점

에서 타원을 교차
x = x_half_axis * cos(angle); 
y = y_half_axis * sin(angle); 

여기에서 x_half_axisy_half_axis은 절반 축 벡터의 길이 (크기)와 비슷합니다.

그럼, 각도를 약간 작게 선택하십시오. delta. 해당 단계에서 전체 [0...2*Pi] 범위를 통해 중심점을 스윕하고 0 각도로 시작한 다음 delta 각도로 시작한 다음 2 * delta 각도로 시작합니다. 각 angle 값에 대해 타원 점의 좌표는 위의 수식에 의해 주어집니다. 그렇게하면 타원의 다각형 표현이 생성됩니다.

당신의 delta는 다음을 확인하십시오 "타원형 다각형"잘 닫을 수 있도록 신중하게 선택해야한다 비교적 큰 (타원에 몇 점) 인 경우 : 2*Pidelta 단계의 정수로 분할한다. 작은 delta 값을 입력해도 문제가되지 않습니다. 최소 - 최대 축 벡터 좌표축에 평행하지 않는 경우


하여 여전히 상기 방법을 사용하고 대응하는 회전 변환을 적용하여 적절한 최종 위치까지 얻어진 점을 변형 할 수있다.


고정 - 델타 각도 스테핑에는 몇 가지 단점이 있습니다. 그것은 타원의 miminum 축 (곡률이 더 작은 곳) 근처에 다각형 점의 더 밀집된 순서를 생성하고, 최대 축 (곡률이 더 큰 곳) 근처의 점들의 더 드문 드문 한 순서를 생성합니다. 이것은 실제로 바람직한 행동의 반대입니다. 더 높은 곡률의 영역에서 높은 점 밀도를 갖는 것이 좋습니다.

이것이 문제인 경우 variadic stepping을 사용하도록 알고리즘을 업데이트 할 수 있습니다. 각도 델타는 최대 축에 가까워짐에 따라 점진적으로 감소하고 최소 축에 접근함에 따라 증가해야합니다. (Xc,Yc)의 중심 축 벡터 (Xm,Ym), (XM,YM)를 (이 두 직교한다) 상기 수식에서 [0,2Pi]t

X = XM cos(t) + Xm sin(t) + Xc 
Y = YM cos(t) + Ym sin(t) + Yc 

이라고 가정

+0

그레이트, 나는 그것을 고마워 할 것이다! 간단히 말하면, half_axis에 대해서는 반축 벡터의 길이를 언급합니다. 그 점은 무엇을 의미합니까? 장축 또는 단축에서 가져온 것입니까? – djcmm476

+0

@ djcmm476 두 벡터의 크기입니다. 위의 두 점에서 정렬 원점에서 귀하의 elipsoid을 "그릴 것"입니다. 결과에 회전 행렬과 번역 행렬을 적용하면 올바른 값을 얻을 수 있으며 행렬의 구성 요소가 떨어지는 것을 확인할 수 있습니다. – IdeaHat

2

.

개요에 끝점을 효율적으로 배포하려면 재귀 적으로 적용되는 최대 편차 기준을 사용하는 것이 좋습니다. 범위 [t0,t2]에 해당하는 호를 그리려면 중간 점 값 t1=(t0+t2)/2을 시도하십시오. 해당 점이 P1P0P2 사이의 거리가 일정한 임계 값 (예 : 1 픽셀)보다 작 으면 P0P1 세그먼트로 호를 근사 할 수 있습니다. 그렇지 않으면 호 [t0,t1][t1,t2]에 대한 작업을 반복하십시오.

선주문 재귀를 사용하면 폴리 라인 정점을 차례대로 방출 할 수 있습니다.

+0

분명히 내 대답보다 낫다. 회전 및 전환 변환을 수식에 혼합하는 것이 지나치게 복잡해질 까봐 두려웠습니다. 그러나이 경우 실제로는 매우 훌륭하게 재생됩니다. – AnT

+0

@AndreyT : 예, 축 벡터를 알고 있으면 회전 행렬이 포함됩니다. –