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

[Java] Positionner un point sur une droite

/**
 * Permet de recuperer un point sur une droite (origin;extremite)
 * à distance length du point origin.
 */
public static Point2d getPointOnLine(Point2d origin, Point2d extremite, double length) {
	Vector2d vec = vector(origin, extremite);
	vec.normalize();
	vec.scale(length);
	vec.add(origin);
	return new Point((int)vec.x, (int)vec.y);
}

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

[Java] Calculer les coordonnées d'un point sur un cercle en fonction du centre du cercle, du rayon et de la valeur de l'angle

/**
* Retourne les coordonnées d'un point sur un cercle.
* L'angle est exprimé en sens horaire.
*
* @param center Le centre du cercle
* @param angleDeg L'angle (en degres)
* @param radius Le rayon (en pixel)
* @return Le point après le calcule de projection.
*/
public static Point2d getCircleIntersection(Point2d center, double angleDeg, double radius) {
radius = Math.abs(radius);
double angleRad = Math.toRadians(angleDeg);

double x = (center.getX() + radius * Math.cos(angleRad));
double y = (center.getY() + radius * Math.sin(angleRad));

return new Point2d(x, y);
}

page 17 de 22