기하 도형 개요
이 개요에서는 ID2D1Geometry 개체를 만들고 사용하여 2D 그림을 정의하고 조작하는 방법을 설명합니다. 이 항목에는 다음과 같은 섹션이 포함됩니다.
Direct2D 기하 도형이란?
Direct2D 기하 도형은 ID2D1Geometry 개체입니다. 이 개체는 간단한 기하 도형(ID2D1RectangleGeometry, ID2D1RoundedRectangleGeometry 또는 ID2D1EllipseGeometry), 경로 기하 도형(ID2D1PathGeometry) 또는 복합 기하 도형(ID2D1GeometryGroup 및 ID2D1TransformedGeometry)일 수 있습니다.
Direct2D 기하 도형을 사용하면 2차원 그림을 설명하고 적중 테스트 영역, 클립 영역 및 애니메이션 경로 정의와 같은 많은 용도를 제공할 수 있습니다.
Direct2D 기하 도형은 ID2D1Factory에서 만든 변경할 수 없는 디바이스 독립적 리소스입니다. 일반적으로 기하 도형을 한 번 만들고 애플리케이션의 수명 동안 또는 변경해야 할 때까지 유지해야 합니다. 디바이스 독립적 리소스 및 디바이스 종속 리소스에 대한 자세한 내용은 리소스 개요를 참조하세요.
다음 섹션에서는 다양한 종류의 기하 도형에 대해 설명합니다.
단순 기하 도형
간단한 기하 도형에는 ID2D1RectangleGeometry, ID2D1RoundedRectangleGeometry 및 ID2D1EllipseGeometry 개체가 포함되며 사각형, 둥근 사각형, 원 및 타원과 같은 기본 기하학적 그림을 만드는 데 사용할 수 있습니다.
간단한 기하 도형을 만들려면 ID2D1Factory::Create<geometryType>Geometry 메서드 중 하나를 사용합니다. 이러한 메서드는 지정된 형식의 개체를 만듭니다. 예를 들어 사각형을 만들려면 ID2D1RectangleGeometry 개체를 반환하는 ID2D1Factory::CreateRectangleGeometry를 호출합니다. 둥근 사각형을 만들려면 ID2D1RoundedRectangleGeometry 개체를 반환하는 ID2D1Factory::CreateRoundedRectangleGeometry를 호출합니다.
다음 코드 예제에서는 CreateEllipseGeometry 메서드를 호출하여 중심 이 (100, 100), x-반경 을 100으로, y-반지름 이 50으로 설정된 타원 구조를 전달합니다. 그런 다음 , DrawGeometry를 호출하여 반환된 타원 기하 도형, 검은색 ID2D1SolidColorBrush에 대한 포인터 및 5의 스트로크 너비를 전달합니다. 다음 그림에서는 코드 예제의 출력을 보여 줍니다.
ID2D1EllipseGeometry *m_pEllipseGeometry;
if (SUCCEEDED(hr))
{
hr = m_pD2DFactory->CreateEllipseGeometry(
D2D1::Ellipse(D2D1::Point2F(100.f, 60.f), 100.f, 50.f),
&m_pEllipseGeometry
);
}
m_pRenderTarget->DrawGeometry(m_pEllipseGeometry, m_pBlackBrush, 5);
기하 도형의 윤곽선을 그리려면 DrawGeometry 메서드를 사용합니다. 내부를 그리려면 FillGeometry 메서드를 사용합니다.
경로 기하 도형
경로 기하 도형은 ID2D1PathGeometry 인터페이스로 표시됩니다. 이러한 개체는 호, 곡선 및 선과 같은 세그먼트로 구성된 복잡한 기하학적 그림을 설명하는 데 사용할 수 있습니다. 다음 그림에서는 경로 기하 도형을 사용하여 만든 드로잉을 보여 줍니다.
자세한 내용과 예제는 경로 기하 도형 개요를 참조하세요.
복합 기하 도형
복합 기하 도형은 다른 기하 도형 개체 또는 변환과 그룹화되거나 결합된 기하 도형입니다. 복합 기하 도형에는 ID2D1TransformedGeometry 및 ID2D1GeometryGroup 개체가 포함됩니다.
기하 도형 그룹
기하 도형 그룹은 여러 기하 도형을 동시에 그룹화하여 여러 고유 기하 도형의 모든 피규어를 하나로 연결할 수 있는 편리한 방법입니다. ID2D1GeometryGroup 개체를 만들려면 ID2D1Factory 개체에서 CreateGeometryGroup 메서드를 호출하여 D2D1_FILL_MODE_ALTERNATE(대체) 및 D2D1_FILL_MODE_WINDING 가능한 값으로 fillMode를 전달하고, 기하 도형 그룹에 추가할 기하 도형 개체의 배열 및 이 배열의 요소 수를 전달합니다.
다음 코드 예제에서는 먼저 기하 도형 개체의 배열을 선언합니다. 이러한 개체는 반지름이 25, 50, 75 및 100인 4개의 동심원입니다. 그런 다음 ID2D1Factory 개체에서 CreateGeometryGroup을 호출하여 D2D1_FILL_MODE_ALTERNATE, 기하 도형 그룹에 추가할 geometry 개체의 배열 및 이 배열의 요소 수를 전달합니다.
ID2D1Geometry *ppGeometries[] =
{
m_pEllipseGeometry1,
m_pEllipseGeometry2,
m_pEllipseGeometry3,
m_pEllipseGeometry4
};
hr = m_pD2DFactory->CreateGeometryGroup(
D2D1_FILL_MODE_ALTERNATE,
ppGeometries,
ARRAYSIZE(ppGeometries),
&m_pGeoGroup_AlternateFill
);
if (SUCCEEDED(hr))
{
hr = m_pD2DFactory->CreateGeometryGroup(
D2D1_FILL_MODE_WINDING,
ppGeometries,
ARRAYSIZE(ppGeometries),
&m_pGeoGroup_WindingFill
);
}
다음 그림에서는 예제에서 두 그룹 기하 도형을 렌더링한 결과를 보여 줍니다.
변형된 기하 도형
기하 도형을 변환하는 방법에는 여러 가지가 있습니다. 렌더링 대상의 SetTransform 메서드를 사용하여 렌더링 대상이 그리는 모든 항목을 변환하거나 CreateTransformedGeometry 메서드를 사용하여 ID2D1TransformedGeometry를 만들어 변형을 기하 도형과 직접 연결할 수 있습니다.
사용해야 하는 메서드는 원하는 효과에 따라 달라집니다. 렌더링 대상을 사용하여 기하 도형을 변환한 다음 렌더링하는 경우 변환은 적용한 스트로크의 너비를 포함하여 기하 도형에 대한 모든 것에 영향을 줍니다. 반면 에 ID2D1TransformedGeometry를 사용하는 경우 변환은 셰이프를 설명하는 좌표에만 영향을 줍니다. 기하 도형을 그릴 때 변환은 스트로크 두께에 영향을 미치지 않습니다.
참고
Windows 8 세계 변환부터는 D2D1_STROKE_TRANSFORM_TYPE_FIXED또는 D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE 스트로크의 스트로크 두께에 영향을 미치지 않습니다. 이러한 변환 형식을 사용하여 독립적인 스트로크 변환을 달성해야 합니다.
다음 예제에서는 ID2D1RectangleGeometry를 만든 다음 변환하지 않고 그립니다. 다음 그림에 표시된 출력을 생성합니다.
hr = m_pD2DFactory->CreateRectangleGeometry(
D2D1::RectF(150.f, 150.f, 200.f, 200.f),
&m_pRectangleGeometry
);
// Draw the untransformed rectangle geometry.
m_pRenderTarget->DrawGeometry(m_pRectangleGeometry, m_pBlackBrush, 1);
다음 예제에서는 렌더링 대상을 사용하여 기하 도형의 크기를 3으로 조정한 다음 그립니다. 다음 그림에서는 변환 없이 및 변환을 사용하여 사각형을 그린 결과를 보여 줍니다. 스트로크 두께가 1이더라도 변환 후 스트로크가 더 두껍습니다.
// Transform the render target, then draw the rectangle geometry again.
m_pRenderTarget->SetTransform(
D2D1::Matrix3x2F::Scale(
D2D1::SizeF(3.f, 3.f),
D2D1::Point2F(175.f, 175.f))
);
m_pRenderTarget->DrawGeometry(m_pRectangleGeometry, m_pBlackBrush, 1);
다음 예제에서는 CreateTransformedGeometry 메서드를 사용하여 기하 도형의 크기를 3으로 조정한 다음 그립니다. 다음 그림에 표시된 출력을 생성합니다. 사각형은 더 크지만 스트로크는 증가하지 않았습니다.
// Create a geometry that is a scaled version
// of m_pRectangleGeometry.
// The new geometry is scaled by a factory of 3
// from the center of the geometry, (35, 35).
hr = m_pD2DFactory->CreateTransformedGeometry(
m_pRectangleGeometry,
D2D1::Matrix3x2F::Scale(
D2D1::SizeF(3.f, 3.f),
D2D1::Point2F(175.f, 175.f)),
&m_pTransformedGeometry
);
// Replace the previous render target transform.
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
// Draw the transformed geometry.
m_pRenderTarget->DrawGeometry(m_pTransformedGeometry, m_pBlackBrush, 1);
마스크로서의 기하 도형
PushLayer 메서드를 호출할 때 ID2D1Geometry 개체를 기하학적 마스크로 사용할 수 있습니다. 기하학적 마스크는 렌더링 대상에 합성되는 레이어의 영역을 지정합니다. 자세한 내용은 계층 개요의 기하학적 마스크 섹션을 참조하세요.
기하학적 연산
ID2D1Geometry 인터페이스는 기하 도형을 조작하고 측정하는 데 사용할 수 있는 여러 기하학적 연산을 제공합니다. 예를 들어 경계를 계산 및 반환하고, 한 기하 도형이 다른 기하 도형과 공간적으로 어떻게 관련되어 있는지(적중 테스트에 유용함), 영역 및 길이 등을 계산하는 데 사용할 수 있습니다. 다음 표에서는 일반적인 기하학적 연산에 대해 설명합니다.
작업 | 메서드 |
---|---|
Combine | CombineWithGeometry |
경계/ 확장된 경계/경계 검색, 더티 지역 업데이트 | Widen, GetBounds, GetWidenedBounds |
적중 테스트 | FillContainsPoint, StrokeContainsPoint |
스트로크 | StrokeContainsPoint |
비교 | CompareWithGeometry |
단순화(호 및 이차 베지어 곡선 제거) | 간소화 |
공간 분할 | 테셀레이트 () |
윤곽선(교차 제거) | 윤곽선 |
기하 도형의 영역 또는 길이 계산 | ComputeArea, ComputeLength, ComputePointAtLength |
참고
Windows 8 ID2D1PathGeometry1에서 ComputePointAndSegmentAtLength 메서드를 사용하여 기하 도형의 영역 또는 길이를 계산할 수 있습니다.
기하 도형 결합
한 기하 도형을 다른 기하 도형과 결합하려면 ID2D1Geometry::CombineWithGeometry 메서드를 호출합니다. 기하 도형을 결합할 때 결합 작업을 수행하는 네 가지 방법 중 하나를 지정합니다. D2D1_COMBINE_MODE_UNION (공용 구조체), D2D1_COMBINE_MODE_INTERSECT (교차), D2D1_COMBINE_MODE_XOR (xor) 및 D2D1_COMBINE_MODE_EXCLUDE (제외). 다음 코드 예제에서는 공용 구조체 결합 모드를 사용하여 결합된 두 개의 원을 보여 줍니다. 여기서 첫 번째 원은 중심점(75, 75)과 반경이 50이고 두 번째 원은 중심점(125, 75)과 반경이 50입니다.
HRESULT hr = S_OK;
ID2D1GeometrySink *pGeometrySink = NULL;
// Create the first ellipse geometry to merge.
const D2D1_ELLIPSE circle1 = D2D1::Ellipse(
D2D1::Point2F(75.0f, 75.0f),
50.0f,
50.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
circle1,
&m_pCircleGeometry1
);
if (SUCCEEDED(hr))
{
// Create the second ellipse geometry to merge.
const D2D1_ELLIPSE circle2 = D2D1::Ellipse(
D2D1::Point2F(125.0f, 75.0f),
50.0f,
50.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(circle2, &m_pCircleGeometry2);
}
if (SUCCEEDED(hr))
{
//
// Use D2D1_COMBINE_MODE_UNION to combine the geometries.
//
hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometryUnion);
if (SUCCEEDED(hr))
{
hr = m_pPathGeometryUnion->Open(&pGeometrySink);
if (SUCCEEDED(hr))
{
hr = m_pCircleGeometry1->CombineWithGeometry(
m_pCircleGeometry2,
D2D1_COMBINE_MODE_UNION,
NULL,
NULL,
pGeometrySink
);
}
if (SUCCEEDED(hr))
{
hr = pGeometrySink->Close();
}
SafeRelease(&pGeometrySink);
}
}
다음 그림에서는 결합 모드와 결합된 두 개의 원을 보여 줍니다.
모든 결합 모드에 대한 일러스트레이션은 D2D1_COMBINE_MODE 열거형을 참조하세요.
넓힐
Widen 메서드는 채우기가 기존 기하 도형을 쓰다듬는 것과 동일한 새 기하 도형을 생성한 다음, 지정된 ID2D1SimplifiedGeometrySink 개체에 결과를 씁니다. 다음 코드 예제에서는 ID2D1PathGeometry 개체에서 Open을 호출합니다. Open이 성공하면 geometry 개체에서 Widen를 호출합니다.
ID2D1GeometrySink *pGeometrySink = NULL;
hr = pPathGeometry->Open(&pGeometrySink);
if (SUCCEEDED(hr))
{
hr = pGeometry->Widen(
strokeWidth,
pIStrokeStyle,
pWorldTransform,
pGeometrySink
);
테셀레이트 ()
Tessellate 메서드는 지정된 행렬을 사용하여 변형되고 지정된 허용 오차를 사용하여 평면화된 후 기하 도형을 덮는 시계 방향 상처 삼각형 집합을 만듭니다. 다음 코드 예제에서는 Tessellate 를 사용하여 pPathGeometry를 나타내는 삼각형 목록을 만듭니다. 삼각형은 나중에 렌더링할 때 사용할 수 있도록 ID2D1Mesh, pMesh에 저장된 다음 클래스 멤버인 m_pStrokeMesh 전송됩니다.
ID2D1Mesh *pMesh = NULL;
hr = m_pRT->CreateMesh(&pMesh);
if (SUCCEEDED(hr))
{
ID2D1TessellationSink *pSink = NULL;
hr = pMesh->Open(&pSink);
if (SUCCEEDED(hr))
{
hr = pPathGeometry->Tessellate(
NULL, // world transform (already handled in Widen)
pSink
);
if (SUCCEEDED(hr))
{
hr = pSink->Close();
if (SUCCEEDED(hr))
{
SafeReplace(&m_pStrokeMesh, pMesh);
}
}
pSink->Release();
}
pMesh->Release();
}
FillContainsPoint 및 StrokeContainsPoint
FillContainsPoint 메서드는 기하 도형으로 채워진 영역에 지정된 점이 포함되어 있는지 여부를 나타냅니다. 이 메서드를 사용하여 적중 테스트를 수행할 수 있습니다. 다음 코드 예제에서는 ID2D1EllipseGeometry 개체에서 FillContainsPoint를 호출하여 (0,0) 지점과 ID 행렬을 전달합니다.
BOOL containsPoint1;
hr = m_pCircleGeometry1->FillContainsPoint(
D2D1::Point2F(0,0),
D2D1::Matrix3x2F::Identity(),
&containsPoint1
);
if (SUCCEEDED(hr))
{
// Process containsPoint.
}
StrokeContainsPoint 메서드는 기하 도형의 스트로크에 지정된 점이 포함되어 있는지 여부를 결정합니다. 이 메서드를 사용하여 적중 테스트를 수행할 수 있습니다. 다음 코드 예제에서는 StrokeContainsPoint를 사용합니다.
BOOL containsPoint;
hr = m_pCircleGeometry1->StrokeContainsPoint(
D2D1::Point2F(0,0),
10, // stroke width
NULL, // stroke style
NULL, // world transform
&containsPoint
);
if (SUCCEEDED(hr))
{
// Process containsPoint.
}
간소화
Simplify 메서드는 지정된 기하 도형에서 호 및 이차 베지어 곡선을 제거합니다. 따라서 결과 기하 도형에는 선 및 선택적으로 입방형 베지어 곡선만 포함됩니다. 다음 코드 예제에서는 단순화 를 사용하여 베지어 곡선이 있는 기하 도형을 선 세그먼트만 포함하는 기하 도형으로 변환합니다.
HRESULT D2DFlatten(
ID2D1Geometry *pGeometry,
float flatteningTolerance,
ID2D1Geometry **ppGeometry
)
{
HRESULT hr;
ID2D1Factory *pFactory = NULL;
pGeometry->GetFactory(&pFactory);
ID2D1PathGeometry *pPathGeometry = NULL;
hr = pFactory->CreatePathGeometry(&pPathGeometry);
if (SUCCEEDED(hr))
{
ID2D1GeometrySink *pSink = NULL;
hr = pPathGeometry->Open(&pSink);
if (SUCCEEDED(hr))
{
hr = pGeometry->Simplify(
D2D1_GEOMETRY_SIMPLIFICATION_OPTION_LINES,
NULL, // world transform
flatteningTolerance,
pSink
);
if (SUCCEEDED(hr))
{
hr = pSink->Close();
if (SUCCEEDED(hr))
{
*ppGeometry = pPathGeometry;
(*ppGeometry)->AddRef();
}
}
pSink->Release();
}
pPathGeometry->Release();
}
pFactory->Release();
return hr;
}
ComputeLength 및 ComputeArea
ComputeLength 메서드는 각 세그먼트가 선으로 언롤된 경우 지정된 기하 도형의 길이를 계산합니다. 여기에는 기하 도형이 닫혀 있는 경우 암시적 닫는 세그먼트가 포함됩니다. 다음 코드 예제에서는 ComputeLength 를 사용하여 지정된 원(m_pCircleGeometry1)의 길이를 계산합니다.
float length;
// Compute the area of circle1
hr = m_pCircleGeometry1->ComputeLength(
D2D1::IdentityMatrix(),
&length
);
if (SUCCEEDED(hr))
{
// Process the length of the geometry.
}
ComputeArea 메서드는 지정된 기하 도형의 영역을 계산합니다. 다음 코드 예제에서는 ComputeArea 를 사용하여 지정된 원(m_pCircleGeometry1)의 영역을 계산합니다.
float area;
// Compute the area of circle1
hr = m_pCircleGeometry1->ComputeArea(
D2D1::IdentityMatrix(),
&area
);
CompareWithGeometry
CompareWithGeometry 메서드는 이 메서드를 호출하는 기하 도형과 지정된 기하 도형 간의 교차점에 대해 설명합니다. 교차에 사용할 수 있는 값에는 D2D1_GEOMETRY_RELATION_DISJOINT (연결되지 않음), D2D1_GEOMETRY_RELATION_IS_CONTAINED (포함됨), D2D1_GEOMETRY_RELATION_CONTAINS (포함) 및 D2D1_GEOMETRY_RELATION_OVERLAP (겹침)가 포함됩니다. "disjoint"는 두 기하 도형 채우기가 전혀 교차하지 않음을 의미합니다. "가 포함됨"은 기하 도형이 지정된 기하 도형에 완전히 포함되어 있음을 의미합니다. "contains"는 기하 도형이 지정된 기하 도형을 완전히 포함하고 "겹침"은 두 기하 도형이 겹치지만 둘 다 완전히 다른 기하 도형을 포함하지 않는다는 것을 의미합니다.
다음 코드 예제에서는 반경이 50이지만 오프셋이 50인 두 원을 비교하는 방법을 보여 줍니다.
HRESULT hr = S_OK;
ID2D1GeometrySink *pGeometrySink = NULL;
// Create the first ellipse geometry to merge.
const D2D1_ELLIPSE circle1 = D2D1::Ellipse(
D2D1::Point2F(75.0f, 75.0f),
50.0f,
50.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
circle1,
&m_pCircleGeometry1
);
if (SUCCEEDED(hr))
{
// Create the second ellipse geometry to merge.
const D2D1_ELLIPSE circle2 = D2D1::Ellipse(
D2D1::Point2F(125.0f, 75.0f),
50.0f,
50.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(circle2, &m_pCircleGeometry2);
}
D2D1_GEOMETRY_RELATION result = D2D1_GEOMETRY_RELATION_UNKNOWN;
// Compare circle1 with circle2
hr = m_pCircleGeometry1->CompareWithGeometry(
m_pCircleGeometry2,
D2D1::IdentityMatrix(),
0.1f,
&result
);
if (SUCCEEDED(hr))
{
static const WCHAR szGeometryRelation[] = L"Two circles overlap.";
m_pRenderTarget->SetTransform(D2D1::IdentityMatrix());
if (result == D2D1_GEOMETRY_RELATION_OVERLAP)
{
m_pRenderTarget->DrawText(
szGeometryRelation,
ARRAYSIZE(szGeometryRelation) - 1,
m_pTextFormat,
D2D1::RectF(25.0f, 160.0f, 200.0f, 300.0f),
m_pTextBrush
);
}
}
윤곽선
Outline 메서드는 기하 도형의 윤곽선(그림이 자체 또는 다른 그림을 교차하지 않는 기하 도형의 버전)을 계산하고 결과를 ID2D1SimplifiedGeometrySink에 씁니다. 다음 코드 예제에서는 개요 를 사용하여 자체 교집합 없이 동등한 기하 도형을 생성합니다. 기본 평면화 허용 오차를 사용합니다.
HRESULT D2DOutline(
ID2D1Geometry *pGeometry,
ID2D1Geometry **ppGeometry
)
{
HRESULT hr;
ID2D1Factory *pFactory = NULL;
pGeometry->GetFactory(&pFactory);
ID2D1PathGeometry *pPathGeometry = NULL;
hr = pFactory->CreatePathGeometry(&pPathGeometry);
if (SUCCEEDED(hr))
{
ID2D1GeometrySink *pSink = NULL;
hr = pPathGeometry->Open(&pSink);
if (SUCCEEDED(hr))
{
hr = pGeometry->Outline(NULL, pSink);
if (SUCCEEDED(hr))
{
hr = pSink->Close();
if (SUCCEEDED(hr))
{
*ppGeometry = pPathGeometry;
(*ppGeometry)->AddRef();
}
}
pSink->Release();
}
pPathGeometry->Release();
}
pFactory->Release();
return hr;
}
GetBounds 및 GetWidenedBounds
GetBounds 메서드는 기하 도형의 범위를 검색합니다. 다음 코드 예제에서는 GetBounds 를 사용하여 지정된 원(m_pCircleGeometry1)의 범위를 검색합니다.
D2D1_RECT_F bounds;
hr = m_pCircleGeometry1->GetBounds(
D2D1::IdentityMatrix(),
&bounds
);
if (SUCCEEDED(hr))
{
// Retrieve the bounds.
}
GetWidenedBounds 메서드는 지정된 스트로크 너비와 스타일로 확장되고 지정된 행렬로 변환된 후 기하 도형의 범위를 검색합니다. 다음 코드 예제에서는 GetWidenedBounds 를 사용하여 지정된 스트로크 너비로 확장된 후 지정된 원(m_pCircleGeometry1)의 범위를 검색합니다.
float dashes[] = {1.f, 1.f, 2.f, 3.f, 5.f};
m_pD2DFactory->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_ROUND,
D2D1_LINE_JOIN_ROUND, // lineJoin
10.f, //miterLimit
D2D1_DASH_STYLE_CUSTOM,
0.f //dashOffset
),
dashes,
ARRAYSIZE(dashes)-1,
&m_pStrokeStyle
);
D2D1_RECT_F bounds1;
hr = m_pCircleGeometry1->GetWidenedBounds(
5.0,
m_pStrokeStyle,
D2D1::IdentityMatrix(),
&bounds1
);
if (SUCCEEDED(hr))
{
// Retrieve the widened bounds.
}
ComputePointAtLength
ComputePointAtLength 메서드는 기하 도형을 따라 지정된 거리에서 점 및 탄젠트 벡터를 계산합니다. 다음 코드 예제에서는 ComputePointAtLength를 사용합니다.
D2D1_POINT_2F point;
D2D1_POINT_2F tangent;
hr = m_pCircleGeometry1->ComputePointAtLength(
10,
NULL,
&point,
&tangent);
관련 항목