Вопрос

Я написал некоторое основное программное обеспечение для графиков в Clojure / Java, используя drawLine() На графическом контексте модифицированного jpanel. Сам построение работает красиво, но я пришел в тупик, пытаясь преобразовать щелчок пикселя в ближайшую точку данных.

У меня простая бивкация между списком всех пикселей, которые отмечают конечные точки моей строки и моими фактическими необработанными данными. Что мне нужно, это откружение от всех пикселей (скажем, 1200x600 px2) моего окна графа на пиксели в моем списке пикселей, давая мне тривиальное отображение из этого в мои фактические точки данных.

например

<x,y>(px) ----> <~x,~y>(pixel points) ----> <x,y>(data)

Это ситуация, когда я воображаю это сейчас:

  • Пиксель нажат в главном графическом окне, и Mouselistener ловит это событие и дает мне <x,y> координаты действия.

  • Эта информация передается на функцию, которая возвращает предикат, который определяет, передается ли значение к нему «достаточно хорошо», и фильтруйте, хотя список с этим PRES и принять первое значение, которое он Olize.

    • Возможно, вместо предиката он возвращает функцию, которая передается список точек пикселей и возвращает список кортежей (x index) который указывает на то, насколько хороша точка с величиной x, и где этот момент с index. Отказ Я бы сделал это как с точками X, так и очками Y. Затем я фильтрует, хотя и нашел один с Max X и возьми, чтобы быть точкой, который, скорее всего, будет одним пользователем.

Это разумные решения этой проблемы? Похоже, что решение, которое включает в себя рейтинги доверия (расстояние от PIX-PT, возможно), может быть слишком процессором тяжелым, а немного память, если я снова держу все точки в памяти. Другое решение, использующее только предикат, не похоже, что он всегда был бы точным.

Это решается Проблема, как показали другие библиотеки графиков, но трудно найти информацию об этом, кроме как в источнике некоторых из этих программ, и должны быть лучшим способом, чтобы выкопать тысячи строк Java, чтобы найти это Отказ

Я ищу лучшие решения, или только общие указатели и советы по тему, которые я предложил, если это возможно.

Это было полезно?

Решение

Так что я предполагаю что-то вроде Jfreechart. Просто не разрезал его для вашего приложения? Если вы еще не понизили эту дорогу, я бы предложил проверить это, прежде чем пытаться сбросить свой собственный.

Во всяком случае, если вы ищете ближайшую точку на мероприятие мыши, получая точку с минимальным Евклидово расстояние (Если он ниже некоторого порога) и представляют, что даст наиболее предсказуемое поведение для пользователя. Недостатком является то, что евклидое расстояние относительно медленно для больших наборов данных. Вы можете использовать трюки, такие как игнорирование квадратного корня или BSP деревьев Чтобы ускорить его немного. Но если эти оптимизации даже нужны, действительно зависит от того, с какими точками данных вы работаете. Профиль несколько наивный раствор в типичном случае, прежде чем перейти в режим оптимизации.

Другие советы

Я думаю, что ваш подход достойный. Это в основном требуется только одна итерация через ваш массив данных, немного простых математиков и никаких ассигнований на каждом шаге, поэтому должно быть очень быстро.

Вероятно, это так хорошо, как вы собираетесь получить, если вы не начнете использовать некоторую форму пространственной схемы разбиения, таких как Quadtree, что действительно имеет смысл, если ваш массив данных очень большой.

Какой-то код Clojure, который может помочь:

(defn squared-distance [x y point]
  (let [dx (- x (.x point))
        dy (- y (.y point))]
     (+ (* dx dx) (* dy dy))))

(defn closest 
  ([x y points]
    (let [v (first points)] 
      (closest x y (rest points) (squared-distance x y v) v)))
  ([x y points bestdist best]
    (if (empty? points)
      best
      (let [v (first points)
            dist (squared-distance x y v)] 
        (if (< dist bestdist)
          (recur x y (rest points) dist v)
          (recur x y (rest points) bestdist best))))))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top