2016-03-17 7 views
1

Использование прямого x (прямой 3d или 2d) Я хотел бы нарисовать часть круга, указав тету, начальную точку и конечную точку. Например, я хочу установить координаты источника x/y как 0/0, theta на 20 градусов и конец x/y как 200/200, чтобы нарисовать часть круга.Как нарисовать часть круга в C++/Direct X?

Плоский 2D-круг или, точнее, его часть. Есть идеи? Благодарю.

Я добавил код, но это прошло через множество изменений, но это не сработало, поэтому я не смотрел на него с тех пор.

D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, &pD2DFactory); 


RECT rc = {dx,dy,dx+dw,dy+dh}; 
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
    D2D1_RENDER_TARGET_TYPE_DEFAULT, 
    D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_IGNORE), 
    0,0, D2D1_RENDER_TARGET_USAGE_NONE, D2D1_FEATURE_LEVEL_DEFAULT); 

pD2DFactory->CreateDCRenderTarget(&props,&pD2DDCRenderTarget); 
pD2DDCRenderTarget->BindDC(hDC,&rc); 
pD2DDCRenderTarget->CreateBitmap (D2D1::SizeU(sw,sh),(void*)p_bmp,pitch, 
     D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_IGNORE)), 
     &pD2DBitmap); 

pD2DDCRenderTarget->BeginDraw();  
pD2DDCRenderTarget->DrawBitmap(pD2DBitmap, 
     D2D1::RectF((FLOAT)dx,(FLOAT)dy,(FLOAT)dw,(FLOAT)dh),1.0,D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, 
     D2D1::RectF((FLOAT)sx,(FLOAT)sy,(FLOAT)sw,(FLOAT)sh)); 
pD2DDCRenderTarget->EndDraw();  

SafeRelease(&pD2DBitmap); 
SafeRelease(&pD2DDCRenderTarget);  
SafeRelease(&pD2DFactory); 
+0

что вы пытались до сих пор? –

+0

@FirstStep Я попытался использовать прямоугольники для его создания, но это оказалось ужасным по форме и производительности –

+0

Можем ли мы увидеть код и выход? –

ответ

1

В Direct2D вы хотите использовать геометрию для этого. Ниже приведен пример того, как вы можете это сделать. В приведенной ниже функции создается геометрия пути с использованием трех точек: p0 - начальная точка, p1 - конечная точка, а p2 просто p1, повернутая на уровни tta вокруг p0. Для функции ниже требуется, чтобы значения thetaDegrees были равны < = 180 градусов.

В Direct3D вы должны использовать треугольный вентилятор/полосу/список для приближения к дуге окружности; тем больше треугольников, тем гладче будет форма. Direct2D заботится обо всем этом для вас.

void DrawArc(
    ID2D1Factory* factory, 
    ID2D1DeviceContext* context, 
    ID2D1Brush* brush, 
    D2D1_POINT_2F p0, 
    D2D1_POINT_2F p1, 
    float thetaDegrees 
    ) 
{ 
    // rotate p1 around p0 by theta degrees 
    D2D1_POINT_2F p2 = D2D1::Matrix3x2F::Rotation(thetaDegrees, p0).TransformPoint(p1); 

    // distance between p0 and p1 is the radius 
    float dx = p1.x - p0.x; 
    float dy = p1.y - p0.y; 
    float radius = std::sqrt(dx * dx + dy * dy); 

    ComPtr<ID2D1PathGeometry> pathGeometry; 
    factory->CreatePathGeometry(&pathGeometry); 

    ComPtr<ID2D1GeometrySink> geometrySink; 
    pathGeometry->Open(&geometrySink); 

    // begin figure at p0 
    geometrySink->BeginFigure(p0, D2D1_FIGURE_BEGIN_FILLED); 

    // draw a line between p0 and p1 
    geometrySink->AddLine(p1); 

    // draw an arc segment between p1 and p2 
    geometrySink->AddArc(D2D1::ArcSegment(
     p2, 
     D2D1::SizeF(radius, radius), 
     0.0f, 
     D2D1_SWEEP_DIRECTION_CLOCKWISE, 
     D2D1_ARC_SIZE_SMALL 
     )); 

    // end the figure in a closed state (automatically adds a line from p2 back to p0) 
    geometrySink->EndFigure(D2D1_FIGURE_END_CLOSED); 
    geometrySink->Close(); 

    // fill the interior of the geometry with the given brush 
    context->FillGeometry(pathGeometry.Get(), brush); 
} 
+0

Спасибо. Я попробую и отправлю отчет. –

+0

Никогда не сообщалось –

 Смежные вопросы

  • Нет связанных вопросов^_^