昨日の Tessellate 結果を図示したものです。
FillGeometry() 相当の場合
ポリゴン化の状態をわかりやすくするために flatteningTolerance = 4 で Tessellate
しています。
iFactory->CreateEllipseGeometry( D2D1::Ellipse( D2D1::Point2F( 0,0f, 0.0f ), 80.0f, 80.0f ), &iElli ); DummySink tsink; iElli->Tessellate( NULL, 4.0f, &tsink );
DrawGeometry() 相当の場合
strokeWidth = 4.0 で描画した場合のポリゴン分割です。
こちらも見やすいように flatteningTolerance = 4 で分割しています。
iFactory->CreatePathGeometry( &iPath ); ID2D1GeometrySink* isink; iPath->Open( &isink ); iElli->Widen( 10.0f, NULL, NULL, isink ); isink->Close(); DummySink tsink; iPath->Tessellate( NULL, 4.0f, &tsink );
デフォルトのままだとこれくらいの分割です。
水平方向の分割かつ Strip になっているのがわかります。
テストに使った DummySink の定義。
class DummySink : public ID2D1TessellationSink { private: static ID2D1PathGeometry* iPath; static ID2D1GeometrySink* iSink; public: DummySink() { } public: STDMETHOD_( void, AddTriangles )( const D2D1_TRIANGLE* triangles, UINT trianglecount ) { for( UINT i= 0 ; i< trianglecount ; i++, triangles++ ){ iSink->BeginFigure( triangles->point1, D2D1_FIGURE_BEGIN_FILLED ); iSink->AddLine( triangles->point2 ); iSink->AddLine( triangles->point3 ); iSink->EndFigure( D2D1_FIGURE_END_CLOSED ); } } STDMETHOD_(ULONG, AddRef )( THIS ) { return 0; } STDMETHOD_(ULONG, Release )( THIS ) { return 0; } STDMETHOD( QueryInterface )( THIS_ REFIID riid, void** obj ) { return E_UNEXPECTED; } STDMETHOD( Close )() { return S_OK; } static void Create( ID2D1Factory* factory ) { factory->CreatePathGeometry( &iPath ); iPath->Open( &iSink ); } static void ClosePath() { if( iSink ){ iSink->Close(); iSink= NULL; } } }; ID2D1PathGeometry* DummySink::iPath= NULL; ID2D1GeometrySink* DummySink::iSink= NULL;
そのまま DrawGeometry() で path を描画すると、とがった角にトゲが生えたような
描画になることがあります。折れ線のつなぎ処理が入っているようです。
描画用に ID2D1StrokeStyle を作成しておくとトゲが無くなります。
関連エントリ
・Direct2D (6) Tessellate
・Direct2D (5) ID2D1Geometry を使う
・Direct2D (4) Direct2D の描画
・Direct2D (3) 互換性の検証と Vista で Direct2D
・Direct2D その(2) インターフェース
・Direct2D と Direct3D10.1 の下位互換