Yol Geometrilerine Genel Bakış
Bu konu başlığında, karmaşık çizimler oluşturmak için Direct2D yol geometrilerinin nasıl kullanılacağı açıklanmaktadır. Aşağıdaki bölümleri içerir.
- Önkoşullar
- Direct2D Yol Geometrileri
- Bir Yol Geometrisini Oluşturmak için ID2D1GeometrySink Kullanma
-
Örnek: Karmaşık Çizim Oluşturma
- Sol Dağ için Yol Geometrisi Oluşturma
- Sağ Dağ için Yol Geometrisi Oluşturma
- Güneş için Yol Geometrisi Oluşturma
- Nehir için Yol Geometrisi Oluşturma
- Yol Geometrilerini Ekrana Çiz
- İlgili konular
Önkoşullar
Bu genel bakış, Basit bir Direct2D uygulaması oluşturmabölümünde açıklandığı gibi temel Direct2D uygulamaları oluşturmayı bildiğinizi varsayar. Ayrıca, Geometrilere Genel Bakışaçıklandığı gibi Direct2D geometrilerinin temel özelliklerini bildiğiniz varsayılır.
Direct2D'de Yol Geometrileri
Yol geometrileri ID2D1PathGeometry arabirimiyle temsil edilir. Yol geometrisi örneği oluşturmak için id2D1Factory::CreatePathGeometryyönteminiçağırın. Bu nesneler yaylar, eğriler ve çizgiler gibi segmentlerden oluşan karmaşık geometrik şekilleri tanımlamak için kullanılabilir. Yol geometrisini figürler ve segmentlerle oluşturmak için Open yöntemini çağırarak ID2D1GeometrySink alın ve geometri kuyusunun yöntemlerini kullanarak yol geometrisine figürler ve segmentler ekleyin.
Yol Geometrisini Oluşturmak için ID2D1GeometrySink Kullanma
ID2D1GeometrySink çizgiler, yaylar, bezier küp eğrileri ve ikinci dereceden Bezier eğrileri içerebilen geometrik bir yolu açıklar.
Geometri havuzu bir veya daha fazla şekilden oluşur. Her şekil bir veya daha fazla çizgi, eğri veya yay kesiminden oluşur. Şekil oluşturmak için, şeklin başlangıç noktasını geçirerek BeginFigure yöntemini çağırın ve ardından segment eklemek için Add yöntemlerini (AddLine ve AddBezier) kullanın. Segment eklemeyi bitirdiğinizde EndFigure yöntemini çağırın. Ek şekiller oluşturmak için bu sırayı tekrarlayabilirsiniz. Şekiller oluşturmayı bitirdiğinizde Close yöntemini çağırın.
Örnek: Karmaşık Çizim Oluşturma
Aşağıdaki çizimde çizgiler, yaylar ve Bezier eğrileri içeren karmaşık bir çizim gösterilmektedir. Aşağıdaki kod örneğinde, biri sol dağ, biri sağ dağ, biri nehir için ve biri de parlayan güneş için olmak üzere dört yol geometri nesnesi kullanılarak çizimin nasıl oluşturulacağı gösterilmektedir.
Yol geometrileriçizimi
Sol Dağ için Yol Geometrisi Oluşturma
Örnek ilk olarak aşağıdaki çizimde gösterildiği gibi sol dağ için bir yol geometrisi oluşturur.
Sol dağı oluşturmak için örnek, id2D1Factory::CreatePathGeometryyöntemini çağırarak ID2D1PathGeometryoluşturur.
hr = m_pD2DFactory->CreatePathGeometry(&m_pLeftMountainGeometry);
Örnek, ardından bir ID2D1PathGeometry nesnesinden bir geometri alıcısı elde etmek için Open yöntemini kullanır ve bunu pSink değişkenine depolar.
ID2D1GeometrySink *pSink = NULL;
hr = m_pLeftMountainGeometry->Open(&pSink);
Örnek daha sonra BeginFigureçağrısı yaparak bu şeklin doldurulduğunu belirten D2D1_FIGURE_BEGIN_FILLED iletir. ardından AddLinesçağrısı yaparak D2D1_POINT_2F noktaları dizisi (267, 177), (236, 192), (212, 160), (156, 255) ve (346, 255) dizisini geçirir.
Aşağıdaki kod bunun nasıl yapılacağını gösterir.
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure(
D2D1::Point2F(346,255),
D2D1_FIGURE_BEGIN_FILLED
);
D2D1_POINT_2F points[5] = {
D2D1::Point2F(267, 177),
D2D1::Point2F(236, 192),
D2D1::Point2F(212, 160),
D2D1::Point2F(156, 255),
D2D1::Point2F(346, 255),
};
pSink->AddLines(points, ARRAYSIZE(points));
pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
Sağ Dağ için Yol Geometrisi Oluşturma
Örnek daha sonra sağ dağ için nokta (481, 146), (449, 181), (433, 159), (401, 214), (381, 199), (323, 263) ve (575, 263) ile başka bir yol geometrisi oluşturur. Aşağıdaki çizimde doğru dağın nasıl görüntülendiği gösterilmektedir.
Aşağıdaki kod bunun nasıl yapılacağını gösterir.
hr = m_pD2DFactory->CreatePathGeometry(&m_pRightMountainGeometry);
if(SUCCEEDED(hr))
{
ID2D1GeometrySink *pSink = NULL;
hr = m_pRightMountainGeometry->Open(&pSink);
if (SUCCEEDED(hr))
{
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure(
D2D1::Point2F(575,263),
D2D1_FIGURE_BEGIN_FILLED
);
D2D1_POINT_2F points[] = {
D2D1::Point2F(481, 146),
D2D1::Point2F(449, 181),
D2D1::Point2F(433, 159),
D2D1::Point2F(401, 214),
D2D1::Point2F(381, 199),
D2D1::Point2F(323, 263),
D2D1::Point2F(575, 263)
};
pSink->AddLines(points, ARRAYSIZE(points));
pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
}
hr = pSink->Close();
SafeRelease(&pSink);
}
Güneş için Yol Geometrisi Oluşturma
Örnek daha sonra aşağıdaki çizimde gösterildiği gibi güneş için başka bir yol geometrisini doldurur.
Bunu yapmak için yol geometrisi bir havuz oluşturur ve yay için bir şekil ve havuza her parıltı için bir şekil ekler. BeginFigure, add (AddBeziergibi) yöntemlerinin ve EndFiguredizisi yinelenerek havuza birden çok şekil eklenir.
Aşağıdaki kod bunun nasıl yapılacağını gösterir.
hr = m_pD2DFactory->CreatePathGeometry(&m_pSunGeometry);
if(SUCCEEDED(hr))
{
ID2D1GeometrySink *pSink = NULL;
hr = m_pSunGeometry->Open(&pSink);
if (SUCCEEDED(hr))
{
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure(
D2D1::Point2F(270, 255),
D2D1_FIGURE_BEGIN_FILLED
);
pSink->AddArc(
D2D1::ArcSegment(
D2D1::Point2F(440, 255), // end point
D2D1::SizeF(85, 85),
0.0f, // rotation angle
D2D1_SWEEP_DIRECTION_CLOCKWISE,
D2D1_ARC_SIZE_SMALL
));
pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
pSink->BeginFigure(
D2D1::Point2F(299, 182),
D2D1_FIGURE_BEGIN_HOLLOW
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(299, 182),
D2D1::Point2F(294, 176),
D2D1::Point2F(285, 178)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(276, 179),
D2D1::Point2F(272, 173),
D2D1::Point2F(272, 173)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
pSink->BeginFigure(
D2D1::Point2F(354, 156),
D2D1_FIGURE_BEGIN_HOLLOW
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(354, 156),
D2D1::Point2F(358, 149),
D2D1::Point2F(354, 142)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(349, 134),
D2D1::Point2F(354, 127),
D2D1::Point2F(354, 127)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
pSink->BeginFigure(
D2D1::Point2F(322,164),
D2D1_FIGURE_BEGIN_HOLLOW
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(322, 164),
D2D1::Point2F(322, 156),
D2D1::Point2F(314, 152)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(306, 149),
D2D1::Point2F(305, 141),
D2D1::Point2F(305, 141)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
pSink->BeginFigure(
D2D1::Point2F(385, 164),
D2D1_FIGURE_BEGIN_HOLLOW
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(385,164),
D2D1::Point2F(392,161),
D2D1::Point2F(394,152)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(395,144),
D2D1::Point2F(402,141),
D2D1::Point2F(402,142)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
pSink->BeginFigure(
D2D1::Point2F(408,182),
D2D1_FIGURE_BEGIN_HOLLOW
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(408,182),
D2D1::Point2F(416,184),
D2D1::Point2F(422,178)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(428,171),
D2D1::Point2F(435,173),
D2D1::Point2F(435,173)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
}
hr = pSink->Close();
SafeRelease(&pSink);
}
Nehir için Yol Geometrisi Oluşturma
Örnek daha sonra bezier eğrilerini içeren nehir için başka bir geometri yolu oluşturur. Aşağıdaki çizimde nehrin nasıl görüntülendiği gösterilmektedir.
Nehri gösteren çizimi.
Aşağıdaki kod bunun nasıl yapılacağını gösterir.
hr = m_pD2DFactory->CreatePathGeometry(&m_pRiverGeometry);
if(SUCCEEDED(hr))
{
ID2D1GeometrySink *pSink = NULL;
hr = m_pRiverGeometry->Open(&pSink);
if (SUCCEEDED(hr))
{
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure(
D2D1::Point2F(183, 392),
D2D1_FIGURE_BEGIN_FILLED
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(238, 284),
D2D1::Point2F(472, 345),
D2D1::Point2F(356, 303)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(237, 261),
D2D1::Point2F(333, 256),
D2D1::Point2F(333, 256)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(335, 257),
D2D1::Point2F(241, 261),
D2D1::Point2F(411, 306)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(574, 350),
D2D1::Point2F(288, 324),
D2D1::Point2F(296, 392)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
}
Yol Geometrilerini Ekrana İşleme
Aşağıdaki kod, ekranda doldurulan yol geometrilerinin nasıl işleneceğini gösterir. İlk olarak güneş geometrisini, sol dağ geometrisinin yanında, sonra nehir geometrisini ve son olarak da sağ dağ geometrisini çizer ve boyar.
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
D2D1_SIZE_F rtSize = m_pRenderTarget->GetSize();
m_pRenderTarget->FillRectangle(
D2D1::RectF(0, 0, rtSize.width, rtSize.height),
m_pGridPatternBitmapBrush
);
m_pRenderTarget->FillGeometry(m_pSunGeometry, m_pRadialGradientBrush);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::Black, 1.f));
m_pRenderTarget->DrawGeometry(m_pSunGeometry, m_pSceneBrush, 1.f);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::OliveDrab, 1.f));
m_pRenderTarget->FillGeometry(m_pLeftMountainGeometry, m_pSceneBrush);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::Black, 1.f));
m_pRenderTarget->DrawGeometry(m_pLeftMountainGeometry, m_pSceneBrush, 1.f);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::LightSkyBlue, 1.f));
m_pRenderTarget->FillGeometry(m_pRiverGeometry, m_pSceneBrush);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::Black, 1.f));
m_pRenderTarget->DrawGeometry(m_pRiverGeometry, m_pSceneBrush, 1.f);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::YellowGreen, 1.f));
m_pRenderTarget->FillGeometry(m_pRightMountainGeometry, m_pSceneBrush);
m_pSceneBrush->SetColor(D2D1::ColorF(D2D1::ColorF::Black, 1.f));
m_pRenderTarget->DrawGeometry(m_pRightMountainGeometry, m_pSceneBrush, 1.f);
hr = m_pRenderTarget->EndDraw();
Tam örnek aşağıdaki çizimin çıktısını verir.
Nehir, dağ ve güneşin yol geometrileriçizimi
İlgili konular