Articles

[Java] Calculer les coordonnées et les points d'intersection d'un cercle inscrit à un angle formé par trois points.

fonction_getCircleInscrit.jpg Soit un angle ^ABC formé par les points A, B et C. Il est possible d'inscrire le cercle de centre C dans l'angle, avec V1 et V2 respectivement sur [AB] et [BC]. Cette méthode retourne un tableau de trois points, qui sont respectivement V1, V2 et C.


       /**
*
* Retourne un tableau de Point2d :
* indice 0 = point d'intersection entre BA et le cercle
* indice 1 = point d'intersection entre BC et le cercle
* indice 2 = point au centre du cercle
*/
public static Point2d[] getCircleInscrit(Point2d a, Point2d b, Point2d c,
double radius) {

// Soit O le centre du cercle inscrit
Point2d O = null;

// On calcule la valeur de l'angle ABC, et on le divise par deux
// pour trouver l'angle ABO
double alpha = getAngleRad(a, b, c) / 2;

// On cherche la distance sur BA et BC qui nous donne la position
// des points d'intersection entre les droites et le cercle
// po1 sur BA
// po2 sur BC
double bx = radius / Math.tan(alpha);

Point2d po1 = getPointOnLine(b, a, bx);
Point2d po2 = getPointOnLine(b, c, bx);

// On cherche la bissectrice de l'angle ABC
// Cette methode retourne un des points de cette bissectrice BX
Point2d X = getBissectricePoint(a, b, c);

// On calcule la longeur du sergment BO
double bo = Math.sqrt(bx*bx + radius*radius);

// On fabrique le vecteur BX
Vector2d vec = vector(b, X);
// On normalise le vecteur (recuperation du vecteur unitaire)
vec.normalize();
// On redimensionne le vecteur
vec.scale(bo);
// On replace le vecteur sur B
vec.add(b);

//O = getPointOnLine(b, O, bo);
O = new Point2d(vec.x, vec.y);

return new Point2d[] {
po1,
po2,
O
};

}

public static Vector2d vector(Point2d a, Point2d b) {
return new Vector2d(
b.x-a.x,
b.y-a.y
);
}

[Java] Calculer la valeur de l'angle formé par deux points donnés et l'axe des abscisse (3 oclock)

/**
 * Retourne la valeur de l'angle en degrés formé entre a et b par rapport
 * à l'axe des abscisse
 */
public static double getAngleDegTrigo(Point2d origin, Point2d extremite) {
	if (origin.equals(extremite)) return 0;
	if (origin.x == extremite.x) {
		return (origin.y > extremite.y) ? 90 : 270;
	}
	else if (origin.y == extremite.y) {
		return (origin.x > extremite.x) ? 180 : 0;
	}
	else {
		Point p = new Point((int)origin.x+20, (int)origin.y);
		
		double alpha = getAngleRad(extremite, origin, p);
		
		if (extremite.x > origin.x && extremite.y > origin.y) {
			return Math.toDegrees(2 * Math.PI - alpha);
		}
		else if (extremite.x > origin.x && extremite.y < origin.y) {
			return Math.toDegrees(alpha);
		}
		else if (extremite.x < origin.x && extremite.y < origin.y) {
			return Math.toDegrees(alpha);
		}
		else if (extremite.x < origin.x && extremite.y > origin.y) {
			return Math.toDegrees(2 * Math.PI - alpha);
		}
		
		return -1;
		
	}
}

Require: getAngleRad

page 16 de 22