검색결과 리스트
글
Vector3.Angle을 사용, 하지만 각도가 90도 이내로만 나온다.(0~360도 사이의 값으로 각도를 구하고 싶다면 문제가 됨)
이에 대한 해결책은 아래와 같다
http://forum.unity3d.com/threads/31420-Left-Right-test-function
http://answers.unity3d.com/questions/18105/how-to-calculate-the-angle-between-two-vectors
public float ContAngle(Vector3 fwd, Vector3 targetDir) { float angle = Vector3.Angle(fwd, targetDir); if (AngleDir(fwd, targetDir, Vector3.up) == -1) { angle = 360.0f - angle; if( angle > 359.9999f ) angle -= 360.0f; return angle; } else return angle; } public int AngleDir( Vector3 fwd, Vector3 targetDir, Vector3 up) { Vector3 perp = Vector3.Cross(fwd, targetDir); float dir = Vector3.Dot(perp, up); if (dir > 0.0) return 1; else if (dir < 0.0) return -1; else return 0; }참고 사이트: http://blog.naver.com/sdragoon/150108963945
http://forum.unity3d.com/threads/31420-Left-Right-test-function
http://answers.unity3d.com/questions/18105/how-to-calculate-the-angle-between-two-vectors
설정
트랙백
댓글
글
Container<int> c;라는 컨테이너가 있을때
1963이라는 값을 가진것을 모두 지우고 싶다면
연속 메모리 컨테이너(vector, deque, string)의 경우에 가장 좋은 방법은 erase-remove 합성문이다.
erase( remove(c.begin(), c.end(), 1963), c.end()); // 컨테이너가 vector, string 혹은 deque일 때 특정한 값을 가진 요소를 없애는 // 가장 좋은 방법은 erase-remove 합성문을 사용하는 것이다.
이 방법은 양방향 반복자를 지원하는 list에도 통하지만, list의 경우엔 멤버함수인 remove가 더 효율적이다.
c.remove(1963); // 컨테이너가 list일 때에는 remove 멤버함수가 특정한 값을 가진 요소를 모두 없애는 데에 더 좋다.
c가 표준 연관 컨테이너일 때에는(set, multiset, map, multimap) remove라는 이름을 가진 어떤것도 소용이 없다.
멤버함수로는 remove가 없을뿐더러 remove를 사용하면 컨테이너에 값을 덮어써서 컨테이너가 변형된다.
연관컨테이너에서 특정한 값을 가진 요소를 지울땐 erase를 사용한다.
c.erase(1963); // 컨테이너가 표준 연관 컨테이너일 때에는 erase 멤버 함수가 특정한 값을 가진 요소를 // 모두 없애는 데에 가장 좋다.
이렇게 하면 삭제도 제대로되고 효율적이다.
여기서 특정한 값을 가진 요소를 모두 없애지 않고다음의 술어구문이 true를 반환하는 요소를 모두 없앤다고 할때
bool badValue(int x); // x가 "나쁘다"면 true를 반환합니다. c.erase( remove_if(c.begin(), c.end(), badValue), c.end()); // 컨테이너가 vector, string, deque일 때 badValue가 // true를 반환하는 요소를 모두 없애는 가장 좋은 방법입니다. c.remove_if(badValue); // 컨테이너가 list일 때 badValue가 true를 반환하는 요소를 // 모두 없애는 가장 좋은 방법입니다.
표준 연관 컨테이너의 경우(set, map 등) 이렇게 쉽게 문제가 해결되지는 않는다.
따라서 처음부터 끝까지 도는 루프를 넣어서 요소를 직접 검사해서 지워야 한다.
이 작업은 소스코드도 간단하다.
Container c; ... for(Container::iterator i = c.begin(); i != c.end(); /* 비어있음 */) // for 루프의3번째 부분이 비어있고 아래쪽에서 증가된다. { if(badValue(*i)) // i가 가리키는 값이 "나쁜값"이면 c.erase( i++ ); // 후위증가에 의해 i를 증가시킨다. else ++i; }
만약 vector, string, deque로 루프를 도는 중간에 erase를 해야 하는 상황이 생긴다면 이렇게 바꾸면 된다.
for(Container::iterator i = c.begin(); i!= c.end(); /* 비어있음 */) { ... ... ... if(badValue(*i) { i = c.erase(i); // erase의 반환값을 i에 저장해서 반복자의 유효성을 유지시킨다. } else { ++i; } }
이 글은 이펙티브 STL 책을 참고하여 작성하였으며, 만약 저작권적으로 문제가 된다면 댓글등으로 삭제요청하시면 삭제조치 하도록 하겠습니다.
설정
트랙백
댓글
글
http://sdmeter.tistory.com <= 여기 블로그는 따로 있습니다.
RECENT COMMENT