enumerazione D2D1_FILL_MODE (d2d1.h)

Specifica il modo in cui le aree di intersezione delle geometrie o delle figure vengono combinate per formare l'area della geometria composita.

Sintassi

typedef enum D2D1_FILL_MODE {
  D2D1_FILL_MODE_ALTERNATE = 0,
  D2D1_FILL_MODE_WINDING = 1,
  D2D1_FILL_MODE_FORCE_DWORD = 0xffffffff
} ;

Costanti

 
D2D1_FILL_MODE_ALTERNATE
Valore: 0
Determina se un punto si trova nell'area di riempimento disegnando un raggio da quel punto all'infinito in qualsiasi direzione e quindi conteggiando il numero di segmenti di percorso all'interno della forma specificata che il raggio attraversa. Se questo numero è dispari, il punto si trova nell'area di riempimento; se anche il punto si trova all'esterno dell'area di riempimento.
D2D1_FILL_MODE_WINDING
Valore: 1
Determina se un punto si trova nell'area di riempimento del percorso disegnando un raggio da quel punto all'infinito in qualsiasi direzione e quindi esaminando i punti in cui un segmento della forma attraversa il raggio. A partire da un conteggio pari a zero, aggiungere uno ogni volta che un segmento attraversa il raggio da sinistra a destra e sottrae uno ogni volta che un segmento di percorso attraversa il raggio da destra a sinistra, a condizione che venga visualizzato da sinistra e destra dal punto di vista del raggio. Dopo aver conteggiato gli incroci, se il risultato è zero, il punto si trova all'esterno del percorso. In caso contrario, si trova all'interno del percorso.
D2D1_FILL_MODE_FORCE_DWORD
Valore: 0xffffffff

Commenti

Usare l'enumerazione D2D1_FILL_MODE durante la creazione di un oggetto ID2D1GeometryGroup con il metodo CreateGeometryGroup o quando si modifica la modalità di riempimento di un OGGETTO ID2D1SimplifiedGeometrySink con il metodo ID2D1SimplifiedGeometrySink::SetFillMode .

Direct2D riempie l'interno di un percorso usando una delle due modalità di riempimento specificate da questa enumerazione: D2D1_FILL_MODE_ALTERNATE (alternativa) o D2D1_FILL_MODE_WINDING (avvolgimento). Poiché le modalità determinano come riempire l'interno di una forma chiusa, tutte le forme vengono considerate chiuse quando vengono riempite. Se c'è una distanza in un segmento in una forma, disegnare una linea immaginaria per chiuderla.

Per vedere la differenza tra le modalità di riempimento avvolgimento e riempimento alternativo, si supponga di avere quattro cerchi con lo stesso centro e un raggio diverso, come illustrato nella figura seguente. Il primo ha il raggio di 25, il secondo 50, il terzo 75 e il quarto 100.

Illustrazione di quattro cerchi concentrici con valori di raggio diversi La figura seguente mostra la forma riempita utilizzando la modalità di riempimento alternativa. Si noti che il centro e il terzo anello non sono riempiti. Questo perché un raggio disegnato da qualsiasi punto in uno di questi due anelli passa attraverso un numero pari di segmenti. Illustrazione dei cerchi concentrici con i secondi e i quarti anelli riempiti La figura seguente illustra questo processo. Illustrazione di cerchi concentrici con punti nel secondo e terzo anelli e due raggi arbitrari che si estendono da ogni punto La figura seguente mostra come viene riempita la stessa forma quando viene specificata la modalità di riempimento dell'avvolgimento. Illustrazione di cerchi concentrici con tutti gli anelli riempiti Si noti che tutti gli anelli vengono riempiti. Ciò è dovuto al fatto che tutti i segmenti vengono eseguiti nella stessa direzione, quindi un raggio disegnato da qualsiasi punto intersecerà uno o più segmenti e la somma degli incroci non sarà uguale a zero.

La figura seguente illustra questo processo. Le frecce rosse rappresentano la direzione in cui vengono disegnati i segmenti e la freccia nera rappresenta un raggio arbitrario che viene eseguito da un punto nell'anello più interno. A partire da un valore pari a zero, per ogni segmento intersecato dal raggio viene aggiunto un valore pari a uno per ogni intersezione in senso orario. Tutti i punti si trovano nell'area di riempimento in questa illustrazione, perché il conteggio non è uguale a zero.

Illustrazione di cerchi concentrici con un raggio dall'interno del primo anello che attraversa tutti e quattro gli anelli

Esempio

Nell'esempio di codice seguente vengono creati i gruppi geometry usati nelle illustrazioni precedenti. Il codice dichiara innanzitutto una matrice di oggetti geometry. Questi oggetti sono quattro cerchi concentrici con i seguenti raggi: 25, 50, 75 e 100. Chiamare quindi CreateGeometryGroup nell'oggetto ID2D1Factory , passando D2D1_FILL_MODE_ALTERNATE, una matrice di oggetti geometry da aggiungere al gruppo geometry e il numero di elementi in questa matrice.

HRESULT DemoApp::CreateGeometryResources()
{
    HRESULT hr;

    const D2D1_ELLIPSE ellipse1 = D2D1::Ellipse(
        D2D1::Point2F(105.0f, 105.0f),
        25.0f,
        25.0f
        );

    hr = m_pD2DFactory->CreateEllipseGeometry(
        ellipse1,
        &m_pEllipseGeometry1
        );

    if (SUCCEEDED(hr))
    {
        const D2D1_ELLIPSE ellipse2 = D2D1::Ellipse(
            D2D1::Point2F(105.0f, 105.0f),
            50.0f,
            50.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(
            ellipse2,
            &m_pEllipseGeometry2
            );
    }

    if (SUCCEEDED(hr))
    {

        const D2D1_ELLIPSE ellipse3 = D2D1::Ellipse(
            D2D1::Point2F(105.0f, 105.0f),
            75.0f,
            75.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(
            ellipse3,
            &m_pEllipseGeometry3
            );
    }

    if (SUCCEEDED(hr))
    {
        const D2D1_ELLIPSE ellipse4 = D2D1::Ellipse(
            D2D1::Point2F(105.0f, 105.0f),
            100.0f,
            100.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(
            ellipse4,
            &m_pEllipseGeometry4
            );
    }

    if (SUCCEEDED(hr))
    {
        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
                );
        }

    }
    return hr;
}

Requisiti

   
Client minimo supportato Windows 7, Windows Vista con SP2 e Aggiornamento della piattaforma per Windows Vista [app desktop | App UWP]
Server minimo supportato Windows Server 2008 R2, Windows Server 2008 con SP2 e Platform Update per Windows Server 2008 [app desktop | App UWP]
Intestazione d2d1.h

Vedi anche

Panoramica delle geometrie

ID2D1Factory::CreateGeometryGroup