Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Отрисовки математических блоков


Автор: welt 11.6.2007, 19:23
У меня есть, допустим, два (хотя их может быть больше) элемента- прямоугоьника, у каждого из них есть какое-то число контактов (окружностей)... мне нужно сделать так, чтобы щелкнув на один контакт 1-го прямоугольника и на другой контакт второго, они соединились линией...
но может получиться ситуация, когда линия пересечет прямоугольник..
можете подсказать алгоритм? (кажется метод ветвей и границ).
Это что-то наподобие соединения блоков в программе Vissim или HiAsm..
Кое что набросал в делфи. файл прикрепил.

P.S. в моей программе кнопка "Q" - включение режима рисования блоков. Для рисования надо на форме "растянуть прямоугольник" наподобие того как в винде выделяем несколько файлов.
режим "W"- режим выбора контакта. режим рисования отключен. Пока что можно выбрать контакт только у последнего нарисованного блока. 

Автор: Leos239 12.6.2007, 17:07
т.е. у прямоугольника есть  ограниченный набор окружностей?

Может тогда сделать просто: вот имеем 2 прямоугольника, у каждого набор "особых точек" (окружностей). Тогда соединяем ближайшие окружности первого и второго прямоугольника (т.е. перебираем все возможные советания n * (n - 1) / 2).
Тогда вроде налажения линии на прямоугльник не будет. smile 

Автор: welt 12.6.2007, 18:42
Leos239, 
набор особых точек - это конечно.
но в том-то и дело, что надо самому указать(мышкой), какие два контакта подлежат соединению!

Автор: Bitter 15.6.2007, 00:09
Программу не смотрел, но если блоки рисуешь на имаге, то могу предложить создать второй невидимый имаг, по типу Бэк-буфера. На нём рисуешь только контакты, но только цветом соответствующем номеру блока+номер контакта.

Например блок №1 с двумя контактами рисуется на основном имаге, а на втором рисуются его контакты с цветом Color1=10+1 и Color2=10+2.

блок №2 с тремя контактами рисуется на основном имаге, а на втором рисуются его контакты с цветом Color1=20+1, Color2=20+2 и Color2=20+3.

и т.д.

Тогда клацая мышкой, проверяешь цвет пикселя второго имага и получаешь номер элемента и номер контакта:

Номер := Цвет_пикселя div 10
Номер_контакта := Цвет_пикселя - Номер

Добавлено через 2 минуты и 54 секунды
А соединение двух контактов можно сделать так: выстраивать все элементы по сетке, соответственно вести линии тоже по сетке. А маршрут этой линии вычисляется обычным волновым алгоритмом. Тогда никаких пересечений не будет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)