Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Отрисовка Бинарных Деревьев 
V
    Опции темы
Addidas
Дата 28.3.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Пишу я значит визуализацию бинарных деревьев. Суть задачи - есть класс для работы с бин. деревом. Надо по имеющемуся дереву отрисовать его в компаненте, скажем PaintBox, примитивами. То есть кружки и линии.
Библиотеки сторонние использовать крайне не хочу.
Среда разработки - Borland C++. Но даже если не кодом так помогите хотя бы подробным описанием алгоритма - как просчитать всё эту отрисовку. Дня три уже сижу - ничего путного пока не пришло в голову.
PM MAIL   Вверх
zim22
Дата 28.3.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



алгоритм отрисовки на VB
http://www.vb-helper.com/howto_net_fractal_binary_tree.html


--------------------
PM MAIL   Вверх
Addidas
Дата 28.3.2009, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Цитата(zim22 @ 28.3.2009,  08:48)
алгоритм отрисовки на VB
http://www.vb-helper.com/howto_net_fractal_binary_tree.html

Спасибо конечно за линк, но нельзя ли по русски и всё таки на С\С++... VB я не знаю и код что там приведён - адские письмена...
PM MAIL   Вверх
zim22
Дата 28.3.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(Addidas @  28.3.2009,  08:55 Найти цитируемый пост)
Спасибо конечно за линк, но нельзя ли по русски и всё таки на С\С++... VB я не знаю и код что там приведён - адские письмена...

I have been translating it personally for you. Enjoy!
Код
Рекурсивная рисовалка ветки бинарного дерева
void DrawBranch(CDC *dc, int depth, int X, int Y, double length, double theta, double length_scale, double dtheta)
{
   int x1, y1;
   // Определим, где текущий ветка должна заканчиваться.
   x1 = (X + length * cos(theta));
   y1 = (Y + length * sin(theta));
   dc->DrawLine(X, Y, x1, y1);
   // Если глубина больше 1, отрисовать подветки
   if (depth > 1)
   {
       DrawBranch(dc, depth - 1, x1, y1, length * length_scale, theta + dtheta, length_scale, dtheta);
       DrawBranch(gr, depth - 1, x1, y1, length * length_scale, theta - dtheta, length_scale, dtheta);
   }
}





--------------------
PM MAIL   Вверх
Addidas
Дата 28.3.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Thanks 4 your translating for me personal but may be u explain me parametrs that function.
cdc - я понял это контекст устройства на котором рисуем...
depth - глубина текущего узла
X Y - относительно каких координат начинаем рисовать - так?
остальные параметры загадка 4 me
PM MAIL   Вверх
zim22
Дата 28.3.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(Addidas @  28.3.2009,  10:02 Найти цитируемый пост)
X Y - относительно каких координат начинаем рисовать - так?

наверно. это не моя функция, не могу точно знать.

Цитата(Addidas @  28.3.2009,  10:02 Найти цитируемый пост)
стальные параметры загадка 4 me

double length - длина какая-то.
double theta, double dtheta - поставь туда значения разные, посмотри что происходит.
double length_scale - это масштаб сужения / растягивания изображения




--------------------
PM MAIL   Вверх
Addidas
Дата 28.3.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Посмотрел функцию - отрисовку делает тока в общем виде... то есть рисует явно - узел и 2 потомка.... моя же задача стоит отрисовывать по существующему дереву... то есть могут быть все 2^(n-1) узлов на каждом уровне.. .а могут быть узлы у которых только по одному потомку... ну для пример
      2
     / \
    1  3
   / \   \
  0  2  4

тут вот у узла 1 - два потомка, а у узла 3 - один... следовательно нарисовать надо
      ()
     /  \
    ()  ()
   /  \   \
  ()  ()  ()
ну это для примера.
той функцией такого не сделать!
PM MAIL   Вверх
Anikmar
Дата 30.3.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Может попробовать рисовать снизу вверх?
PM MAIL ICQ   Вверх
Addidas
Дата 31.3.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Да нее... я уже сам дошёл до решения... проще всё на самом деле... тока дерево получается растянутым... но масштабирование рулит и всё такое... всем спасибо..
PM MAIL   Вверх
zim22
Дата 31.3.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(Addidas @  31.3.2009,  15:33 Найти цитируемый пост)
я уже сам дошёл до решения... 

не хотите с нами поделиться?


--------------------
PM MAIL   Вверх
Addidas
Дата 3.4.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Идея проста... я завёл в деревьях для каждого узла три доп поля.... два поля это координаты - X и Y, а третье это поле указывающее какой это узел - левый, правый или корень... Далее рекурсивно расчитывал координаты по принципу - на каждый уровень дерева общую ширину холста надо делить на 2 ^ (текущий уровень)... ну и соответственно корень встанет ровно в серединку, а все остальные будут строиться относительно него уже... сам код :
Код

void Tree :: GNK(Tree *r, Tree *prev, int W, int Y, int L)
{
 int buf;

 buf = floor(W / pow(2, L));
 
 if(r != NULL)
    {

       if (prev == NULL)
        {
          r->x = buf;
                          r->y = Y;
        }
       else
        {    
         if (r->n == 'l')
          {
           r->x =prev->x - buf + 10;
           r->y = prev->y + 60;
          }
         else
          {
           if (r->n == 'r')
            {
              r->x = prev->x + buf - 10;
              r->y = prev->y + 60;
            }
          }
        }


       GNK(r->left,r,W,r->y, L + 1);
       GNK(r->right,r,W,r->y, L + 1);
    }
}


PM MAIL   Вверх
zim22
Дата 3.4.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Addidas, спасибо smile


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.