Update of /cvsroot/fudaa/fudaa_devel/ctulu/src/org/fudaa/ctulu
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19092
Added Files:
CtuluGeometrie.java
Log Message:
Fonction de base : distance en 2D
--- NEW FILE: CtuluGeometrie.java ---
/*
* @file CtuluGeometrie.java
* @creation 29 janv. 2004
* @modification $Date: 2004/02/12 15:23:01 $
* @license GNU General Public License 2
* @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
* @mail de...@fu...
*/
package org.fudaa.ctulu;
/**
* @author deniger
* @version $Id: CtuluGeometrie.java,v 1.1 2004/02/12 15:23:01 deniger Exp $
*/
public class CtuluGeometrie {
private CtuluGeometrie() {}
/**
* Renvoie la distance entre le point p1(_x1,_y1) et le
* point p2(_x2,_y2)
*/
public final static double getDistance(
double _x1,
double _y1,
double _x2,
double _y2) {
return Math.sqrt((_x2 - _x1) * (_x2 - _x1) + (_y2 - _y1) * (_y2 - _y1));
}
/**
* Renvoie la norme au carre.
*/
public final static double getD2(
double _x1,
double _y1,
double _x2,
double _y2) {
return (_x2 - _x1) * (_x2 - _x1) + (_y2 - _y1) * (_y2 - _y1);
}
/**
* Renvoie la distance entre le point p(_x,_y) et
* le segment [P1,P2] P1=_segX1,_segY1.
* Tester dans ebli
*/
public final static double distanceFromSegment(
double _segX1,
double _segY1,
double _segX2,
double _segY2,
double _x,
double _y) {
if ((_segX1 == _segX2) && (_segY1 == _segY2)) {
return getDistance(_segX1, _segY1, _x, _y);
}
//P1=(_x1,_y1)
//P2=(_x2,_y2)
//X=thisPoint
//vecteur A=X-P1
//vecteur B=P2-P1
//On calcule la projection de A sur B
//le produit scalaire
double p=
(_x - _segX1) * (_segX2 - _segX1) + (_y - _segY1) * (_segY2 - _segY1);
//si le point est "en dehors" du segment ,on prend la distance X P1
if (p < 0)
return getDistance(_x, _y, _segX1, _segY1);
//le produit scalaire/norme de B
p=
p
/ ((_segX2 - _segX1) * (_segX2 - _segX1)
+ (_segY2 - _segY1) * (_segY2 - _segY1));
//si p>1 p est en dehors du segment
if (p > 1) {
return getDistance(_x, _y, _segX2, _segY2);
}
//le vecteur projete a pour coordonnees PROJ:
double projx= p * (_segX2 - _segX1);
double projy= p * (_segY2 - _segY1);
//le vecteur de norme (on reutilise le variable projx)
projx= (_x - _segX1) - projx;
projy= (_y - _segY1) - projy;
return Math.sqrt(projx * projx + projy * projy);
}
/**
* Tester dans dodico TestMaillage
*/
public final static double aireTriangle(
double _x1,
double _y1,
double _x2,
double _y2,
double _x3,
double _y3) {
double p= (_x3 - _x1) * (_x2 - _x1) + (_y3 - _y1) * (_y2 - _y1);
double d1d2= getDistance(_x1, _y1, _x2, _y2);
//le produit scalaire/norme de B
p= p / (d1d2 * d1d2);
//le vecteur projete a pour coordonnees PROJ:
double projx= p * (_x2 - _x1);
double projy= p * (_y2 - _y1);
//le vecteur de norme (on reutilise le variable projx)
projx= (_x3 - _x1) - projx;
projy= (_y3 - _y1) - projy;
return d1d2 * Math.sqrt(projx * projx + projy * projy) / 2;
}
}
|