PontoV - Line2D

9 respostas
tabocu

Boa noite pessoal, em um link em um dos posts aqui no forum eu conheci o site PontoV e la tem um artigo interessante chamado java2D
Nesse artigo em um paragrafo vem escrito:

Olhando no “catálogo” de java http://download.oracle.com/javase/1.4.2/docs/api/java/awt/geom/Line2D.html eu nao consegui encontrar o método que me diz se uma reta faz interseção com um ponto. Alguem me da uma força nisso?

9 Respostas

tabocu

A propósito, tudo que eu achei sobre ponto pertencer a algo estava relacionado a objetos com área (retângulo, circulo, etc) utilizando o método contains da classe shape. Porem reta nao possui área

ViniGodoy

Você pode usar o ptLineDist ou a versão dela ao quadrado (mais rápida).

Um ponto intercepta uma reta quando a distância dele em relação for a ela 0.

tabocu

Qual é essa versao ao quadrado? prefiro pq estou otimizando meu código

tabocu

Esse outro método me retorna o quadrado ou a raiz da distancia?

ViniGodoy

ptLineDistSq.

Se for só ao segmento, tem a ptSegDistSq.

Dá uma olhada no javadoc, você vê as várias assinaturas possíveis lá.

Aproveitei e já corrigi o artigo no Ponto V!

Vi ali no seu quote a palavra “seguimento”.

ViniGodoy

Ei, se vc gosta de computação evolucionária, vai curtir dar uma olhada nos meus posts desse tópico:
http://www.guj.com.br/java/223911-problema-na-logica-de-um-algoritmo

ViniGodoy

O quadrado da distância.

O cálculo da distância é geralmente obtido pelo teorema de pitágoras sqrt((x1-x2)² + (y1-y2)²).

Como a função de raiz quadrada é pesada, e muitas vezes só calculamos distancias para fazer comparações relativas (se uma distância é maior que outra) ou para testar se é 0, a maior parte das APIs tem uma versão do método que faz parte do cálculo, mas deixa a raiz quadrada do final de fora. Assim, você obtém a distância ao quadrado, que já é suficiente para esse tipo de teste.

tabocu

Muito obrigado Viny, acho que se eu tivesse lido seu artigo antes eu nao teria desperdiçado tanto tempo com algorítimos gambiarra.

@Override
    public boolean contains(int x, int y) {
        if(this.line.ptLineDist(x, y) < this.brushSize/2) return true;
        else return false;
    }

To cada vez mais próximo de um botão em formato de linha

Eu trabalho num projeto pra cemig que utiliza computação evolucionária, mas é um colega meu que é responsável pelos algorítimos genéticos que é apenas uma pequena parte. Obrigado pelo link, sempre que tenho chance eu dou uma estudada em algorítimo evolucionário, espero um dia entender e saber aplicar.

Feliz ano novo!

ViniGodoy

Esse if:

if (condição é verdadeira?) return verdadeiro;
else return false;

Pode ser substituído simplesmente por:

Exemplo:

@Override
    public boolean contains(int x, int y) {
        return this.line.ptLineDist(x, y) &lt; this.brushSize/2;
    }
Criado 31 de dezembro de 2010
Ultima resposta 31 de dez. de 2010
Respostas 9
Participantes 2