;변환은 한 좌표 공간에서 정의된 위치를 동일 좌표 공간 또는 다른 좌표 공간에서의 위치로 매핑하는 기능을 수행함.
2차원 공간에서의 변환.
모든 좌표는 동차 좌표로 표현. 좌표(x, y)의 동차 좌표식 표현은 (x, y, 1)이다.
동차 좌표로 표현 한 점 v를 다른점 v'로 변환하는 경우. 선형 변환의 경우에는 변환이 행렬로 표현될 수 있음.
즉 v를 v'로 변환하는 식이 v' = vT 로 표현됨.
여기서 T와 같이 변환을 표현하는 행렬을 변환행렬이라고 함.
// Direct2D를 사용하기 위한 파일 포함.
#include <d2d1.h>
#pragma comment(lib, "D2D1.lib")
#include <wincodec.h>
#include <dwrite.h>
#pragma comment(lib, "Dwrite.lib")
using namespace D2D1;
// Direct2D를 구성하는 각종 객체를 생성하는 객체
ID2D1Factory* gp_factory;
// Direct2D에서 윈도우의 클라이언트 영역에 그림을 그릴 객체
ID2D1HwndRenderTarget* gp_render_target;
// Direct2D의 기본 render target에서 사용가능한 기본 비트맵 객체
ID2D1Bitmap* gp_bitmap;
// 읽어들인 PNG 이미지를 출력할 좌표를 저장할 변수 선언
D2D1_RECT_F g_image_rect;
// DWrite Factory 설정
IDWriteFactory* gp_write_factory;
// DWriteTextFormat 설정
IDWriteTextFormat* gp_text_format;
// WM_CREATE에서 실행.
void OnCreateRenderTarget(HWND hWnd)
{
RECT r;
GetClientRect(hWnd, &r);
// 지정한 윈도우의 클라이언트 영역에 그림을 그리기 위한 Render Target을 생성.
gp_factory->CreateHwndRenderTarget(RenderTargetProperties(),
HwndRenderTargetProperties(hWnd, SizeU(r.right, r.bottom)),
&gp_render_target);
// IDWriteFactory 생성.
DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&gp_write_factory));
// IDWriteTextFormat 생성.
gp_write_factory->CreateTextFormat(L"Verdana", NULL,
DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
13.0f, L"en-us", &gp_text_format);
}
// 이동 변환을 렌더타겟에 지정하고 그림.
void DrawAndTranslateARectangle()
{
// brush 객체 생성.
ID2D1SolidColorBrush *m_pOriginalShapeBrush, *m_pFillBrush, *m_pTextBrush, *m_pTransformedShapeBrush;
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pOriginalShapeBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), &m_pFillBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &m_pTextBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pTransformedShapeBrush);
ID2D1StrokeStyle* m_pStrokeStyleDash;
// 점선 획 스타일 객체를 생성함.
float dashes[] = { 10.0f, 2.0f };
gp_factory->CreateStrokeStyle(D2D1::StrokeStyleProperties(D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT, D2D1_LINE_JOIN_MITER, 10.0f, D2D1_DASH_STYLE_CUSTOM, 0.0f),
dashes,
ARRAYSIZE(dashes),
&m_pStrokeStyleDash
);
D2D1_RECT_F rectangle = D2D1::Rect(126.0f, 80.5f, 186.0f, 140.5f);
// 렌더타겟 변환을 항등 변환으로 리셋함. 사각형을 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
gp_render_target->DrawRectangle(rectangle, m_pOriginalShapeBrush, 1.0f, m_pStrokeStyleDash);
// 이동 변환을 렌더타겟에 지정하고 사각형을 채워 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Translation(20, 10));
gp_render_target->FillRectangle(rectangle, m_pFillBrush);
gp_render_target->DrawRectangle(rectangle, m_pTransformedShapeBrush);
// 캡션 텍스트를 표시함.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
static const WCHAR szText[] = L"Translate";
gp_render_target->DrawText(szText, ARRAYSIZE(szText) - 1, gp_text_format, D2D1::RectF(126.0f, 170.5f, 236.0f, 190.5f), m_pTextBrush);
}
// 회전 변환을 렌더타겟에 지정하고 그림.
void DrawAndRotateARectangle()
{
// brush 객체 생성.
ID2D1SolidColorBrush *m_pOriginalShapeBrush, *m_pFillBrush, *m_pTextBrush, *m_pTransformedShapeBrush;
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pOriginalShapeBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), &m_pFillBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &m_pTextBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pTransformedShapeBrush);
ID2D1StrokeStyle* m_pStrokeStyleDash;
// 점선 획 스타일 객체를 생성함.
float dashes[] = { 10.0f, 2.0f };
gp_factory->CreateStrokeStyle(D2D1::StrokeStyleProperties(D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT, D2D1_LINE_JOIN_MITER, 10.0f, D2D1_DASH_STYLE_CUSTOM, 0.0f),
dashes,
ARRAYSIZE(dashes),
&m_pStrokeStyleDash
);
D2D1_RECT_F rectangle = D2D1::Rect(438.0f, 301.5f, 498.0f, 361.5f);
// 렌더타겟 변환을 항등 변환으로 리셋함. 사각형을 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
gp_render_target->DrawRectangle(rectangle, m_pOriginalShapeBrush, 1.0f, m_pStrokeStyleDash);
// 회전 변환을 렌더타겟에 지정하고 사각형을 채워 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Rotation(45.0f, D2D1::Point2F(468.0f, 331.5f)));
gp_render_target->FillRectangle(rectangle, m_pFillBrush);
gp_render_target->DrawRectangle(rectangle, m_pTransformedShapeBrush);
// 캡션 텍스트를 표시함.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
static const WCHAR szText[] = L"Rotate";
gp_render_target->DrawText(szText, ARRAYSIZE(szText) - 1, gp_text_format, D2D1::RectF(438.0f, 391.5f, 498.0f, 411.5f), m_pTextBrush);
}
// 크기조정 변환을 생성해서 렌더타겟에 지정하고 그림.
void DrawAndScaleARectangle()
{
// brush 객체 생성.
ID2D1SolidColorBrush *m_pOriginalShapeBrush, *m_pFillBrush, *m_pTextBrush, *m_pTransformedShapeBrush;
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pOriginalShapeBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), &m_pFillBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &m_pTextBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pTransformedShapeBrush);
ID2D1StrokeStyle* m_pStrokeStyleDash;
// 점선 획 스타일 객체를 생성함.
float dashes[] = { 10.0f, 2.0f };
gp_factory->CreateStrokeStyle(D2D1::StrokeStyleProperties(D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT, D2D1_LINE_JOIN_MITER, 10.0f, D2D1_DASH_STYLE_CUSTOM, 0.0f),
dashes,
ARRAYSIZE(dashes),
&m_pStrokeStyleDash
);
D2D1_RECT_F rectangle = D2D1::Rect(438.0f, 80.5f, 498.0f, 140.5f);
// 렌더타겟 변환을 항등 변환으로 리셋함. 사각형을 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
gp_render_target->DrawRectangle(rectangle, m_pOriginalShapeBrush, 1.0f, m_pStrokeStyleDash);
// 크기조정 변환을 렌더타겟에 지정하고 사각형을 채워 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Scale(D2D1::Size(1.3f, 1.3f), D2D1::Point2F(438.0f, 80.5f)));
gp_render_target->FillRectangle(rectangle, m_pFillBrush);
gp_render_target->DrawRectangle(rectangle, m_pTransformedShapeBrush);
// 텍스트를 표시함.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
static const WCHAR szText[] = L"Scale";
gp_render_target->DrawText(szText, ARRAYSIZE(szText) - 1, gp_text_format, D2D1::RectF(438.0f, 170.5f, 498.0f, 190.5f), m_pTextBrush);
}
// 기울임 변환을 생성해서 렌더타겟에 지정하고 그림.
void DrawAndSkewARectangle()
{
// brush 객체 생성.
ID2D1SolidColorBrush *m_pOriginalShapeBrush, *m_pFillBrush, *m_pTextBrush, *m_pTransformedShapeBrush;
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pOriginalShapeBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), &m_pFillBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &m_pTextBrush);
gp_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::DarkBlue), &m_pTransformedShapeBrush);
ID2D1StrokeStyle* m_pStrokeStyleDash;
// 점선 획 스타일 객체를 생성함.
float dashes[] = { 10.0f, 2.0f };
gp_factory->CreateStrokeStyle(D2D1::StrokeStyleProperties(D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT, D2D1_LINE_JOIN_MITER, 10.0f, D2D1_DASH_STYLE_CUSTOM, 0.0f),
dashes,
ARRAYSIZE(dashes),
&m_pStrokeStyleDash
);
D2D1_RECT_F rectangle = D2D1::Rect(126.0f, 301.5f, 186.0f, 361.5f);
// 렌더타겟 변환을 항등 변환으로 리셋함. 사각형을 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
gp_render_target->DrawRectangle(rectangle, m_pOriginalShapeBrush, 1.0f, m_pStrokeStyleDash);
// 기울임 변환을 렌더타겟에 지정하고 사각형을 채워 그림.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Skew(45.0f, 0.0f, D2D1::Point2F(126.0f, 301.5f)));
gp_render_target->FillRectangle(rectangle, m_pFillBrush);
gp_render_target->DrawRectangle(rectangle, m_pTransformedShapeBrush);
// 캡션 텍스트를 표시함.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Identity());
static const WCHAR szText[] = L"Skew";
gp_render_target->DrawText(szText, ARRAYSIZE(szText) - 1, gp_text_format, D2D1::RectF(126.0f, 391.5f, 186.0f, 411.5f), m_pTextBrush);
}
void OnPaintRenderTarget()
{
// Direct2D의 Render Target을 사용해서 그림 그리기를 시작.
gp_render_target->BeginDraw();
// 이미지가 정상적으로 읽혀져 생성되어 있다면 DrawBitmap 함수를 사용하여
// 화면에 gp_bitmap에 저장된 이미지를 출력.
if (gp_bitmap != NULL)
{
//gp_render_target->DrawBitmap(gp_bitmap, &g_image_rect);
}
else
{
// 이미지를 읽지 못했다면 화면이 검은색으로 출력되기 때문에 Clear 함수를
// 사용하여 윈도우 전체 영역을 하늘색으로 채운다.
//gp_render_target->Clear(ColorF(0.0f, 0.8f, 1.0f));
gp_render_target->Clear(D2D1::ColorF(D2D1::ColorF::White));
}
DrawAndTranslateARectangle();
DrawAndRotateARectangle();
DrawAndScaleARectangle();
DrawAndSkewARectangle();
// Render Target을 사용해서 그림 그리기를 중지.
gp_render_target->EndDraw();
}
|
cs |
'::public > 윈도우즈 응용 프로그래밍' 카테고리의 다른 글
Direct2D - 붓(Brush) (0) | 2019.09.27 |
---|---|
Direct2D - 기하 (0) | 2019.09.26 |
Direct2D - 렌더타겟 (0) | 2019.09.26 |
Direct2D - 그림파일 읽고 출력 (0) | 2019.09.25 |
Direct2D - 오목 만들기 (0) | 2019.09.25 |