перечисление D2D1_FILL_MODE (d2d1.h)
Указывает, как пересекающиеся области геометрических объектов или фигур объединяются для формирования области составной геометрии.
Синтаксис
typedef enum D2D1_FILL_MODE {
D2D1_FILL_MODE_ALTERNATE = 0,
D2D1_FILL_MODE_WINDING = 1,
D2D1_FILL_MODE_FORCE_DWORD = 0xffffffff
} ;
Константы
D2D1_FILL_MODE_ALTERNATE Значение: 0 Определяет, находится ли точка в области заполнения, рисуя луч от этой точки до бесконечности в любом направлении, а затем подсчитывая количество сегментов пути в пределах заданной фигуры, пересекаемой лучом. Если это число нечетное, точка находится в области заполнения; если даже точка находится за пределами области заполнения. |
D2D1_FILL_MODE_WINDING Значение: 1 Определяет, находится ли точка в области заливки пути, рисуя луч от этой точки до бесконечности в любом направлении, а затем исследуя места, где сегмент фигуры пересекает луч. Начиная с нулевого числа, добавляйте по одному каждый раз, когда сегмент пересекает луч слева направо, и вычитайте по одному каждый раз, когда сегмент пути пересекает луч справа налево, при условии, что слева и справа видно с точки зрения луча. После подсчета пересечений, если результат равен нулю, точка находится за пределами пути. В противном случае он находится внутри пути. |
D2D1_FILL_MODE_FORCE_DWORD Значение: 0xffffffff |
Комментарии
Используйте перечисление D2D1_FILL_MODE при создании ID2D1GeometryGroup с помощью метода CreateGeometryGroup или при изменении режима заполнения ID2D1SimplifiedGeometrySink с помощью метода ID2D1SimplifiedGeometrySink::SetFillMode .
Direct2D заполняет внутреннюю часть пути, используя один из двух режимов заполнения, заданных этим перечислением: D2D1_FILL_MODE_ALTERNATE (альтернативный) или D2D1_FILL_MODE_WINDING (обмотка). Так как режимы определяют способ заполнения внутренней части закрытой фигуры, все фигуры обрабатываются как закрытые при заполнении. Если в сегменте фигуры есть разрыв, нарисуйте воображаемую линию, чтобы закрыть ее.
Чтобы увидеть разницу между обмоткой и альтернативным режимами заливки, предположим, что у вас есть четыре круга с тем же центром и разными радиусами, как показано на следующем рисунке. Первый имеет радиус 25, второй 50, третий 75 и четвертый 100.
На следующем рисунке показана фигура, заполненная в режиме альтернативной заливки. Обратите внимание, что центр и третье кольцо не заполнены. Это связано с тем, что луч, взятый из любой точки в любом из этих двух колец, проходит через четное число сегментов. Этот процесс описан на следующем рисунке. На следующем рисунке показано, как заполняется та же фигура при указании режима обмотки заливки. Обратите внимание, что все кольца заполнены. Это связано с тем, что все сегменты работают в одном направлении, поэтому луч, нарисованный из любой точки, пересекает один или несколько сегментов, а сумма пересечений не будет равна нулю.Этот процесс описан на следующем рисунке. Красные стрелки представляют направление, в котором отрисовываются сегменты, а черная стрелка представляет произвольный луч, который проходит от точки во внутреннем кольце. Начиная со значения 0 для каждого сегмента, пересекаемого лучом, для каждого пересечения по часовой стрелке добавляется значение 1. Все точки находятся в области заполнения на этом рисунке, так как счетчик не равен нулю.
Примеры
В следующем примере кода создаются геометрические группы, используемые на предыдущих иллюстрациях. Код сначала объявляет массив объектов geometry. Эти объекты представляют собой четыре концентрических круга со следующими радиусами: 25, 50, 75 и 100. Затем вызовите CreateGeometryGroup для объекта ID2D1Factory , передав D2D1_FILL_MODE_ALTERNATE, массив объектов geometry для добавления в группу geometry и количество элементов в этом массиве.
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;
}
Требования
Минимальная версия клиента | Windows 7, Windows Vista с пакетом обновления 2 (SP2) и обновление платформы для Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 R2, Windows Server 2008 с пакетом обновления 2 (SP2) и Обновление платформы для Windows Server 2008 [классические приложения | Приложения UWP] |
Верхняя часть | d2d1.h |