Я написал несколько базовых графических программ на Clojure / Java, используя drawLine()
в графическом контексте модифицированного JPanel.Сам график работает хорошо, но я зашел в тупик, пытаясь преобразовать нажатый пиксель в ближайшую точку данных.
У меня есть простая биекция между списком всех пикселей, которые отмечают конечные точки моих линий, и моими фактическими необработанными данными.Что мне нужно, так это обрезка из всех пикселей (скажем, 1200x600 px 2 ) моего окна графика в пиксели в моем списке пикселей, что дает мне тривиальное отображение из этого в мои действительные точки данных.
например,
<x,y>(px) ----> <~x,~y>(pixel points) ----> <x,y>(data)
Это ситуация, которую я себе представляю сейчас:
В главном окне графика щелкают пиксель,и MouseListener ловит это событие и дает мне <x,y>
координаты действия.
Эта информация передается в функцию, которая возвращает предикат, который определяет, является ли значение, переданное ему, «достаточно ли хорошим», и фильтрует ли список с этим предопределением, и принимаетпервое значение, с которым все в порядке.
- Возможно, вместо предиката он возвращает функцию, которой передан список точек пикселей, и возвращает список кортежей
(x index)
, которые указывают, насколько хорошоточка с величиной x
, и где эта точка с index
.Я бы сделал это как с точками х, так и с точками у.Затем я фильтрую это и нахожу тот с максимальным x, и беру это как точку, которая, скорее всего, будет той, которую имел в виду пользователь.
Являются ли эти разумные решения этой проблемы?Кажется, что решение, которое включает в себя рейтинги достоверности (возможно, расстояние от pix-pt), может быть слишком загруженным процессором и немного загруженным, если я снова сохраню все точки в памяти.Другое решение, использующее только предикат, не всегда кажется точным.
Это проблема решена , как показали другие графические библиотеки, но трудно найти информацию о ней, кроме как в источнике некоторых из этих программ, и должна бытьлучший способ, чем копаться в тысячах строк Java, чтобы выяснить это.
Я ищу лучшие решения или просто общие советы и рекомендации по тем, которые я предлагал, если это возможно.