代码之家  ›  专栏  ›  技术社区  ›  NoName

使用Direct2D绘制SVG路径:无法绘制椭圆弧

  •  0
  • NoName  · 技术社区  · 8 年前

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24">
        <path d="M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" />
    </svg>
    

    为了便于阅读:

    M 6, 2
    C 4.89, 2 4,2.89 4,4
    V 20
    A 2,2 0 0,0 6,22
    H 18
    A 2,2 0 0,0 20,20
    V 8L14,2
    H 6
    Z
    

    ID2D1PathGeometry . 代码如下:

    ID2D1PathGeometry *geo = NULL;
    ID2D1GeometrySink *pSink = NULL;
    d2DFactory->CreatePathGeometry(&geo);
    geo->Open(&pSink);
    pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
    
    pSink->BeginFigure({ 6.00f, 2.00f }, D2D1_FIGURE_BEGIN_FILLED);
    pSink->AddBezier({ { 4.89f, 2.00f },{ 4.00f, 2.89f },{ 4.00f, 4.00f } });
    pSink->AddLine({ 4.00f, 20.00f });
    {
        D2D1_ARC_SEGMENT arc;
        arc.point.x = 6.00f;
        arc.point.y = 22.00f;
        arc.size.width = 2.00f;
        arc.size.height = 2.00f;
        arc.rotationAngle = 0.00f;
        arc.sweepDirection = D2D1_SWEEP_DIRECTION_CLOCKWISE;
        pSink->AddArc(&arc);
    }
    pSink->AddLine({ 18.00f, 22.00f });
    {
        D2D1_ARC_SEGMENT arc;
        arc.point.x = 6.00f;
        arc.point.y = 22.00f;
        arc.size.width = 2.00f;
        arc.size.height = 2.00f;
        arc.rotationAngle = 0.00f;
        arc.sweepDirection = D2D1_SWEEP_DIRECTION_CLOCKWISE;
        pSink->AddArc(&arc);
    }
    pSink->AddLine({ 20.00f, 8.00f });
    pSink->AddLine({ 14.00f, 2.00f });
    pSink->AddLine({ 6.00f, 2.00f });
    pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
    
    pSink->Close();
    pSink->Release();
    
    pRT->DrawGeometry(geo, brushBlack);
    

    虽然我可以成功地转换直线和贝塞尔曲线,但我无法转换圆弧。
    例如,上面的代码不会绘制任何内容,但如果我注释以下行:

    // pSink->AddArc(&arc);
    

    它将绘制一个形状,但肯定不会准确地显示Chrome浏览器输出的内容,因为缺少一些片段。

    问题:

    我的代码中有什么错误阻止我用弧段绘制几何图形?如何修复?

    2.

    在里面 w3.org

    rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y
    

    虽然我可以设置 rx , ry x_axis_rotation sweep_flag , x , y ,我没有看到成员 large_arc_flag D2D1_ARC_SEGMENT 结构。如何使其适应我的代码?

    1 回复  |  直到 5 年前
        1
  •  1
  •   user7860670    8 年前
    1. pSink->Close(); 确定出了什么问题。
    2. D2D1_ARC_SEGMENT::arcSize 您根本不初始化,这会导致UB,并可能导致代码无法添加arc,因为标志值很可能会变为无效。