Войти
ПрограммированиеФорумИгровая логика и ИИ

Алгоритм обхода поля (двумерного массива) по спирали (улитке) (2 стр)

Страницы: 1 2
#15
13:14, 11 сен. 2019

Alopar
> Круто, но разобраться в ней не просто :)))
Что не просто то? Там готовая функция, ctrl+C/ctrl+V. В функцию передаешь индекс, в ответ получаешь координаты


#16
(Правка: 12 сен. 2019, 3:00) 15:57, 11 сен. 2019

MrShoor
> Что не просто то?
>Там готовая функция, ctrl+C/ctrl+V. В функцию передаешь индекс, в ответ получаешь координаты
1) специфика gws:

  • другой синтаксис
  • другие типы (и "свои" типы тоже не опишешь)
  • свои функции писать как бы нельзя - скрипты пишутся только на движковые евенты

  • 2) если человек не знаком с шейдерами, то придёться ещё и шейдерный язык понять

    если у человека трудности с "улиткой", то будут ли трудности с двумя пунктами выше?!

    #17
    18:00, 11 сен. 2019

    exchg

    А можно хоть небольшой кусок кода, а то как то не варится в голове эта геометрия, грани, вершины...
    Да, вот для чего нужна была геометрия с алгеброй в школе :), ранее при разработке веб приложений вообще ничего это не надо было, кнопка тут, кнопка здесь, выборка тут, транзакция там.
    О бизнес, бизнес, какой же ты простой :)))

    #18
    18:05, 11 сен. 2019

    skalogryz

    И то верно, просто когда смотришь на код, надо сначала понять синтаксис, а этот я точно не знаю. Ну а только потом вникнуть в алгоритм.

    #19
    (Правка: 19:06) 18:16, 11 сен. 2019

    >Alopar

    А можно хоть небольшой кусок кода

    Я не знаю там про вершины и прочие штуки, но заполнить массив по спирали как у вас написано можно как-то так, например:

    + Показать

    Переделал, что бы визуально заполнение было видно:
    Ссылка на результат работы

    Может и не то что вам нужно.
    Результат вот:
    img=Скриншот 11-09-2019 18.12.14 | Алгоритм обхода поля (двумерного массива) по спирали (улитке)

    #20
    18:42, 11 сен. 2019

    > Код получается что-то вроде такого (не тестил)
    Тест:
    https://rextester.com/NUTW71130

    #21
    (Правка: 19:35) 19:00, 11 сен. 2019

    Alopar
    > А можно хоть небольшой кусок кода, а то как то не варится в голове эта
    > геометрия, грани, вершины...
    Вот псевдокод, именно так делать не нужно, это только для иллюстрации.

    typedef struct point
    {
        int x;
        int y;
    } point_t;
    
    
    typedef struct rect
    {
        point_t top_left;
        point_t bottom_right;
    } rect_t;
    
    
    static
    void rect_inflate(rect_t* r, int value)
    {
        r->top_left.x     -= value;
        r->top_left.y     -= value;
        r->bottom_right.x += value;
        r->bottom_right.y += value;
    }
    
    
    void move_x(point_t beg, point_t end, int delta)
    {
        point_t point = beg;
        int len = abs(end.x - beg.x);
        for (int u = 0; u < len; ++u)
        {
            point.x += delta;
            printf("[%2d,%2d] ", point.x, point.y);
        }
        printf("\n");
    }
    
    
    void move_y(point_t beg, point_t end, int delta)
    {
        point_t point = beg;
        int len = abs(end.y - beg.y);
        for (int u = 0; u < len; ++u)
        {
            point.y += delta;
            printf("[%2d,%2d] ", point.x, point.y);
        }
        printf("\n");
    }
    
    
    void fill(point_t* at)
    {
        rect_t r;
    
        r.top_left.x     = at->x - 1;
        r.top_left.y     = at->y - 1;
        r.bottom_right.x = at->x + 1;
        r.bottom_right.y = at->y + 1;
    
        point_t point;
        int size = 5;
        while (size--)
        {
            point.x = r.bottom_right.x;
            point.y = r.top_left.y;
    
            move_x(r.top_left, point, 1);
            move_y(point, r.bottom_right, 1);
    
            point.x = r.top_left.x;
            point.y = r.bottom_right.y;
    
            move_x(r.bottom_right, point, -1);
            move_y(point, r.top_left, -1);
    
            rect_inflate(&r, 1);
        }
    }
    
    int main()
    {
        point_t at = { 0, 0 };
        fill(&at);
    
        return 0;
    }

    На выходе будет что-то похожее на вот такое, я не проверял правильно оно или нет. (Вроди правильно)

    [ 0,-1] [ 1,-1] 
    [ 1, 0] [ 1, 1] 
    [ 0, 1] [-1, 1] 
    [-1, 0] [-1,-1] 
    [-1,-2] [ 0,-2] [ 1,-2] [ 2,-2] 
    [ 2,-1] [ 2, 0] [ 2, 1] [ 2, 2] 
    [ 1, 2] [ 0, 2] [-1, 2] [-2, 2] 
    [-2, 1] [-2, 0] [-2,-1] [-2,-2] 
    [-2,-3] [-1,-3] [ 0,-3] [ 1,-3] [ 2,-3] [ 3,-3] 
    [ 3,-2] [ 3,-1] [ 3, 0] [ 3, 1] [ 3, 2] [ 3, 3] 
    [ 2, 3] [ 1, 3] [ 0, 3] [-1, 3] [-2, 3] [-3, 3] 
    [-3, 2] [-3, 1] [-3, 0] [-3,-1] [-3,-2] [-3,-3] 
    [-3,-4] [-2,-4] [-1,-4] [ 0,-4] [ 1,-4] [ 2,-4] [ 3,-4] [ 4,-4] 
    [ 4,-3] [ 4,-2] [ 4,-1] [ 4, 0] [ 4, 1] [ 4, 2] [ 4, 3] [ 4, 4] 
    [ 3, 4] [ 2, 4] [ 1, 4] [ 0, 4] [-1, 4] [-2, 4] [-3, 4] [-4, 4] 
    [-4, 3] [-4, 2] [-4, 1] [-4, 0] [-4,-1] [-4,-2] [-4,-3] [-4,-4] 
    [-4,-5] [-3,-5] [-2,-5] [-1,-5] [ 0,-5] [ 1,-5] [ 2,-5] [ 3,-5] [ 4,-5] [ 5,-5] 
    [ 5,-4] [ 5,-3] [ 5,-2] [ 5,-1] [ 5, 0] [ 5, 1] [ 5, 2] [ 5, 3] [ 5, 4] [ 5, 5] 
    [ 4, 5] [ 3, 5] [ 2, 5] [ 1, 5] [ 0, 5] [-1, 5] [-2, 5] [-3, 5] [-4, 5] [-5, 5] 
    [-5, 4] [-5, 3] [-5, 2] [-5, 1] [-5, 0] [-5,-1] [-5,-2] [-5,-3] [-5,-4] [-5,-5]

    #22
    (Правка: 19:20) 19:19, 11 сен. 2019

    >exchg

    На выходе будет что-то похожее на вот такое, я не проверял правильно оно или нет

    Спираль вроде как из центра начинается... должно быть что то типа:

    555555555
    544444445
    543333345
    543222345
    543212345
    543222345
    543333345
    544444445
    555555555

    [4,4][4,5]
    [5,5]
    [5,4][5,3]
    [4,3][3,3]
    [3,4][3,5][3,6]
    [3,6][4,6][5,6][6,6]
    [6,5][6,4][6,3][6,2]
    [5,2][4,2][3,2][2,2]
    [2,3][2,4][2,5][2,6][2,7]
    [2,7][3,7][4,7][5,7][6,7][7,7]
    [7,6][7,5][7,4][7,3][7,2][7,1]
    [6,1][5,1][4,1][3,1][2,1][1,1]
    [1,2][1,3][1,4][1,5][1,6][1,7][1,8]
    [1,8][2,8][3,8][4,8][5,8][6,8][7,8][8,8]
    [8,7][8,6][8,5][8,4][8,3][8,2][8,1][8,0]
    [7,0][6,0][5,0][4,0][3,0][2,0][1,0][0,0]
    [0,1][0,2][0,3][0,4][0,5][0,6][0,7][0,8]

    P.S.
    Хотя может и одна фигня смотря где центр...

    #23
    19:33, 11 сен. 2019

    FourGen
    > Спираль вроде как из центра начинается... должно быть что то типа:
    Да, у меня вообще не обработана центральная точка. Это ошибка, нужно ее конечно добавить.

    #24
    19:40, 11 сен. 2019

    >exchg

    Да это мелочи, суть то такая же... я просто сразу не заметил. У меня во вписанные границы сделано, а у вас оно динамически расширается. Одинаково получается.

    Я просто запутался почему нулевые координаты меньше центра массива.

    Страницы: 1 2
    ПрограммированиеФорумИгровая логика и ИИ