IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Графика, c++
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Подскажите пожалуйста, как реализовать графический вывод на экран графа и дерева, по соответствующим массивам: двумерному (список смежности) и одномерному соответственно.
Я реализовал алгоритм ПВШ на графе, и теперь это всё нужно наглядно выводить на экран...
С графикой на си++ не работал, поэтому Ваша помощь мне нужна, как никогда : )
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
сообщение
Сообщение #2


Гость






Цитата
С графикой на си++ не работал, поэтому Ваша помощь мне нужна, как никогда
В таком случае уточняй, что именно ты используешь: какой компилятор, какие графические библиотеки, какая ОС, в конце концов.

А вообще, вывод графа на экран - это еще та "песня". С деревьями проще. Только не совсем понятно, как это у тебя дерево представлено одномерным массивом? Ты что, само дерево не создавал?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 4.04.2009 1:47) *

В таком случае уточняй, что именно ты используешь: какой компилятор, какие графические библиотеки, какая ОС, в конце концов.

А вообще, вывод графа на экран - это еще та "песня". С деревьями проще. Только не совсем понятно, как это у тебя дерево представлено одномерным массивом? Ты что, само дерево не создавал?


Компилятор у меня GCC (DEV C++ использую), ос Window Xp, библиотеки, наврено, все стандарные...

Это представление наподобие, как в турнирной ортировке, к примеру, используется.
Вот так: 378492 - массив,
дерево должно выглядеть:
3
7 8
4 9 2
Число вершин в графе от 12 до 15.
Как дерево строить, пиблизительно понятно, но опять же всё в графику упирается...а вот граф из матрицы смежностей- это жестоко.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(Rocket @ 4.04.2009 9:01) *
Компилятор у меня GCC (DEV C++ использую), ос Window Xp, библиотеки, наврено, все стандарные...
Хм... Ладно. Задам вопрос по-другому. У тебя приложение на данный момент какое? Консольное, или WinAPI-шное? Если хочешь, покажу как при помощи WinAPI нарисовать дерево (дополнительные библиотеки вроде того, что описано тут устанавливать не буду, не надо оно мне). Только ДЕРЕВО, а не массив, подразумевающий, что это дерево. Ибо из твоего массива мне, например, совсем непонятно, что и с чем на втором уровне связывается. 9 - это справа от семерки, или слева от 8-ки, к примеру.

Создавай дерево (чтобы было однозначно понятно, что с чем связано) и его отображай, в этом я могу тебе помочь. Не хочешь - извини, ничем помочь не могу.

С графом - у тебя тоже будет проблема. Или это получится ровные ряды кружков (узлов) и хаотично пересекающие друг друга ребра, или... Дипломы на этом пишут, отрисовать граф так, чтобы не было пересечения ребер... Ты что выбираешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 4.04.2009 11:16) *

Хм... Ладно. Задам вопрос по-другому. У тебя приложение на данный момент какое? Консольное, или WinAPI-шное? Если хочешь, покажу как при помощи WinAPI нарисовать дерево (дополнительные библиотеки вроде того, что описано тут устанавливать не буду, не надо оно мне). Только ДЕРЕВО, а не массив, подразумевающий, что это дерево. Ибо из твоего массива мне, например, совсем непонятно, что и с чем на втором уровне связывается. 9 - это справа от семерки, или слева от 8-ки, к примеру.

Создавай дерево (чтобы было однозначно понятно, что с чем связано) и его отображай, в этом я могу тебе помочь. Не хочешь - извини, ничем помочь не могу.

С графом - у тебя тоже будет проблема. Или это получится ровные ряды кружков (узлов) и хаотично пересекающие друг друга ребра, или... Дипломы на этом пишут, отрисовать граф так, чтобы не было пересечения ребер... Ты что выбираешь?


Приложение у меня сейчас консольное. 9 справа от семерки (то есть 4 и 9 потомки 7, а 2 потомок 8)... Весь алгоритм ПВШ у меня основывается на работе с массивами, по этому конечный результат у меня тоже вот массив. Как теперь из него сделать дерево,я вообще не представляю.
С графом я выбираю самый простой и наглядный вариант, наверно ряды кружков (ну или по кругу их можно расположить) и пересекающиеся ребра...

P.S. Прикрепил исходную программу.

Вобщем понял я свои заблуждения, касающиеся массива - действительно из такого представления нельзя восстановить дерево корректно. Теперь я буду также делать и для дерева матрицу смежностей, а задача построения графа и дерева вобщем сводится к одному типу рисунка...

Сообщение отредактировано: Rocket -


Прикрепленные файлы
Прикрепленный файл  xxx.cpp ( 2.92 килобайт ) Кол-во скачиваний: 312
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот доработанная программа - дерево хранится в двумерном массиве, ввиде матрицы смежностей.
Как всё-таки это нарисовать?... задача сводится к выводу графа и дерева( выглядит как граф, в принципе, но четко со структой дерева,) из матрицы смежностей.


Прикрепленные файлы
Прикрепленный файл  xxx.cpp ( 3.25 килобайт ) Кол-во скачиваний: 310
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Что-то обсуждение темы зашло в тупик... volvo, у тебя же были какие-то идеи?
От безысходности решил писать матрицы в файлы, а потом паскалевской программой их открывать и рисовать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






У меня и сейчас есть идеи, но ты ж молчишь насчет того, устроит ли тебя WinAPI? А я устанавливать дополнительные библиотеки не собираюсь, не надо их мне... Другого пути (без установки доп. библиотек) рисовать с использованием С++, к сожалению, еще не придумали.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 6.04.2009 22:53) *

У меня и сейчас есть идеи, но ты ж молчишь насчет того, устроит ли тебя WinAPI? А я устанавливать дополнительные библиотеки не собираюсь, не надо их мне... Другого пути (без установки доп. библиотек) рисовать с использованием С++, к сожалению, еще не придумали.

А с помощью WinAPI граф и дерево, будут восстановлены из матриц?

Добавлено через 12 мин.
Вобщем, на чём будет основываться принцип построения с помощью WinAPI, и что для него нужно?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Что-то дело не сдвигается с мертвой точки...походу придется переходить к плану Б)
volvo, что же всё-таки с тоей WinAPI-шной реализацией?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Хм... Ну, сначала - ответ на предыдущий вопрос:
Цитата
на чём будет основываться принцип построения с помощью WinAPI, и что для него нужно?
Основываться будет на том же, на чем ты хочешь основывать рисование с использованием модуля Graph из Паскаля. Только вместо примитивов модуля Graph (Line, Circle, PutPixel и т.д.) будут использоваться графические примитивы WinAPI: MSDN -> Line and Curve Functions и MSDN -> Filled Shape Functions

Отрисовывается на самом деле очень просто: тебе известно, сколько у тебя узлов в графе, так? вот и рисуешь столько кружков на экране. Я бы их расположил в вершинах правильного N-угольника, я когда-то показывал, как это делать, воспользуйся поиском. Заодно запоминаешь, в каких координатах расположена каждая вершина (простой массив структур). А потом уже по матрице смежности выясняешь, с какими вершинами связана первая - протягиваешь от первой к ним линии (ребра). Покажи, как ты хранишь матрицу смежности, чтоб не делать двойную работу, я набросаю тебе отображение графа.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






В общем, вот отображение графа, заданного матрицей смежности:
#include <windows.h>
#include <stdio.h>
#include <math.h>

#define BTN_ID 110

#define SIZE 5
#define R 150
#define E 30

POINT vertex[SIZE];
int adj_mx[SIZE][SIZE] = {
{0, 0, 1, 1, 0},
{0, 0, 0, 1, 1},
{1, 0, 0, 0, 1},
{1, 1, 0, 0, 0},
{0, 1, 1, 0, 0}
};

char szClassName[ ] = "CodeBlocksWindowsApp";
HWND hwnd;

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT r;
switch (message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hMyDC = BeginPaint(hwnd, &ps);

GetClientRect(hwnd, &r);

int center_x = (r.right - r.left) / 2;
int center_y = (r.bottom - r.top) / 2;
double angle = 2 * M_PI / SIZE;
for(int i = 0; i < SIZE; i++) {
vertex[i].x = center_x + (int)(R * cos(M_PI/2 + i * angle));
vertex[i].y = center_y - (int)(R * sin(M_PI/2 + i * angle));
}

HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
HGDIOBJ hpenOld = SelectObject(hMyDC, hPen);
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
if(adj_mx[i][j]) {
MoveToEx(hMyDC, vertex[i].x, vertex[i].y, NULL);
LineTo(hMyDC, vertex[j].x, vertex[j].y);
}
}
}

for(int i = 0; i < SIZE; i++) {
Ellipse(hMyDC, vertex[i].x - E/2, vertex[i].y - E/2,
vertex[i].x + E/2, vertex[i].y + E/2);
RECT r;
r.left = vertex[i].x - E/2; r.right = vertex[i].x + E/2;
r.top = vertex[i].y - E/2; r.bottom = vertex[i].y + E/2;

char s[3] = {0};
sprintf(s, "%d", i + 1);
DrawText(hMyDC, s, -1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
SelectObject(hMyDC, hpenOld);
DeleteObject(hPen);

EndPaint(hwnd, &ps);
}
break;

case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
MSG messages;
WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

if (!RegisterClassEx(&wincl)) return 0;

hwnd = CreateWindowEx (
0,
szClassName,
"Graph Test",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
500,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);

ShowWindow (hwnd, nCmdShow);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}

return messages.wParam;
}

Вот что получается в результате:


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


volvo , а как это откомпилировать и выполнить? У меня на Dev C++ не компилируется - создаю проект WinAPI приложение, запускаю, а мне приходит сообщение, что проект не откомпилирован... А если не через проект, просто через исходный cpp-шный файл, то компилятор мне выдает следующее :
Цитата
[Linker error] undefined reference to `CreatePen@12'
[Linker error] undefined reference to `SelectObject@8'
[Linker error] undefined reference to `MoveToEx@16'
...
ld returned 1 exit status


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Это не Компилятор, а Компоновщик (он же Линкер). Компилятор претензий к программе не имеет. А вот линкер пишет тебе, что не может найти сами реализации WinAPI-шных функций. Убедись, что к проекту подключены библиотеки gdi32, user32 и kernel32 (я не знаю, как это делается в DevCpp у меня в CodeBlocks: Project -> Build Options -> закладка Linker settings, и там добавляешь библиотеки), или линкуй с этими библиотеками из командной строки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 8.04.2009 17:44) *

Это не Компилятор, а Компоновщик (он же Линкер). Компилятор претензий к программе не имеет. А вот линкер пишет тебе, что не может найти сами реализации WinAPI-шных функций. Убедись, что к проекту подключены библиотеки gdi32, user32 и kernel32 (я не знаю, как это делается в DevCpp у меня в CodeBlocks: Project -> Build Options -> закладка Linker settings, и там добавляешь библиотеки), или линкуй с этими библиотеками из командной строки...

А где вообще взять эти библиотеки?
Я скачал CodeBlocks, для WinAPI-шной реализации нужно создавать проект console application или другой какой?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Так-с, нашел эти библиотеки (libuser32.a, libkernel32.a, libgdi32.a) в библиотеках для Dev C++. Создаю console application в CodeBlocks, добавляю эти библиотеки...и запускаю, вобщем опять безрезультатно :
Цитата
"sss - Debug" uses an invalid compiler. Skipping...
Nothing to be done.

Скриншот прилагаю... В чём опять косяк?


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






В окне "Build Log" все написано: ты не установил правильный компилятор. Закрой проект (File -> Close all projects), зайди в "Settings -> Compiler and Debugger", и в верхнем комбобоксе установи компилятор "Cygwin GCC" как компилятор по умолчанию (путь к компилятору должен быть прописан там же, на вкладке Toolchain Executables:
Прикрепленное изображение
).

Это во-первых. А во-вторых, почему Console Application? Все-таки, "Win32 GUI Project"...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 8.04.2009 19:28) *

В окне "Build Log" все написано: ты не установил правильный компилятор. Закрой проект (File -> Close all projects), зайди в "Settings -> Compiler and Debugger", и в верхнем комбобоксе установи компилятор "Cygwin GCC" как компилятор по умолчанию (путь к компилятору должен быть прописан там же, на вкладке Toolchain Executables:
Прикрепленное изображение
).

Это во-первых. А во-вторых, почему Console Application? Все-таки, "Win32 GUI Project"...


Всё сделал, как описано выше. Но теперь происходит следующее (см. скриншот) В чем сейчас причина?


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






То есть, EXE-файл создался, и не запускается? Отдельно от IDE, из Explorer-а тоже не запускается? Что говорит?

Тогда попробуй создать новое приложение, Win32 GUI Project, Frame based, но оставить там все по умолчанию, то есть, тот код минимального Win32-приложения, который предлагает сама Code::Blocks. И сделать ему Build (Ctrl+F9) и запустить. Если и это не получится... Хм, что ж, значит не судьба тебе на Висте использовать Code Blocks...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 8.04.2009 20:09) *

То есть, EXE-файл создался, и не запускается? Отдельно от IDE, из Explorer-а тоже не запускается? Что говорит?

Тогда попробуй создать новое приложение, Win32 GUI Project, Frame based, но оставить там все по умолчанию, то есть, тот код минимального Win32-приложения, который предлагает сама Code::Blocks. И сделать ему Build (Ctrl+F9) и запустить. Если и это не получится... Хм, что ж, значит не судьба тебе на Висте использовать Code Blocks...

Никакого exe-шника я не нашел. С минимальным Win32-приложением тоже ничего не выходит... Но, я это всё проделал на XP, и результат тот же самый! Вот что мне Build выдает:
Цитата

-------------- Build: Debug in graph ---------------

Compiling: main.cpp
Execution of 'g++.exe -Wall -g -c E:/CodeBlocks/graph/main.cpp -o obj/Debug/main.o' in 'E:\CodeBlocks\graph' failed.
Nothing to be done.

Это совсем гиблое дело?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 15:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name