![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| User1302 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.11.2010 Репутация: нет Всего: нет |
Пытаюсь рисовать граф:
![]() на холсте. При наведении мышки на фигуру, будь то вершина графа, или ребро, нужно понять находится ли курсор над холстом или над фигурой. Это нужно, чтоб в зависимости от содержимого под курсором вызывать соответствующее контекстное меню. Если для фигуры я могу использовать Ellipse2D и его метод contains(Point2D p) для этого, то с ребром не понятно, как это сделать. Для ребра планировал сделать QuadCurve2D, но его метод contains(Point2D p) возвращает true, даже если курсор находится не над фигурой. Подскажите, как определить, находится ли мышка над кривой? Как лучше такое сделать? P.S. Линия обязательно кривая, потому, что между двумя вершинами может быть > 1 ребра. Еще там будет стрелка. Заранее благодарю! Это сообщение отредактировал(а) User1302 - 11.10.2011, 16:30 |
|||
|
||||
| Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 4 Всего: 16 |
1. Создаете вокруг курсора прямоугольник размером 3х3 - иначе в линию с нецелыми координатами Вы никогда не попадете.
2. На Вашей кривой (кстати, что это конкретно? Надеюсь, наследует Shape?) вызываете метод Shape.intersects(Rectangle2D), который уже точно вычислит, пересекается ли прямоугольник с кривой. Можете уменьшить размер прямоугольника, но тогда на кривую попасть сложнее будет. |
|||
|
||||
| User1302 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.11.2010 Репутация: нет Всего: нет |
QuadCurve2D implements Shape Спасибо Skipy, согласен, только в том и загвоздка, что QuadCurve2D.intersects работает так же, как и QuadCurve2D.contains!!! А именно, выдает true даже в том случае, если курсор - не над фигурой. Получается, фигура не ограничивается видимыми очертаниями самой кривой, а занимает область, ограниченную кривой и прямой, которая соединяет концы видимой кривой. Поэтому возвращается true, если курсор находится (прямоугольник 3х3 пересекается) в этой области! Для наглядности сделал пример, если есть возможность, Skipy, попробуйте запустить:
Можно ли как-то обойтись без Shape? Может как-то просто линии рисовать? Тогда как выделять? - непонятно... |
||||
|
|||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Можно, например, превратить кривую в набор отрезков и проверять на близость координат мыши с отрезком. Вроде такого:
|
|||
|
||||
| User1302 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.11.2010 Репутация: нет Всего: нет |
Kamre, спасибо за совет, это можно использовать!
Сейчас решил использовать JGraphX. Время, потраченное на изучение доков будет меньше, чем самому реализовывать подобное, пусть даже и значительно менее функциональное. До этого реализовал FORCE-DIRECTED LAYOUT, думал, буду сам рисовать графы и позиционировать, - получается зря время потратил. Модератор, поставьте Kamre "+" Всем спасибо! |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |