Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1194559339
Pacific
2007-11-09 01:02
2007.12.09
Функции


15-1194162093
Riply
2007-11-04 10:41
2007.12.09
Маленькие, разряжающие обстановку, моменты.


3-1186498316
alex_tonk
2007-08-07 18:51
2007.12.09
DBLookupComboBoxEh


4-1179846147
Alek Arbuzov
2007-05-22 19:02
2007.12.09
Как программно определить выполняемое сейчас место в коде?


2-1194370102
lobach
2007-11-06 20:28
2007.12.09
Как спрятать программу от диспетчера задач???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский