C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[45973] Re:트래커(Tracker) 형태를 만들고자 합니다. . .
열씸! [cappuccino] 1104 읽음    2006-08-02 10:44
1. Overlay 영상 위에 그리실때는 Wincontrol 형태로 작업하는게 부적합합니다.
    영상의 Render를 수행할 함수 안에서 Overlay Surface 위에 직접 그려주는 형태로 구현하면 되겠습니다만,
    일반적인 메시징을 타시기 힘드실테고, Draw쪽과 Mouse Event등 이것 저것을 직접 다시 구현해야 될겁니다.
    만약 카메라로 부터 얻어온 영상을 Window 위에 직접 그리시는 경우엔 상관이없겠지요.

2. 위의 문제와 상관없이, 획득한 영상을 직접 Window Control위에 그리신다면,
    배경 스크린 윈도우 위에 테두리나 내용을 반투명 처리하여 그려야 할 필요가 있을터이므로
    TGraphicControl 정도로 무난합니다.

3. 이 경우 트래커의 그립 부분과 그 외의 부분의 마우스 클릭을 판단하는 효과적인 방법은
    원의 경우, 원의 중심으로 부터 마우스 커서가 반지름 보다 가까운지 먼지 판단하는 것이고,
    (피타고라스의 정리)
    혹은, 원이든 다각형이든 모두 Polygon 으로 만들어 그린 다음 폴리곤의 내부가 클릭되었는지
    판단하는 방법이 되겠지요.

bool __fastcall isPointInPolygon(TPoint *Points, TPoint P, int N){
    TPoint P1, P2;
    bool Result = false;

    P1 = Points[0];
    P2 = Points[N - 1];

    for(int i = 1; i <= N; i++){
        Result ^= (((P.y >= P1.y) ^ (P.y >= P2.y)) && (P.x - P1.x < MulDiv(P2.x - P1.x, P.y - P1.y, P2.y - P1.y)));
        P2 = P1;
        P1 = Points[i % N];
    }
    return Result;
}

    이 함수를 쓰시면, TPoint의 배열(Points)과, 그 갯수(N)로 넘긴 폴리곤의 내부에 마우스 좌표(P)가
    있는지 판단할 수 있습니다.

4. 위와 같이 구현하였는데, 트래커를 그리는 과정에서 깜박인다. (물론 깜박이겠죠)
    그럴 경우엔 트래커를 올려 놓은 배경스크린 컨트롤의 DoubleBuffered = true; 로 설정하시면 OK.

+ -

관련 글 리스트
45971 트래커(Tracker) 형태를 만들고자 합니다. . . 외랑 1033 2006/08/02
45973     Re:트래커(Tracker) 형태를 만들고자 합니다. . . 열씸! 1104 2006/08/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.