首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用DirectX 11制作椭圆

用DirectX 11制作椭圆
EN

Stack Overflow用户
提问于 2019-12-07 13:08:04
回答 1查看 129关注 0票数 0
代码语言:javascript
运行
复制
if(shapeType == ELLIPSE)
    {
        Vertex* v = new Vertex[31];
        v[0] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
        float theta;

        for(int i = 1; i < 30; ++i)
        {
            theta = (MATH::TWO_PI * i) / static_cast<float>(30);
            v[i] = { cos(theta * i), sin(theta * i), 1.0f, 0.0f, 0.0f };
        }


        HRESULT hr = this->vertexBuffer.Initialize(this->device, v,31);
        if (FAILED(hr))
        {
            ErrorLogger::Log(hr, "Failed to create vertex buffer.");
            return false;
        }

        DWORD* indices = new DWORD[90];

        int indiceHelperNum1 = 1;
        int indiceHelperNum2 = 2;

        for(int i = 0; i < 87; i += 3)
        {
            indices[i] = 0;
            indices[i + 1] = indiceHelperNum1;
            indices[i + 2] = indiceHelperNum2;

            indiceHelperNum1++;
            indiceHelperNum2++;
        }

        indices[84] = 0;
        indices[85] = 29;
        indices[86] = 1;

        hr = this->indexBuffer.Initialize(this->device, indices, 90);
        if (FAILED(hr))
        {
            ErrorLogger::Log(hr, "Failed to create indices buffer.");
            return false;
        }

        delete[] v;
        delete[] indices;
    }

这是我的代码,我认为这里除了内存分配没有任何问题。但是,当我尝试这段代码时,它不起作用。我想要一个半径为1的圆,其中心是原点。我用顶点取点,用索引做三角形。如果我的密码有问题请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-08 00:43:33

这个代码有几个问题。

主要问题在下面一行

代码语言:javascript
运行
复制
v[i] = { cos(theta * i), sin(theta * i), 1.0f, 0.0f, 0.0f };

没有理由把theta乘以i

一旦你解决了这个问题,你应该看到这样的事情。

注意图像右侧的问题区域。

为了缩小差距,需要修改最后三个指数。替换

代码语言:javascript
运行
复制
indices[84] = 0;
indices[85] = 29;
indices[86] = 1;

使用

代码语言:javascript
运行
复制
indices[87] = 0;
indices[88] = 30;
indices[89] = 1;

最后一件事是,要填充顶点的for循环不是在索引30处填充最后一个顶点。调整for循环范围如下

代码语言:javascript
运行
复制
for (int i = 1; i < 31; ++i)
{
    theta = (MATH::TWO_PI * i) / static_cast<float>(30);
    v[i] = { cos(theta ), sin(theta ), 1.0f, 0.0f, 0.0f };
}

最后,你应该看到这样的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59226295

复制
相关文章

相似问题

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