Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
ВнизTCanvas Найти похожие ветки
← →
alll_23 (2007-11-13 16:46) [0]Здравствуйте, я делаю программу по графическому построению графа(в качестве вершин графа у меня применяется компонент TShape(создаётся динамически по действию), в качесве рёбер просто ресую линию на ТImage методами MoveTo и LineTo при этом параллельно в матрицу инцендентности(извените если не правильно) заносится еденичка для тех вершин от которой до которой прорисовывается линия(марица нулевая динамическая кол-во вершин на кол-во вершин ) и всё
у меня нормально работает(соеденяю вершины разрываю всё это отображается в матрице и в графическом представлении связей на экране), разрывая связи в матрицу присваевается ноль а линия прорисовывалась белым цветом так как я не знаю каким методом правильно ее стереть. Но вопрос в следующем: я хочу премещать
Вершину при этом должны прорисовываться все ёё связи тоже это получается но не совсем, не пойму как стереть статые координаты и даже если я их "сотру" таким способом как присваевания просто белого цвета на белом фоне тогда у меня сотрётся какая то часть какой то линии которая ёё может пересекать.
Ой вот это я накрутил, вобщем подскажите как при перемещении вершины ёё связи-линии не стирали другие.
← →
Kolan © (2007-11-13 16:48) [1]Итого твой вопрос сводится к:
Как стереть линию, нарисованную наTCanvas
методамиMoveTo и LineTo
.
← →
Рамиль © (2007-11-13 16:53) [2]Не пойму проблемы..
Перерисвывай в OnPaint всю видимую область (затирай все и рисуй все линии)
Если надо перерисовать принудительно, например после изменения координат, вызывай Invalidate.
И используй TPaintBox.
← →
alll_23 (2007-11-13 16:53) [3]Может какими то другими методами
← →
alll_23 (2007-11-13 16:56) [4]Дело в том что линий этих может быть много и надо хранить данный для методов рисования в массиве
← →
alll_23 (2007-11-13 17:01) [5]Ну вот смотрите как полезен форум сам дал ответ на свой вопрос правда я думал можно как то пропроще.
А ребята пока я сдесь, скажите пожалуйста как избавиться от этого мерзкого мерцания на Timage, и всё таки скажите как правильно стереть линию может есть такой метод который сотрёт ее и не сотрёт пиксели пересекающих линий.
← →
Рамиль © (2007-11-13 17:02) [6]Других методов нет, и не может быть. Ну с натяжкой если XOR ом рисовать. На самом деле Image пихает все в битмап, и перерисовает при поступлении WM_PAINT. А это надо делать тебе самому.
> Дело в том что линий этих может быть много и надо хранить
> данный для методов рисования в массиве
Места жалко что ли?
← →
Рамиль © (2007-11-13 17:03) [7]
> А ребята пока я сдесь, скажите пожалуйста как избавиться
> от этого мерзкого мерцания на Timage
> Рамиль © (13.11.07 16:53) [2]
> И используй TPaintBox.
Ну еще DoubleBuffered можно выставить.
← →
Kolan © (2007-11-13 17:06) [8]Предлогая тебе не пользовать массив. А завести объект
TУзел
(можешь сделать его птомком TShape
).TУзел = class(TShape)
FСписокСвязаныхУзлов: TСписокСвязаныхУзлов;
end;
И работать с сетью объектов, а не с массивом.
← →
alll_23 (2007-11-13 17:08) [9]Да не нужен мне такой объект у меня всё в матрице ведь хранится!!!
← →
Anatoly Podgoretsky © (2007-11-13 19:05) [10]В TCanvas никаких линий нет, редакторы так не делают, редактор должен все перисовывать в соотвествии с Z-order, делая недействительной нужную область.
← →
alll_23 (2007-11-15 13:20) [11]А что такое Z-order, и что такое недействительная область? Что это и где про это узнать можно?
← →
KSergey © (2007-11-15 14:29) [12]> alll_23 (15.11.07 13:20) [11]
> А что такое Z-order, и что такое недействительная область?
> Что это и где про это узнать можно?
Z-order - это порядок расположения рисуемых объектов по мнимой оси, расположенной перпендикулярно плоскости монитора
По сути просто показывает в каком порядке объекты отрисовывать: первыми те, что лежат "глубже" (т.е. как бы дальше от пользователя).
Недействительная область - часть окна (или все окно) которое в данный момент времени виндовс заставляет тебя перерисовать.
Сейчас меня закидают помидорами, но скажу, что для учебной задачи вполне можно все окно стереь и заново отрисовать на OnPaint.
Только для всех этих штук надо обязательно выполнить
> Рамиль © (13.11.07 16:53) [2]
> Перерисвывай в OnPaint всю видимую область (затирай все
> и рисуй все линии)
> Если надо перерисовать принудительно, например после изменения
> координат, вызывай Invalidate.
> И используй TPaintBox.
Иначе разговаривать не о чем, твои проблемы с частичным затиранием иначе не решить. (Можно вычислять где линии пересекаются и эти точки дорисовывать, но это извращение в чистом виде.)
На момент пока мышью перемещают объект - все перемещаемые объекты надо рисовить с маской XOR. При этом рисовать и стирать с одинаковыми настройками -тогад оно будет рисоваться и (при последующей отрисовке) стираться. А потом вызвать invalidate - и все уже хорошо перерисуется
← →
alll_23 (2007-11-15 16:38) [13]Ага понятно, спасибо буду пробовать. А так не получится как вы думаете?
Если брать и создавать ТImage(размеры при перетягивании его меняются) при перетягивании Он становится поферх моего основного TImage или PaintBox у ТImage pransperant=true рисуется на нём затем по MouseUp картинка копируется на основную область а тот ТImage фрикается.
← →
KSergey © (2007-11-15 16:46) [14]> alll_23 (15.11.07 16:38) [13]
Сделать можно всяко.
но предлагаю сделать правильно чтобы набить руку в правильных технологиях. Оно пригодится.
← →
alll_23 (2007-11-15 16:55) [15]Ага понятно я просто в скорях подумал что этим я реализую этот z-order
по введению дополнительного слоя и по Z а недействительная область это то что под этим слоем и оно не используеся, то есть на него ничего не действует
← →
@!!ex © (2007-11-15 17:07) [16]Z-order нафиг не нужен.
Все решается двойной буфферизацией(понятно надо забыть про компоненты и рисовать все ручками)
Вот примерно как должен выглядеть и работать
http://afera-net.narod.ru/GraphEditor.rar
манул тут:
http://afera-net.narod.ru/GraphHelpDOC.rar
← →
@!!ex © (2007-11-15 17:08) [17]Кстати, использовать матрицу для хранения связей между элементами графа - это идиотизм.
ГРаф сам по себе явялется великолепной структурой данных для хранения самого себя.
А деревья в массивах вы хранить не пробовали?
← →
alll_23 (2007-11-15 17:11) [18]Да понятно что место много занимает (Это курсовая моя) просто нужно реализовать некоторые алгоритмы по этом матрице.
← →
alll_23 (2007-11-15 17:13) [19]А я читал про то как ты (@!!ex) сдесь писал благодарности этому форуму, трогательно конечно, но действительно нормальный форум
← →
@!!ex © (2007-11-15 17:14) [20]> [19] alll_23 (15.11.07 17:13)
Это к чему?
← →
alll_23 (2007-11-15 17:19) [21]Да просто так
← →
alll_23 (2007-11-15 17:24) [22]
> А деревья в массивах вы хранить не пробовали?
Что вы издеваетесь что ли есть же TreeNode, я же говоря просто чтобы не вводить вручную эту матрицу нужно это построение
← →
@!!ex © (2007-11-15 17:38) [23]> [22] alll_23 (15.11.07 17:24)
Да, издеваюсь.
А покажите как выглядит ваш проект?
← →
Malik (2007-11-15 18:13) [24]
> А деревья в массивах вы хранить не пробовали?
Вообще то, деревья возможно хранить в массиве, мало того, даже некоторые БД основанные на релякционной системе спокойно хранят древо видные данные.
Что касается автора ветви,то от себя я могу сказать только одно:
"я представлю себе решение данной задачи так: заведи себе матрицу [4XN], где N-число ребер графа, где значения в массиве будут реальные координаты Шапов на канве формы или Имейджа (на твоё усмотрение)... дальше заводиш продцедуру, которая будет перерисовывать графическое представление графа в памяти (этот момент обязателен), при надобной тебе ситуации"
← →
@!!ex © (2007-11-15 18:27) [25]> Вообще то, деревья возможно хранить в массиве, мало того,
> даже некоторые БД основанные на релякционной системе спокойно
> хранят древо видные данные.
Я спорю чтоли?
В моем редакторе при сохранении получаеться линейная структура данных, которую без проблем можно запихать в массив... или в файл...
Но хранение данных такого вида в линейном виде во время работы приложения - это изврат полный...
← →
Virgo_Style © (2007-11-15 19:33) [26]> @!!ex © (15.11.07 17:08) [17]
> Кстати, использовать матрицу для хранения связей между элементами
> графа - это идиотизм.
Пойду расскажу об этом своему институтскому преподавателю, а то он не в курсе...
← →
@!!ex © (2007-11-15 19:56) [27]> [26] Virgo_Style © (15.11.07 19:33)
Я преподаю студентам программирование уже 2,5 месяца.
Разговор с самим собой - это шизофрения, поэтому сорри, вашему совету следовать не буду, ;)
← →
Virgo_Style © (2007-11-15 21:45) [28]> @!!ex © (15.11.07 19:56) [27]
Не "пойди расскажи", а "пойду расскажу". И напишу по всем адресам, выданным по запросу "теория графов матрица". По всем 93 500 адресам. Шоб знали)
← →
Virgo_Style © (2007-11-15 21:52) [29]Я такой редактор писал когда-то, кстати... Возможно даже, что он до сих пор лежит в Кладовке, ключевые слова - "формула Мейсона". Код там, конечно, такой, что я сам боюсь туда смотреть, но ведь работало же... %-)
Хотя... нет, по-моему, связи я при перетаскивании не рисовал, и данные сохранял как матрицу смежности.
← →
@!!ex © (2007-11-16 10:24) [30]> [28] Virgo_Style © (15.11.07 21:45)
Да вопрос не в том, можно или не можно.
А в том - удобно или нет.
ИМХО не очень...
← →
Virgo_Style © (2007-11-16 12:40) [31]> @!!ex © (16.11.07 10:24) [30]
А это уже смотря для чего. Если наш граф символизирует собой, ну не знаю, маршрут из дома на работу и обратно, а по пути расположены кинотеатр, автозаправка и гараж, и каждый пункт - это объект со своими свойствами, то зачем и как это держать в матрице - я себе действительно плохо представляю. Если же это всего лишь граф с пронумерованными (а не носящими какой-то индивидуальный характер) вершинами, то проще (и "стандартнее") пользоваться классической матрицей. Можно ли пройти по маршруту 1-3-5? Result := S[1,3] and S[3,5], и все. И наоборот, если начать запихивать в матрицу кинотеатр и гараж, да еще и не по одному разу, то головная боль начинает маячить на горизонте.
Как обычно, каждому овощу свой фрукт...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.043 c