좌표 변환
Project/Win32API로 던그리드 모작

좌표 변환

Woon2World :: Programming & Art Life

 

 

// xyutility.h
 
#ifndef _xyutility
#define _xyutility
#include <windows.h>
auto xytrans(const RECT& destrt, const RECT& srcrt, const POINT& pt)
{
    auto xdiff = pt.x - srcrt.left;
    auto ydiff = pt.y - srcrt.top;
 
    auto widthratio = (destrt.right - destrt.left) / static_cast<double>(srcrt.right - srcrt.left);
    auto heightratio = (destrt.bottom - destrt.top) / static_cast<double>(srcrt.bottom - srcrt.top);
 
    // windows.h의 POINT는 LONG을 통해 생성되고, LONG은 double로부터 형변환이 불가능하다
    xdiff *= widthratio;
    ydiff *= heightratio;
 
    return POINT{ destrt.left + xdiff, destrt.top + ydiff };
}
 
// ...
 
// ...
 
#endif
cs

 

 

원본 사각형 영역(srcrt)에 있는 점(pt)이 목적 사각형 영역(destrt)으로 옮겨갔을 때

영역 내에서의 상대적 위치가 변하지 않으려면 어떤 좌표(return)를 가져야 하는지 알아야 할 때 사용한다

 

srcrt 위의 점 pt와 상대적 위치가 동일한 destrt 위의 점을 반환한다

 

 

 

더보기

 

// xyutility.h
 
// ...
 
#include <random>
#include <iostream>
using namespace std;
random_device rd;
default_random_engine dre(rd());
uniform_int_distribution<> uid{ 01000 };
void testxytrans()
{
    for (int i = 0; i < 20++i)
    {
        POINT lt{ uid(dre), uid(dre) };
        POINT rb{ uid(dre), uid(dre) };
 
        for (; lt.x > rb.x; lt.x = uid(dre))
            ;
        for (; lt.y > rb.y; lt.y = uid(dre))
            ;
 
        decltype(uid) posuid_x{ lt.x, rb.x };
        decltype(uid) posuid_y{ lt.y, rb.y };
 
        POINT pos{ posuid_x(dre), posuid_y(dre) };
 
        POINT lt2{ uid(dre), uid(dre) };
        POINT rb2{ uid(dre), uid(dre) };
 
        for (; lt2.x > rb2.x; lt2.x = uid(dre))
            ;
        for (; lt2.y > rb2.y; lt2.y = uid(dre))
            ;
 
        POINT after_pos = xytrans(RECT{ lt2.x, lt2.y, rb2.x, rb2.y }, RECT{ lt.x, lt.y, rb.x, rb.y }, pos);
        cout << "destrect : { " << lt2.x << ", " << lt2.y << ", " << rb2.x << ", " << rb2.y << " } srcrect : { " << lt.x << ", " << lt.y << ", " << rb.x << ", " << rb.y << " }\n";
        cout << "from : (" << pos.x << ", " << pos.y << ") to : (" << after_pos.x << ", " << after_pos.y << ")\n";
    }
}
 
// ...
cs

 

 

 

테스트 결과

 

 

destrt와 srcrt 순으로 써놓고서

결과는 from, to로 써놓는 바람에 보기에 애먹었다

다음부턴 출력 순서도 제대로 고려하는 것으로..