2017-03-10 1 views
0

내가 형태컨테이너에서 각도 범위를 반복하는 관용구?

struct Point { int x, y; }; 
struct Line { 
    Point p1, p2; 
    double angle() const { return atan2(p2.y-p1.y, p2.x-p1.x); } 
}; 

에서 2D 라인의 데이터를 가정 그리고 간격 (-PI, PI]에 있어야하는 각도로 정렬이를 저장할.

내 문제 :이 컨테이너에서 범위를 반복하고 싶지만 간격의 끝을 감쌀 수 있습니다. 예 : "모든 각도 사이의 각도는 PI*3/4에서 -PI*3/4"입니다.

은 내가 해킹 수
std::multimap<double, Line> lm; 

//insert elements... 

auto begin = lm.lower_bound(PI*3/4); 
auto end = lm.upper_bound(-PI*3/4); 
for(auto & i = begin; i != end; ++i) { //infinite loop: end is before begin! 
    //do stuff with i 
} 

"원형으로 반복을 내가"기능에 ++i의 장소를 취할 : 나는 multimap 같은 표준 컨테이너를 사용하는 경우

는 단순히 평소 할 수없는, 명확히하기 위해 루프. 하지만 이것은 공통적 인 문제인 것처럼 보입니다. 그래서 이미 해결해야 할 기존 관용구가 있는지 궁금합니다.

+1

해결 (http://stackoverflow.com/a/1782262/7571258). – zett42

+0

@ zett42 분명히 유용합니다. 내가 기계를 가지고 돌아올 때 나는 이것을 시도 할 것이다. 감사! –

답변

1

원형 범위의 문제를 해결하기 위해 삼각법이 있습니다. 범위 - 그것의 단부 (예를 here) 정규화하고, 중간 각도 절반 각도

if range_end < range_start then 
    range_end = range_end + 2 * Pi 

half = (range_end - range_start)/2 
mid = (range_end + range_start)/2 
coshalf = Cos(half) 

지금 각도 범위의 중간 차분 반각 후 낮은 비교 얻는다. 코사인 [이 않음]에 의해 제안 된 것처럼 참고 propably 환상 반복자 필요 주기성 잠재적 문제 음수 값 등

if Cos(angle - mid) >= coshalf then 
    angle lies in range 
+0

저는'cos (angle-mid)'가 랩 어라운드 문제를 제거하는 방법을 정말 좋아합니다. 각 반복마다 cos()을 호출하여 성능에 약간의 우려가 있지만 프로파일 러의 설명을 볼 수 있습니다. 팁 고마워! –

관련 문제