首页 文章

C编程语言三角形邻接

提问于
浏览
3

对不起上次问的问题不清楚现在改写它

有使用2D矩阵表示的板,如下所示


[
{0 0 1 0 1 1 0 1 0 0 1 1},
{0 1 1 0 1 0 0 1 1 0 0 1},
{0 0 0 0 0 0 0 1 0 0 0 0}
]

  • 每当看到00时,它表示0 0表示矩阵中有一些空格

  • 相邻意味着找到另一个共享相同索引或接触另一个三角形的三角形意味着必须有水平或垂直三角形,如下面的类型2所示

如果在使用1表示的矩阵中连接3个点,则将形成一个直角三角形,有四种类型的直角三角形

类型示例在上面的矩阵中


Type1 : a[0][2],a[1][1],a[1][2] Type2 : a[0][4],a[0][5],a[1][4] and a[1][7],a[1][8],a[2][7] Type3 : a[0][7],a[1][7],a[1][8] Type4 : a[0][10],a[0][11],a[1][11]


当连接所有三个顶点时,给出四个类型中的任何一个的直角三角形 . 在上面的例子中,有两个直角三角形彼此相邻(意味着两个连续的水平或垂直),即


a(0)(7), a(1)(7),a(1)(8)and a[1][7],a[1][8],a(2)(7)


需要有效的方法来遍历矩阵以找到板上每个三角形图案的计数,其中使用N * N矩阵表示有一些条件1:如果任何三角形与任何类型的两个三角形相邻,那么它将不计入2:1单元格由任何三角形共享公共单元格的一个三角形类型使用,然后它将不被计数

我对图表知之甚少,但我尝试了这个逻辑使用1:为每个三角形类型2定义矩阵2 * 2:确定2 * 2矩阵的粒度板,表示10 * 2的矩阵使板3每2 * 2块使用每个类型的memcmp意味着每个块上有四个内存比较功能

但这不起作用,因为三角形永远不能对齐阻止它可以从板的奇数索引开始做完一些研究之后这可以用图形来实现,但仍然不知道如何在图上搜索模式请提供一些输入和一些学习练习,以更详细地了解这些问题

1 回答

  • 1

    此回复可能无法回答您的整个问题,但至少会有一些代码需要讨论 . 我认为很难对块进行memcmp,因为三角形的2x2块在两个不同位置的内存中被放置为2 2个数据块 . Memcmp假设您的所有数据都在连续的内存中 .

    下面的代码有find_triangles函数,我们可以继续讨论和改进 . 它将每个三角形定义为单个点,即两条线的交点 . 要成为一个三角形,交点必须为1.一旦我们很容易找到可能的交点,下一个问题是该点是否真的是任何三角形和三角形的真实交点 . 我将类型存储为结果中的位域 .

    主要功能可能不那么容易阅读,但它只是简短并打印结果作为概念证明 .

    #include <stdio.h>
    
        #define TYPE1 0x01
        #define TYPE2 0x02
        #define TYPE3 0x04
        #define TYPE4 0x08
    
        void find_triangles(int h, int w, int data[h][w], int res[h][w])
        {
           int x, y;
    
           for(y=0; y<h; y++)
              for(x=0; x<w; x++)
                 if(data[y][x])
                    res[y][x] =
                       TYPE1*(y && data[y-1][x]) * (x && data[y][x-1])|
                       TYPE2*((y<(h-1)) && data[y+1][x]) * ((x<(w-1)) && data[y][x+1])|
                       TYPE3*(y && data[y-1][x]) * ((x<(w-1)) && data[y][x+1])|
                       TYPE4*((y<(h-1)) && data[y+1][x]) * (x && data[y][x-1]);
                    else
                       res[y][x] = 0; 
        }
    
        int main(int argc, char **argv)
        {
           #define DATA_WIDTH 12
           #define DATA_HEIGHT 3
           int data[DATA_HEIGHT][DATA_WIDTH]={
              {0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1},
              {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1},
              {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}};
           int result[DATA_HEIGHT][DATA_WIDTH];
           int x, y, type;
    
           find_triangles(DATA_HEIGHT, DATA_WIDTH, data, result);
    
           for(type=0; type<4; type++)
           {
              printf("Type%d : ", type+1);
              for(y=0; y<DATA_HEIGHT; y++)
                 for(x=0; x<DATA_WIDTH; x++)
                    if(result[y][x] & (1<<type))
                       printf("a[%d][%d],a[%d][%d],a[%d][%d] ",
                          y,x,
                          (type & 0x1) ? y+1 : y-1, x,
                          y, ((type >> 1)==(type & 0x1)) ? x-1 : x+1);
              printf("\n");
           }
           return 0;
        } /* main */
    

    我不认为我完全理解不应该计算哪些相邻三角形,但我希望这个代码示例将是一个开始的地方 .

相关问题