在 0 和 1 网格中找到所有三角形的最快方法

发布于 2025-01-12 16:08:47 字数 2751 浏览 4 评论 0原文

考虑一个 5*5 大小的网格,由随机 0(o)1(*) 组成。找到网格中所有三角形的最快方法是什么? 一个四边形只能被视为两个三角形。

    /*
    ///
    singleP:   
    o o o o o
    o o * o o
    o o o o o


    triangles:
    face1_1,face1_2,face1_3; face2_1,face2_2,face2_3
    i, i+1, i+width, i+1, i+width, i+width+1
    o o o o o
    o o * * o
    o o * * o
    o o o o o

    e.g.
    5*5 grid:
    o o o o o
    * o * * o
    o o * * o
    * * o o o

    input:
    -indices: 5, 7, 8, 12,15,16
    -width:5
    -height: 5
    output:
    -isolatedPoints: 5, 15, 16
    -triFace: 7,8,12; 8,12,13
    ///
    */

一个四边形可以被视为两个三角形:

*-* 
|/| 
*-*

像这样的图案可以被视为三个三角形和一个孤立点:

   * *-*-* 
      \|/| 
       *-*

这是我当前的 c++ 代码:

 long extractTriangle(vector<int> indices, int width, int height, 
    vector<int>* singleP, vector<int>*triFace)
{
vector<int> flag(width*height, 0);
int maxInd = (width)*(height - 1) - 1;
for (int i = 0; i < indices.size(); i++)
    flag[indices[i]] = 1;


for (int i = 0; i < indices.size(); i++)
{
    int c = indices[i]; //c:center
    int down = indices[i] + width;
    if (down > maxInd)
        continue;

    int downleft = indices[i] + width - 1;
    int downright = indices[i] + width + 1;

    //left down triangle
    //o c
    //* *       
    if (flag[down] && flag[downleft])
    {
        triFace->push_back(c);
        triFace->push_back(downleft);
        triFace->push_back(down);
        flag[c] = 2;
        flag[downleft] = 2;
        flag[down] = 2;
    }
    int right = indices[i] + 1;
    if (right > maxInd)
        continue;
    //right down quad
    //c *
    //* *
    if (flag[down] && flag[right] && flag[downright])
    {
        triFace->push_back(c);
        triFace->push_back(down);
        triFace->push_back(right);
        flag[c] = 2;
        flag[down] = 2;
        flag[right] = 2;
    }
    // up right triangle
    //c *
    //* o
    else if (flag[down] && flag[right])
    {
        triFace->push_back(c);
        triFace->push_back(down);
        triFace->push_back(right);
        flag[c] = 2;
        flag[down] = 2;
        flag[right] = 2;
    }
    // down right triangle
    //c o
    //* *
    else if (flag[down] && flag[downright])
    {
        triFace->push_back(c);
        triFace->push_back(down);
        triFace->push_back(downright);
        flag[c] = 2;
        flag[down] = 2;
        flag[downright] = 2;
    }

}
for (int i = 0; i < indices.size(); i++)
    if (flag[indices[i]] == 1)
        singleP->push_back(indices[i]);
return 0;
}

Consider a grid of say 5*5 size consisting of random 0(o) and 1(*). What is the fastest way to find all triangles in the grid?
A quad can be regarded as only two triangles.

    /*
    ///
    singleP:   
    o o o o o
    o o * o o
    o o o o o


    triangles:
    face1_1,face1_2,face1_3; face2_1,face2_2,face2_3
    i, i+1, i+width, i+1, i+width, i+width+1
    o o o o o
    o o * * o
    o o * * o
    o o o o o

    e.g.
    5*5 grid:
    o o o o o
    * o * * o
    o o * * o
    * * o o o

    input:
    -indices: 5, 7, 8, 12,15,16
    -width:5
    -height: 5
    output:
    -isolatedPoints: 5, 15, 16
    -triFace: 7,8,12; 8,12,13
    ///
    */

A Quad can be regarded as two triangles:

*-* 
|/| 
*-*

A pattern like this can be regarded as three triangles and an isolated point:

   * *-*-* 
      \|/| 
       *-*

This is my current code in c++:

 long extractTriangle(vector<int> indices, int width, int height, 
    vector<int>* singleP, vector<int>*triFace)
{
vector<int> flag(width*height, 0);
int maxInd = (width)*(height - 1) - 1;
for (int i = 0; i < indices.size(); i++)
    flag[indices[i]] = 1;


for (int i = 0; i < indices.size(); i++)
{
    int c = indices[i]; //c:center
    int down = indices[i] + width;
    if (down > maxInd)
        continue;

    int downleft = indices[i] + width - 1;
    int downright = indices[i] + width + 1;

    //left down triangle
    //o c
    //* *       
    if (flag[down] && flag[downleft])
    {
        triFace->push_back(c);
        triFace->push_back(downleft);
        triFace->push_back(down);
        flag[c] = 2;
        flag[downleft] = 2;
        flag[down] = 2;
    }
    int right = indices[i] + 1;
    if (right > maxInd)
        continue;
    //right down quad
    //c *
    //* *
    if (flag[down] && flag[right] && flag[downright])
    {
        triFace->push_back(c);
        triFace->push_back(down);
        triFace->push_back(right);
        flag[c] = 2;
        flag[down] = 2;
        flag[right] = 2;
    }
    // up right triangle
    //c *
    //* o
    else if (flag[down] && flag[right])
    {
        triFace->push_back(c);
        triFace->push_back(down);
        triFace->push_back(right);
        flag[c] = 2;
        flag[down] = 2;
        flag[right] = 2;
    }
    // down right triangle
    //c o
    //* *
    else if (flag[down] && flag[downright])
    {
        triFace->push_back(c);
        triFace->push_back(down);
        triFace->push_back(downright);
        flag[c] = 2;
        flag[down] = 2;
        flag[downright] = 2;
    }

}
for (int i = 0; i < indices.size(); i++)
    if (flag[indices[i]] == 1)
        singleP->push_back(indices[i]);
return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文