Boa Tarde a todos,
Estou tentando fazer a lógica de verificar se um ponto está contido em um triangulo, mas não tenho a mínima idéia de como fazer isso!
Alguém teria alguma dica ou site que eu possa pesquisar?
Já procurei no google, mas não tive resultados
Agradeço desde já!
Abs e um feliz ano novo para todos
Edit:
Corrigi o título para o que eu realmente quero.
Mas o que vc quer testar?
Se um triângulo intercepta outro?
Se algo intercepta um ponto específico do triângulo?
Eu queria definir um triângulo, ou um vetor deles, e desenhar eles na tela…
Então vamos dizer que eu coloquei um triangulo com suas pontas nas posicoes:
p1 = [0,0]
p2 = [10,10]
p3 = [15,5]
E agora digamos que eu queira desenhar o pixel [5,5] está contido no triangulo…
Vendo agora parece que intersecção não é a palavra certa, eu quero testar se um ponto está contido no triângulo,
mas conforme for a intersecção entre dois triângulos pode me dar uma dica de como fazer isso.
Fazer essa verificação manualmente é um tanto trabalhosa. É cabível usar a classe Polygon que tem um método contains() que faz exatamente o que você precisa. Um exemplo:
// primeiro, as coordenadas X, depois as coordenadas Y e o número de pontos
System.out.println(new Polygon(new int[] { 0, 10, 15 },
new int[] { 0, 10, 5 }, 3).contains(5, 5)); // imprime true
Vc pode fazer como o marco disse, ou também usando a classe Path2D do pacote java.awt.geom (a partir do Java 6)
Segue um exemplo:
Arquivo PainelTriangulo.java
[code]/**
*
-
@author David Buzatto
*/
public class PainelTriangulo extends JPanel {
private Path2D.Float triangulo;
public PainelTriangulo() {
triangulo = new Path2D.Float();
triangulo.moveTo( 50, 100 );
triangulo.lineTo( 100, 100 );
triangulo.lineTo( 75, 50 );
triangulo.closePath();
}
@Override
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D g2d = ( Graphics2D ) g;
g2d.fill( triangulo );
}
public Path2D.Float getTriangulo() {
return triangulo;
}
}[/code]
Arquivo Frame.java
[code]/**
*
-
@author David Buzatto
*/
public class Frame extends JFrame {
private PainelTriangulo p;
private JLabel label;
public Frame() {
p = new PainelTriangulo();
label = new JLabel( "Clique no painel..." );
add( p, BorderLayout.CENTER );
add( label, BorderLayout.SOUTH );
p.setCursor( new Cursor( Cursor.CROSSHAIR_CURSOR ) );
p.addMouseListener( new PainelMouseListener() );
setSize( 300, 300 );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setVisible( true );
}
private class PainelMouseListener extends MouseAdapter {
@Override
public void mouseClicked( MouseEvent e ) {
boolean contem = p.getTriangulo().contains( e.getX(), e.getY() );
if ( contem ) {
label.setText( "Você clicou DENTRO do triângulo" );
} else {
label.setText( "Você clicou FORA do triângulo" );
}
}
}
public static void main( String[] args ) {
new Frame();
}
}[/code]
[]´s
Os pontos do seu triângulo são definidos por vetores? Se sim, é possível tirar o produto vetorial formado pelos vetores de cada par de pontos da borda do triângulo, e verificar se o ponto em questão está no interior ou não do triângulo.
Procurei um site que explica a técnica e achei. Tem até a descrição de um algoritmo melhor:
http://www.blackpawn.com/texts/pointinpoly/default.html