C ++ DirectX 9径向(饼图)菜单

时间:2014-06-14 18:38:58

标签: c++ user-interface directx

在DirectX 9中渲染径向菜单(动态项目数)的最简单方法是什么?

enter image description here

void DrawMenu(int x, int y, int radius, int width, int segments, LPDIRECT3DDEVICE9 dev){
    Draw2DCircle(x, y, radius, D3DCOLOR_RGBA(0, 255, 255, 255), dev);
    Draw2DCircle(x, y, radius-width, D3DCOLOR_RGBA(0, 255, 255, 255), dev);

    float innerX, innerY, outerX, outerY;

    float Theta;


    for (int i = 0; i < segments; i++){
        Theta = i * (2*PI / segments);

        innerX = (radius - width)*cos(Theta) + x;
        innerY = (radius - width)*sin(Theta) + y;

        outerX = (radius)*cos(Theta) + x;
        outerY = (radius)*sin(Theta) + y;

        DrawLine(innerX, innerY, outerX, outerY, D3DCOLOR_RGBA(0, 255, 255, 255), dev);
    }

}

我做的就像马里奥说的那样,它就像一个魅力,但是......我需要做什么才能使菜单上色?

Draving函数:

void DrawLine(int x1, int y1, int x2, int y2, D3DCOLOR color, LPDIRECT3DDEVICE9 dev){
    D3DTLVERTEX Line[2];
    Line[0] = CreateD3DTLVERTEX(x1, y1, 0.0f, 1.0f, color, 0.0f, 0.0f);
    Line[1] = CreateD3DTLVERTEX(x2, y2, 0.0f, 1.0f, color, 0.0f, 0.0f);

    dev->SetFVF(D3DFVF_TL);
    dev->SetTexture(0, NULL);
    dev->DrawPrimitiveUP(D3DPT_LINESTRIP, 2, &Line[0], sizeof(Line[0]));}


void Draw2DCircle(int x, int y, float radius, D3DCOLOR color, LPDIRECT3DDEVICE9 dev){

    const int NUMPOINTS = 40;
    D3DTLVERTEX Circle[NUMPOINTS + 1];

    int i;
    float X;
    float Y;
    float Theta;

    float AngleBetweenPoints;   

    AngleBetweenPoints = (float)((2 * PI) / NUMPOINTS);

    for (i = 0; i <= NUMPOINTS; i++)

    {
        Theta = i * AngleBetweenPoints;
        X = (float)(x + radius * cos(Theta));
        Y = (float)(y - radius * sin(Theta));
        Circle[i] = CreateD3DTLVERTEX(X, Y, 0.0f, 1.0f, color, 0.0f, 0.0f);
    }

    dev->SetFVF(D3DFVF_TL);
    dev->SetTexture(0, NULL);
    dev->DrawPrimitiveUP(D3DPT_LINESTRIP, NUMPOINTS, &Circle[0], sizeof(Circle[0]));}

自定义顶点结构

struct D3DTLVERTEX{
    float fX;
    float fY;
    float fZ;
    float fRHW;
    D3DCOLOR Color;
    float fU;
    float fV;};

1 个答案:

答案 0 :(得分:1)

对于将来的问题,您应该包含一些代码,以便人们能够帮助您找出您犯错误的地方,而不是(重新)从头开始编写所有内容。

考虑以下代码未经测试的伪代码。您可能需要进行一些调整和/或修复一些错误(从内存中写入;不要运行某些开发环境)。

  • 我只会画一个空圈。扩展它以绘制一个环应该是微不足道的,这实际上只是意味着添加一个较小的圆。
  • 要绘制圆圈,您通常会使用固定数量的点。我们假设我们要使用至少30个。
  • 如果分配平等,则表示我们每个细分受到30 / number_of_segments分。但是存在一个问题:可能会出现段的结尾应该在两点之间的情况,因此为每个段使用30 / number_of_segments + 1点会更好。
  • 一旦确定,使用极坐标定义所有点相当容易:
    • 第一个点的角度为start = segment_number * (360 / number_of_segments)
    • 最后一个点的角度为end = (segment_number + 1) * (360 / number_of_segments)
    • 余下的点在startend之间平均分配。
  • 要获得笛卡尔坐标,您只需使用三角函数(r是半径,a角度):

    x = r * cos(a);
    y = r * sin(a);
    
  • 知道所有要点后,应该很容易用它创建一些可见的几何体。请注意,您可能还需要添加一些偏移来移动圆圈/圆环。