// Last edited on 2000-08-28 21:36:04 by stolfi // Um ponto no mapa (em metros, tipicamente) // Autores : Guilherme Luiz Aguiar Pedrosa (970778) // Joao Paulo Piazza (970874) import java.lang.Math; public class Ponto { public double x, y; // CONSTRUTOR public Ponto() { } public Ponto(double x, double y) { this.x = x; this.y = y; } // FUNÇÕES GEOMÉTRICAS static final double distancia(Ponto p, Ponto q) // Retorna o valor da distancia euclidiana entre dois pontos. { double dx = p.x - q.x; double dy = p.y - q.y; return Math.sqrt(dx*dx + dy*dy); } static final void projetaEmSegmento(Ponto p, Ponto u, Ponto v) // Guarda em p o ponto do segmento u--v mais próximo a p. { double dux = p.x - u.x; double duy = p.y - u.y; double dvx = p.x - v.x; double dvy = p.y - v.y; double drx = v.x - u.x; double dry = v.y - u.y; double s, t; if ((s = + (dux*drx + duy*dry)) <= 0) { p.x = u.x; p.y = u.y; } else if ((t = - (dvx*drx + dvy*dry)) <= 0) { p.x = v.x; p.y = v.y; } else { double w = s+t; s = s/w; t = t/w; p.x = s*v.x + t*u.x; p.y = s*v.y + t*u.y; } } static final double distanciaASegmento(Ponto p, Ponto u, Ponto v) // Retorna o valor da distancia euclidiana entre o ponto p // e o segmento de reta u--v. { double dux = p.x - u.x; double duy = p.y - u.y; double dvx = p.x - v.x; double dvy = p.y - v.y; double drx = v.x - u.x; double dry = v.y - u.y; if (dux*drx + duy*dry <= 0) { return Math.sqrt(dux*dux + duy*duy); } else if (dvx*drx + dvy*dry >= 0) { return Math.sqrt(dvx*dvx + dvy*dvy); } else { double dsx = dry; double dsy = - drx; return Math.abs(dux*dsx + duy*dsy)/Math.sqrt(dsx*dsx + dsy*dsy); } } }