Pergunta

Eu tenho escrito alguns básicas de representação gráfica de software em Clojure/Java utilizando drawLine() sobre os gráficos contexto de uma modificação do JPanel.O desenho em si está funcionando muito bem, mas eu cheguei a um impasse ao tentar converter um pixel clicado para o próximo ponto de dados.

Eu tenho um simples bijection entre a lista de todos os pixels que marca o fim de minhas linhas e minha dados actuais.O que eu preciso é de um surjection de todos os pixels (digamos, 1200x600 px2 do meu gráfico de janela para os pixels na minha lista de pixéis, me dando um trivial mapeamento do que a minha real de pontos de dados.

exemplo:

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

Esta é a situação que eu estou imaginando agora:

  • Um pixel é clicado na janela principal do gráfico, e o MouseListener capturas que o evento e me dá a <x,y> coordenadas da ação.

  • Que informações são passadas para uma função que retorna um predicado que determina se ou não um valor passado para ele é "bom o suficiente", e de filtro, embora a lista com o que pred e dê o primeiro valor é okays.

    • Possivelmente, em vez de um predicado, ele retorna uma função que é aprovada a lista de pixel-pontos e retorna uma lista de tuplas (x index) que indicam como o bom, o ponto é com a magnitude do x, e onde que ponto é com index.Eu gostaria de fazer isso com o x e o y pontos.Eu, então, filtro embora e encontrar aquele com o max x, e tomará que seja o ponto de que é mais provável de ser o que o usuário deve.

São essas soluções razoáveis para este problema?Parece que a solução que envolve confiança classificações (distância da pix-pt, talvez) pode ser muito processador pesado, e um pouco de memória pesado, se eu estou segurando todos os pontos de memória novamente.A outra solução, usando apenas o predicado, não, parece que ele ia ser preciso.

Este é um resolvido problema, como em outros gráficos bibliotecas têm demonstrado, mas é difícil encontrar informações sobre o mesmo, que na origem de alguns desses programas, e tem que haver uma maneira melhor, em seguida, para cavar através de milhares de linhas de Java para descobrir isso.

Eu estou procurando as melhores soluções, ou simplesmente geral ponteiros e conselhos sobre o que eu tenho oferecido, se possível.

Foi útil?

Solução

Então, eu estou supondo algo como JFreeChart apenas não cortá-lo para o seu aplicativo?Se você ainda não passou por esse caminho, no entanto, eu sugiro o check-out antes de tentar reverter seu próprio.

De qualquer maneira, se você estiver olhando para o ponto mais próximo de um evento de mouse, chegando a ponto de, com o mínimo de Euclidiana distância (se estiver abaixo do limite) e apresentar que irá dar mais previsível de comportamento para o usuário.A desvantagem é que a distância Euclidiana é relativamente lento para grandes conjuntos de dados.Você pode usar truques como ignorar a raiz quadrada ou Árvores BSP para acelerar um pouco.Mas se essas otimizações são mesmo necessárias, realmente depende de quantos pontos de dados que você está trabalhando.Perfil um tanto ingênua solução em um caso típico antes de entrar no modo de otimização.

Outras dicas

Eu acho que a sua abordagem é decente.Basicamente, isso requer apenas uma iteração através de sua matriz de dados, um pouco de matemática simples e não alocações em cada passo, por isso deve ser muito rápido.

É tão bom como você está indo para obter a menos que você começar a usar algum tipo de esquema de particionamento espacial como uma quadtree, o que realmente faz sentido se a sua matriz de dados é muito grande.

Alguns Clojure código que pode ajudar:

(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))))))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top