Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2021, 11:13   #1
AlexSqr
Новичок
Джуниор
 
Регистрация: 05.05.2021
Сообщений: 2
По умолчанию Визуализация вставки ключа в B-Дерево C++ Qt

Всем добрый день. У меня есть класс В-Дерева, и мне необходимо визуализировать алгоритм вставки ключа. Но для начала мне надо хотя бы просто нарисовать дерево. Я использую Qt. Единственный способ который я придумал, это добавить в класс B-Дерева функцию рисования каждого узла по заготовленным координатам. При добавлении нового ключа задавать координату x и y каждому узлу и рисовать по этим координатам в graphicsView. Но у меня не получилось реализовать такой способ, так как не смог придумать универсальный алгоритм отрисовки, что бы все выглядело нормально и узлы не наезжали друг на друга. Может есть ещё какой-нибудь способ визуализации, или как мне доработать этот?
AlexSqr вне форума Ответить с цитированием
Старый 05.05.2021, 11:41   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Я не программирую в Qt (и вообще не программист), но думаю, что для получения подходящего изображения можно представить холст в виде таблицы, где ячейка - это узел.
Размеры холста и ширина и высота дерева (если они известны или могут быть оценены) позволяю определить размеры ячеек, а значит и положение узлов.
Но это так, в общем виде ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.05.2021, 11:51   #3
AlexSqr
Новичок
Джуниор
 
Регистрация: 05.05.2021
Сообщений: 2
По умолчанию

Я высчитывал ширину каждого узла, и исходя из степени дерева пытался расставить равномерно их на сцене. И вроде идея рабочая, но реализация вышла не рабочая.
Если это как-то поможет, вот что у меня вышло(2 функции, расставление координат и рисование узла)
Код:
void BTree::set_coordinate(BTreeNode *node)
{
    if(node == root)
    {
        node->x = 400-30*(node->n/2);
        node->y = 15;
    }else
    {
        int i=0;
        while(node->keys[0]>node->parent->keys[i])
        {
            i++;
            if(node->parent->keys[i+1] == NULL)
                break;
        }
        node->x = (node->parent->x-180*3) + i*180; /* в данном примере, степень 3 => максимум 5 ключей, на каждый ключ по 30 => каждый узел выйдет максимум на 150 + 30 отступ до следующего узла */
        node->y = node->parent->y+50;
    }
    if(!node->leaf)
    {
        for(int i=0;i<2*t;++i)
        {
            if(node->C[i] != nullptr)
                set_coordinate(node->C[i]);
        }
    }
}
Код:
void BTree::printNode(BTreeNode *node)
{
    node->setWidth();
    if(node->n != 0)
    {
        QPen pen(Qt::black);
        pen.setWidth(3);
        scene->addRect(QRectF(node->x, node->y, node->width, node->hight), pen);
        for(int i = 0, space = 30; i < node->n; i++, space+=30)
        {
            scene->addLine(QLine(node->x+space, node->y, node->x+space, node->y+30), pen);
            text = scene->addText(QString::number(node->keys[i]), QFont("Arial", 12));
            text->setPos(node->x-20+space, node->y+3);
        }
        for(int i = 0, space = 0; i < 2*t; ++i, space += 30)
        {
            if(node->C[i]!=nullptr)
                scene->addLine(QLine(node->x+space, node->y+30, node->C[i]->x+(30*node->n / 2), node->C[i]->y), pen);
        }
    }
    if(!node->leaf)
    {
        for(int i=0;i<2*t-1;++i)
        {
            if(node->C[i]!= nullptr)
                printNode(node->C[i]);
        }
    }
}
AlexSqr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Визуализация аудиоданных shizzoidman Моделирование, изометрия, photoshop, 3d редакторы 1 09.04.2017 12:00
C# Задание с деревьями 1)Построить двоичное дерево и вывести его на экран 2)построить двоичное дерево поиска ekzo Фриланс 3 21.01.2017 06:23
C# Задание с деревьями 1)Построить двоичное дерево и вывести его на экран 2)построить двоичное дерево поиска ekzo Помощь студентам 0 20.01.2017 12:00
Визуализация рекурсии fs444 Общие вопросы C/C++ 5 04.04.2010 23:31
Визуализация ekzobyte Мультимедиа в Delphi 1 18.03.2009 18:11