| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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). Тогда вроде налажения линии на прямоугльник не будет. |
| Автор: 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 секунды А соединение двух контактов можно сделать так: выстраивать все элементы по сетке, соответственно вести линии тоже по сетке. А маршрут этой линии вычисляется обычным волновым алгоритмом. Тогда никаких пересечений не будет. |