본문 바로가기
::public/윈도우즈 응용 프로그래밍

Direct2D - 기하

by 해맑은욱 2019. 9. 26.

*기하

;그릴 대상 객체의 모양 정보. 정점들의 좌표값들과 면 구성 정보.

ID2D1Geometry를 상속한 인터페이스의 객체로 표현됨.

-단순한 기하(simple geometry)

-경로 기하(path geometry)

-복합 기하(composite geometry)

 

*기하의 생성

;장치 독립적인 자원. ID2D1Factory의 함수를 호출하여 생성.

CreateXxxGeometry 함수 사용. Xxx 는 Rectangle, Path 등.

 

*기하의 렌더링

;렌더타겟의 DrawGeometry 함수나 FillGeometry 함수를 호출.

virtual void ID2D1RenderTarget::DrawGeometry(
    _In_ ID2D1Geometry *geometry,
    _In_ ID2D1Brush *brush,
    FLOAT strokeWidth = 1.0f,
    _In_opt_ ID2D1StrokeStyle *strokeStyle = NULL 
);
 
virtual void ID2D1RenderTarget::FillGeometry(
    _In_ ID2D1Geometry *geometry,
    _In_ ID2D1Brush *brush,
    _In_opt_ ID2D1Brush *opacityBrush = NULL 
);
cs

 

*단순한 기하(simple geometry)

ID2D1RectangleGeometry: 사각형

ID2D1RoundedRectangleGeometry: 모서리가 둥근 사각형

ID2D1EllipseGeometry: 타원 또는 원

// RectangleGeometry
ID2D1RectangleGeometry* mp_rectangle_geometry = NULL;
hr = gp_factory->CreateRectangleGeometry(
    D2D1::RectF(50.0f, 50.0f, 150.0f, 150.0f), &mp_rectangle_geometry);
gp_render_target->DrawGeometry(mp_rectangle_geometry, mp_black_brush, 5);
 
// RoundedRectangleGeometry
ID2D1RoundedRectangleGeometry* mp_rounded_rectangle_geometry = NULL;
hr = gp_factory->CreateRoundedRectangleGeometry(
    D2D1::RoundedRect(D2D1::RectF(300.0f, 50.0f, 200.0f, 150.0f), 5.0f, 5.0f), &mp_rounded_rectangle_geometry);
gp_render_target->DrawGeometry(mp_rounded_rectangle_geometry, mp_black_brush, 5);
 
// EllipseGeometry
ID2D1EllipseGeometry* mp_ellipse_geometry = NULL;
hr = gp_factory->CreateEllipseGeometry(
    D2D1::Ellipse(D2D1::Point2F(450.0f, 100.0f), 100.0f, 50.0f), &mp_ellipse_geometry);
gp_render_target->DrawGeometry(mp_ellipse_geometry, mp_black_brush, 5);
cs

 

*획 스타일

;CreateStrokeStyle 함수 호출.

첫 번째 인자 D2D1_STROKE_STYLE_PROPERTIES 구조체.

D2D1::StrokeStyleProperties 함수 제공.

D2D1_STROKE_STYLE_PROPERTIES StrokeStyleProperties(
    D2D1_CAP_STYLE startCap     = D2D1_CAP_STYLE_FLAT,
    D2D1_CAP_STYLE endCap         = D2D1_CAP_STYLE_FLAT,
    D2D1_CAP_STYLE dashCap         = D2D1_CAP_STYLE_FLAT,
    D2D1_LINE_JOIN lineJoin     = D2D1_LINE_JOIN_MITER,
    FLOAT miterLimit             = 10.0f,
    D2D1_DASH_STYLE dashStyle     = D2D1_DASH_STYLE_SOLID,
    FLOAT dashOffset             = 0.0f
)
 
// D2D1_CAP_STYLE
FLAT: 라인의 끝점에서 끝남.
SQUARE 정사격형 절반이 라인의 끝점에서 더해짐.
ROUND: 원모양 반쪽이 라인의 끝점에 더해짐.
TRIANGLE: 직각 이등변 삼각형이 라인의 끝점에 더해짐.
 
// D2D1_LINE_JOIN_XXX
MITER: 뾰족하기 처리.
BEBEL: 각지게 처리.
ROUND: 둥글게 처리.
MITER_OR_BEVEL: 기본은 MITER로 그리되 뾰족한 부분은 BEVEL로 그림.
 
// D2D1_DASH_STYLE_XXX
SOLID: 끊어짐이 없는 실선.
DASH: (대시, 공백)의 연속.
DASH_DOT: (점, 공백)의 연속.
DASH_DOT_DOT: (대시, 공백, 점, 공백)의 연속.
CUSTOM: 점선 패턴을 직접 정의.
 
// 실선 타원 그리기.
D2D1_ELLIPSE ellipse0 = D2D1::Ellipse(D2D1::Point2F(100.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->DrawEllipse(ellipse0, m_pTextBrush, 3);
 
//
D2D1_STROKE_STYLE_PROPERTIES strokeStyleProperties = D2D1::StrokeStyleProperties(
    D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_TRIANGLE,
    D2D1_LINE_JOIN_MITER, 10.0f,
    D2D1_DASH_STYLE_DASH_DOT_DOT, 0.0f);
 
ID2D1StrokeStyle* mp_stroke_style = NULL;
gp_factory->CreateStrokeStyle(strokeStyleProperties, NULL0&mp_stroke_style);
 
// 점선 타원 그리기.
D2D1_ELLIPSE ellipse1 = D2D1::Ellipse(D2D1::Point2F(200.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->DrawEllipse(ellipse1, m_pTextBrush, 5.0f, mp_stroke_style);
 
// 점선 타원 그리기 후 색 채우기.
D2D1_ELLIPSE ellipse2 = D2D1::Ellipse(D2D1::Point2F(300.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->DrawEllipse(ellipse2, m_pTextBrush, 5.0f, mp_stroke_style);
gp_render_target->FillEllipse(ellipse2, m_pOriginalShapeBrush);
 
// 색 채우기 후 점선 타원 그리기.
D2D1_ELLIPSE ellipse3 = D2D1::Ellipse(D2D1::Point2F(400.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->FillEllipse(ellipse3, m_pOriginalShapeBrush);
gp_render_target->DrawEllipse(ellipse3, m_pTextBrush, 5.0f, mp_stroke_style);
cs

*경로 기하(path geometry)

;원호, 곡선, 직선 등의 조각들을 이어서 임의의 기하모양을 표현하는 기하 객체.

ID2D1PathGeometry 인터페이스 객체로 표현.

ID2D1Factory->CreatePathGeometry 함수를 호출하여 생성.

경로 기하 객체의 Open 함수를 호출하여 기하 싱크를 얻고 라인, 원호, 베이어 곡선, 이차 베지어 곡선의 기능을 제공.

 

-기하 싱크(geometry sink)

;경로 기하를 표현하는 객체.

1개 이상의 피겨(figure)로 구성. 피겨는 1개 이상의 조각(segment)로 구성.

ID2D1GeometrySink 인터페이스 객체로 표현. Open 함수를 호출하여 얻음.

-피겨 만들기

;BeginFigure() > ..AddLines, AddArc, AddBeziers, AddQuadraticBezier.. >EndFigure()

 

// 선분 조각들로 구성된 경로 기하를 생성.
ID2D1PathGeometry* mp_path_geometry = NULL;
gp_factory->CreatePathGeometry(&mp_path_geometry);
 
// 경로 기하에 조각들을 기록하기 위해서 기하 싱크를 얻음.
ID2D1GeometrySink* mp_sink = NULL;
mp_path_geometry->Open(&mp_sink);
 
// 피겨의 시작.(피겨의 시작점, 채우기 or 비우기)
mp_sink->BeginFigure(D2D1::Point2F(00), D2D1_FIGURE_BEGIN_FILLED);
// 조각 추가.
D2D1_POINT_2F points[3= { D2D1::Point2F(1000), D2D1::Point2F(200100), D2D1::Point2F(100100) };
mp_sink->AddLines(points, 3);
// 피겨의 끝.
mp_sink->EndFigure(D2D1_FIGURE_END_CLOSED);
mp_sink->Close();
 
// 렌더타겟에 경로 기하 그리기.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Translation(1010));
gp_render_target->DrawGeometry(mp_path_geometry, mp_black_brush, 2.f, 0);
cs

 

// 선분 조각들로 구성된 경로 기하를 생성.
ID2D1PathGeometry* mp_path_geometry = NULL;
gp_factory->CreatePathGeometry(&mp_path_geometry);
 
// 경로 기하에 조각들을 기록하기 위해서 기하 싱크를 얻음.
ID2D1GeometrySink* mp_sink = NULL;
mp_path_geometry1->Open(&mp_sink);
 
// 피켜 시작 -> 끝.
mp_sink->BeginFigure(D2D1::Point2F(1050), D2D1_FIGURE_BEGIN_FILLED);
mp_sink->AddBezier(D2D1::BezierSegment(D2D1::Point2F(1000), D2D1::Point2F(200200), D2D1::Point2F(300100)));
mp_sink->AddLine(D2D1::Point2F(400100));
mp_sink->AddArc(D2D1::ArcSegment(D2D1::Point2F(200100), D2D1::SizeF(5050), 30.f, D2D1_SWEEP_DIRECTION_COUNTER_CLOCKWISE, D2D1_ARC_SIZE_LARGE));
mp_sink->AddBezier(D2D1::BezierSegment(D2D1::Point2F(15050), D2D1::Point2F(100150), D2D1::Point2F(00)));
mp_sink->EndFigure(D2D1_FIGURE_END_CLOSED);
mp_sink->Close();
 
// 렌더겟에 경로 기하 그리기.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Translation(1010));
gp_render_target->DrawGeometry(mp_path_geometry, mp_black_brush, 2.f, 0);
cs

'::public > 윈도우즈 응용 프로그래밍' 카테고리의 다른 글

Direct2D - 비트맵(Bitmap)  (0) 2019.09.27
Direct2D - 붓(Brush)  (0) 2019.09.27
Direct2D - 변환  (0) 2019.09.26
Direct2D - 렌더타겟  (0) 2019.09.26
Direct2D - 그림파일 읽고 출력  (0) 2019.09.25