algorithm - 优化网格生成器
问题描述
我有一个普通的网格生成器,它采用一组立方体位置并计算它们的可见面。该算法花费了太多时间(显然),但它只运行一次。我应该如何优化这个东西,让它工作得更快?我不认为块是可以接受的,也许我应该使用另一种数据结构或以不同的方式处理位置。我希望你能帮我解决这个问题。谢谢。
Mesh MeshGenerator::GenerateMesh(std::vector<glm::vec3>& rawData)
{
Mesh mesh;
MeshFace meshFace;
bool left = false;
bool right = false;
bool front = false;
bool back = false;
bool down = false;
bool up = false;
int count = 0;
// Iterating thorugh blocks
for (glm::vec3 blockOrigin : rawData)
{
for (glm::vec3 block2Origin : rawData) {
// X: to left
if (block2Origin.x - blockOrigin.x == -1
&& block2Origin.y - blockOrigin.y == 0
&& block2Origin.z - blockOrigin.z == 0)
{
left = true;
count++;
}
// X: to right
if (block2Origin.x - blockOrigin.x == 1
&& block2Origin.y - blockOrigin.y == 0
&& block2Origin.z - blockOrigin.z == 0)
{
right = true;
count++;
}
// Z: to front
if (block2Origin.z - blockOrigin.z == 1
&& block2Origin.x - blockOrigin.x == 0
&& block2Origin.y - blockOrigin.y == 0)
{
front = true;
count++;
}
// Z: to back
if (block2Origin.z - blockOrigin.z == -1
&& block2Origin.x - blockOrigin.x == 0
&& block2Origin.y - blockOrigin.y == 0)
{
back = true;
count++;
}
// Y: to down
if (block2Origin.y - blockOrigin.y == -1
&& block2Origin.x - blockOrigin.x == 0
&& block2Origin.z - blockOrigin.z == 0)
{
down = true;
count++;
}
// Y: to up
if (block2Origin.y - blockOrigin.y == 1
&& block2Origin.x - blockOrigin.x == 0
&& block2Origin.z - blockOrigin.z == 0)
{
up = true;
count++;
}
if (count == 6) break;
count = 0;
}
if (!left)
{
meshFace.Color = glm::vec4(1,1,1,1);
meshFace.Position = blockOrigin;
meshFace.Face = 0;
mesh.AddMeshFace(meshFace);
}
if (!right)
{
meshFace.Color = glm::vec4(1, 1, 1, 1);
meshFace.Position = blockOrigin;
meshFace.Face = 1;
mesh.AddMeshFace(meshFace);
}
if (!front)
{
meshFace.Color = glm::vec4(1, 1, 1, 1);
meshFace.Position = blockOrigin;
meshFace.Face = 2;
mesh.AddMeshFace(meshFace);
}
if (!back)
{
meshFace.Color = glm::vec4(1, 1, 1, 1);
meshFace.Position = blockOrigin;
meshFace.Face = 3;
mesh.AddMeshFace(meshFace);
}
if (!down)
{
meshFace.Color = glm::vec4(1, 1, 1, 1);
meshFace.Position = blockOrigin;
meshFace.Face = 4;
mesh.AddMeshFace(meshFace);
}
if (!up)
{
meshFace.Color = glm::vec4(1, 1, 1, 1);
meshFace.Position = blockOrigin;
meshFace.Face = 5;
mesh.AddMeshFace(meshFace);
}
left = false;
right = false;
front = false;
back = false;
down = false;
up = false;
count = 0;
}
return mesh;
解决方案
推荐阅读
- python-3.x - 如何抑制 Python 中特定模块和隐藏类方法的输出?
- javascript - 获取类型错误
- json - Spring Boot 应用程序 POST 请求不起作用并且不更新数据库
- java - 从 Vaadin 中的另一个 UI 刷新网格
- angularjs - 如何在 ionic v1 应用程序中升级 angularjs 版本
- powershell - 编辑 Get-DirStats.ps1 以获取深度(子目录)参数
- r-markdown - 在 noweb 或 Rmarkdown 等 Literate Programming 工具中,代码块的执行顺序是如何确定的?
- python - 如何在python中杀死一个子进程
- html - 阴影与盒子阴影?
- javascript - Jquery 单击不适用于自定义光标(鼠标后的 div)