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

C++ C++;DirectX 9径向(饼图)菜单,c++,user-interface,directx,C++,User Interface,Directx,在DirectX 9中呈现径向菜单(具有动态项数)的最简单方法是什么 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, 25

在DirectX 9中呈现径向菜单(具有动态项数)的最简单方法是什么

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);
    }

}


对于将来的问题,您应该包含一些代码,这样人们就能够帮助您查明哪里犯了错误,而不是从头开始(重新)编写所有内容

考虑以下未经测试的伪代码。您可能需要进行更多的调整和/或修复一些bug(从内存编写;而不是在某些开发环境运行时)

  • 我只画一个空圆圈。将其扩展为画一个环应该很简单,这基本上只是意味着添加第二个更小的圆
  • 要绘制圆,通常需要使用固定数量的点。让我们假设我们希望使用至少30个
  • 在平均分布的情况下,这意味着我们将获得每个段的
    30个/u段数
    点。但是有一个问题:在某些情况下,段的结尾应该在两点之间,因此最好为每个段使用
    30/number\u\u段+1
  • 一旦建立,使用极坐标定义所有点就相当容易:
    • 第一个点的角度为
      start=段数*(360/段数)
    • 最后一个点的角度为
      end=(段数+1)*(360/段数)
    • 剩余的点平均分布在
      开始
      结束
      之间
  • 要获得笛卡尔坐标,只需使用三角法(
    r
    是半径,
    a
    是角度):

  • 已知所有点后,使用这些点可以轻松创建一些可见的几何体。请记住,可能还需要添加一些偏移来移动圆/环


n=2,3,4,5,6的示例到目前为止您尝试了什么?你试过画一个圆吗?如果你有一个圆圈,那么得到一枚戒指只是一小步。从这里开始,这是获得不同片段的又一小步。如果你这样想,这是我目前的结果。这看起来是个有趣的问题。您应该添加一些代码并提出有针对性的问题,以便可以重新打开。
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;};
x = r * cos(a);
y = r * sin(a);