// 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{ 0, 1000 };
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로 써놓는 바람에 보기에 애먹었다
다음부턴 출력 순서도 제대로 고려하는 것으로..
'Project > Win32API로 던그리드 모작' 카테고리의 다른 글
빌더 패턴 - 직사각형 만들기 (0) | 2021.08.18 |
---|---|
* passkey 패턴 : public 멤버 함수의 접근 권한 관리로 public 함수를 non-public 하게 (0) | 2021.08.18 |
c++식 랜덤값 얻기의 개선안 (0) | 2021.08.15 |
더블버퍼링 (0) | 2021.08.14 |
싱글톤 패턴 (0) | 2021.08.14 |