블로그

  • 점과 직선/반직선/선분과의 거리

    [점과 직선/반직선/선분과의 거리]

    1. 정사영(투영) 벡터

    벡터A를 벡터B에 투영한 벡터[?]는 다음과 같이 표현됩니다.

    [?] = ( 벡터A를 벡터B에 투영한 길이 ) N 
    (N : B방향 단위벡터)
    벡터A를 벡터B에 투영한 길이는 내적을 이용하면 구할 수 있고….

    ( 벡터A를 벡터B에 투영한 길이 ) = |A|cos@ = A • B / |B|
    또, B방향 단위벡터는 N은 아래처럼 구해지니….

    N = B / |B|
    결국 벡터A를 벡터B에 투영한 벡터[?]를 다시 표현하면 아래와 같이 됩니다.

    [?] = (A•B/|B|) (B/|B|) = ((A • B)/(|B|*|B|)) B = ((A•B)/(B•B)) B

    2. 점과 직선과의 거리
    점과 직선의 수직거리는 점에서 직선에 내린 수선(벡터H)의 크기입니다.

    P : 거리를 알고 싶은 점
    Lorg : 직선상의 임의의 한점
    Ldir : 직선의 방향벡터이때 벡터H는 아래그림과 같이 구할수 있죠.


    Pprj : 벡터(P-Lorg)를 Ldir에 투영한 벡터
    Pprj는 벡터(P-Lorg)를 Ldir에 투영한 투영벡터입니다.
    저 위의 투영벡터 공식을 적용해보면…

    Pprj = (((P-Lorg)•Ldir)/(Ldir•Ldir)) Ldir
    최종적으로 벡터 H를 정리하면 다음과 같이 됩니다.

    H = (P-Lorg) – Pprj = (P-Lorg) – (((P-Lorg)•Ldir)/(Ldir•Ldir)) Ldir
    식은 길지만 따져보면 상당히 값싼 연산임을 알수 있습니다.
    무엇보다도 이 식의 최대 장점은 단위벡터가 필요없다는 것입니다.
    벡터를 정규화할 필요가 없으니 보기보다는 훨씬 값싼 연산이라 할수 있죠.

    3. 점과 반직선과의 거리


    P : 거리를 알고 싶은 점
    Lorg : 반직선의 시작점
    Ldir : 반직선의 방향벡터
    위 그림에서 보듯, 점이 반직선의 시작점보다 뒤쪽(Ldir방향기준)에 있을 경우에 점과 반직선의 거리는 그냥 |P-Lorg|로 구해집니다.

    4. 점과 선분과의 거리
    벡터A를 벡터B에 투영한 벡터Aprj는 벡터B에 스칼라 값 ((A • B)/(|B|*|B|))을 곱한 벡터입니다.
    따라서 계수가 되는 ((A • B)/(|B|*|B|)) 의 크기에 따라 아래와 같이 구분될 수 있습니다.

    이것을 이용하면 다음 그림과 같이 점(P)과 선분(S0,S1)의 거리를 구할수 있습니다.


    P : 거리를 알고 싶은 점
    S0,S1 : 선분을 이루는 두점
    V1 : S0에서 P를 향하는 벡터
    V2 : S0에서 S1을 향하는 벡터
    사실 점과 반직선의 거리는 위에서 세번째 경우를 두번째 경우로 대치시킨것 뿐입니다.

  • GDI+에서 PNG 이미지를 리소스에 등록 후 사용법

     

    http://bhnbhn.tistory.com/101

    // include
    #include <gdiplus.h>
    #pragma comment(lib, “gdiplus.lib”)
    using namespace Gdiplus;

    //con, init
    BGDIPlus::BGDIPlus(void)
    : m_gpToken(0), m_vaild(false)
    {
    GdiplusStartupInput gdiplusStartupInput;
    m_vaild = (GdiplusStartup(&m_gpToken, &gdiplusStartupInput, NULL) == Ok);
    }

    //dctor
    BGDIPlus::~BGDIPlus(void)
    {
    GdiplusShutdown(m_gpToken);
    }

    // 파일 로드
    :   
    Graphics graphics(pDC->m_hDC);
    :
    Image image(L”Target.png”);                             // 해당 디렉토리의 Target.png 화일을 불러옴.
    graphics.DrawImage(&image, 200, 200, image.GetWidth(), image.GetHeight());
    :

    //리소스 로드
    :
    Graphics graphics(hDC);
    :
    HRSRC hResource = FindResource(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_PNG1), TEXT(“PNG”));
    if(!hResource) return;

    DWORD imageSize = SizeofResource(AfxGetApp()->m_hInstance, hResource);
    HGLOBAL hGlobal = LoadResource(AfxGetApp()->m_hInstance, hResource);
    LPVOID pData = LockResource(hGlobal);

    HGLOBAL hBuffer = GlobalAlloc(GMEM_MOVEABLE, imageSize);
    LPVOID pBuffer = GlobalLock(hBuffer);

    CopyMemory(pBuffer,pData,imageSize);
    GlobalUnlock(hBuffer);

    IStream *pStream;
    HRESULT hr = CreateStreamOnHGlobal(hBuffer, TRUE, &pStream);

    Image imagePNG(pStream);

    pStream->Release();
    if (imagePNG.GetLastStatus() != Ok) return;

    graphics.DrawImage(&imagePNG, 500, 500, imagePNG.GetWidth(), imagePNG.GetHeight());

  • 2014년 목표

    가계부.

    65k

    30*12

    en 페이퍼 1장/week

    보드 바둥바둥

    수영 IM 200

    base