首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ DirectX 9径向(派)菜单

C++ DirectX 9径向(派)菜单
EN

Stack Overflow用户
提问于 2014-06-14 18:38:58
回答 1查看 849关注 0票数 0

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

代码语言:javascript
复制
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);
    }

}

我照马里奥说的做了,这就像一种魅力,但是.我需要做什么,菜单会被着色吗?

选举职能:

代码语言:javascript
复制
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]));}

自定义顶点结构

代码语言:javascript
复制
struct D3DTLVERTEX{
    float fX;
    float fY;
    float fZ;
    float fRHW;
    D3DCOLOR Color;
    float fU;
    float fV;};
EN

回答 1

Stack Overflow用户

发布于 2014-06-15 06:13:22

对于未来的问题,你应该包括一些代码,这样人们就可以帮助你找出你犯了什么错误,而不是(重新)从头开始写所有东西。

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

  • 我只画一个空的圆圈。将其扩展到绘制一个环应该是很简单的,这实际上意味着添加第二个较小的圆。
  • 要画一个圆圈,通常要使用固定数量的点。假设我们至少要用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);
  • 有了你所有的观点,这应该是很容易创建一些可见的几何学。请记住,您可能需要添加一些偏移,以移动圆/环以及。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24223047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档