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
);
}