Classes VLine
, HLine
et Line
¶
Classe VLine
¶
Code
package v2.shapes;
import java.awt.Color;
public class VLine {
public static final Color defaultDrawColor = Color.BLACK;
private Point start;
private int height;
private Color drawColor;
public VLine(Point start, int height) {
this(start, height, defaultDrawColor);
}
public VLine(Point start, int height, Color drawColor) {
this.start = start;
this.height = height;
this.drawColor = drawColor;
}
public Point getStart() {
return start;
}
public void setStart(Point start) {
this.start = start;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public Color getDrawColor() {
return drawColor;
}
public void setDrawColor(Color drawColor) {
this.drawColor = drawColor;
}
public void draw(Image image) {
for (int j = 0; j < height; j++) {
new Point(start.getX(), start.getY() + j, drawColor).draw(image);
}
}
}
La classe VLine
représente une ligne verticale. Elle est conçue pour dessiner une ligne verticale d’une hauteur
spécifiée à partir d’un point donné. Voici une explication :
-
Champs :
start
: Un objetPoint
représentant le point de départ de la ligne verticale. Ce point détermine les coordonnées x et y où la ligne commence.height
: Un entier représentant la longueur verticale de la ligne.drawColor
: Un objetColor
spécifiant la couleur de la ligne. Par défaut, il est noir si aucune couleur n’est fournie.
-
Constructeurs :
VLine(Point start, int height)
: Crée unVLine
avec le point de départ et la hauteur spécifiés, en utilisant la couleur par défaut (noir).VLine(Point start, int height, Color drawColor)
: Crée unVLine
avec le point de départ, la hauteur et la couleur spécifiés.
-
Méthodes :
getStart()
: Renvoie lePoint
de départ de la ligne.setStart(Point start)
: Définit lePoint
de départ de la ligne.getHeight()
: Renvoie la hauteur de la ligne.setHeight(int height)
: Définit la hauteur de la ligne.getDrawColor()
: Renvoie la couleur de dessin de la ligne.setDrawColor(Color drawColor)
: Définit la couleur de dessin de la ligne.draw(Image image)
: Il s’agit de la méthode principale. Elle itèreheight
fois, dessinant un seulPoint
à chaque position le long de la ligne verticale. La coordonnée x reste constante (à partir du pointstart
), tandis que la coordonnée y est incrémentée à chaque itération. Chaque point est dessiné en utilisant ladrawColor
spécifiée sur l’Image
fournie.
En résumé, VLine
simplifie le dessin d’une ligne verticale en gérant l’itération et le dessin de points individuels
dans sa méthode Draw
. Elle évite les calculs redondants en dessinant point par point verticalement.
Classe HLine
¶
Code
package v2.shapes;
import java.awt.Color;
public class HLine {
public static final Color defaultDrawColor = Color.BLACK;
private Point start;
private int width;
private Color drawColor;
public HLine(Point start, int width) {
this(start, width, defaultDrawColor);
}
public HLine(Point start, int width, Color drawColor) {
this.start = start;
this.width = width;
this.drawColor = drawColor;
}
public Point getStart() {
return start;
}
public void setStart(Point start) {
this.start = start;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public Color getDrawColor() {
return drawColor;
}
public void setDrawColor(Color drawColor) {
this.drawColor = drawColor;
}
public void draw(Image image) {
for (int i = 0; i < width; i++) {
new Point(start.getX() + i, start.getY(), drawColor).draw(image);
}
}
}
La classe HLine
est très similaire à VLine
, mais elle dessine une ligne horizontale. La principale différence réside
dans la façon dont la méthode Draw
fonctionne :
HLine.draw(Image image)
: Au lieu d’incrémenter la coordonnée y comme dansVLine
,HLine
incrémente la coordonnée x. La bouclefor
parcourt lalargeur
de la ligne :
À chaque itération, un nouveau Point
est créé avec :
start.getX() + i
: La coordonnée x est incrémentée dei
à chaque étape, déplaçant le dessin horizontalement vers la droite.start.getY()
: La coordonnée y reste constante, maintenant le dessin sur la même ligne horizontale.drawColor
: La couleur spécifiée pour la ligne.
Ce Point
est ensuite dessiné sur l’Image
fournie.
En résumé, la principale différence entre HLine
et VLine
est la direction dans laquelle la ligne est dessinée.
HLine
dessine horizontalement en incrémentant x, tandis que VLine
dessine verticalement en incrémentant y. Le reste
de la structure de la classe (champs, constructeurs, getters/setters) est quasiment identique.
Classe Line
¶
Code
package v2.shapes;
import java.awt.Color;
public class Line {
public static final Color defaultDrawColor = Color.BLACK;
private Point start;
private Point end;
private Color drawColor;
public Line(Point start, Point end) {
this(start, end, defaultDrawColor);
}
public Line(Point start, Point end, Color drawColor) {
this.start = start;
this.end = end;
this.drawColor = drawColor;
}
public Point getStart() {
return start;
}
public void setStart(Point start) {
this.start = start;
}
public Point getHeight() {
return end;
}
public void setHeight(Point end) {
this.end = end;
}
public Color getDrawColor() {
return drawColor;
}
public void setDrawColor(Color drawColor) {
this.drawColor = drawColor;
}
public void draw(Image image) {
// ligne verticale, il faut éviter une division par 0
if (start.getX() == end.getX()) {
VLine vline = new VLine(start, Math.abs(end.getY() - start.getY()) + 1, drawColor);
vline.Draw(image);
return;
}
// éviter une division int/int qui entraînerait une imprécision
double slope = (end.getY() - start.getY()) / (double) (end.getX() - start.getX());
double intercept = end.getY() - slope * end.getX();
if (Math.abs(slope) < 1) {
drawCloserToHorizontal(image, start.getX(), end.getX(), slope, intercept, drawColor);
} else {
drawCloserToVertical(image, start.getY(), end.getY(), intercept, slope, drawColor);
}
}
private static void drawCloserToVertical(Image image, int startY, int endY, double intercept, double slope, Color color) {
int minY = Math.min(startY, endY);
int maxY = Math.max(startY, endY);
for (int y = minY; y <= maxY; y++) {
int x = (int) Math.round((y - intercept) / slope);
image.setPixel(x, y, color);
}
}
private static void drawCloserToHorizontal(Image image, int startX, int endX, double slope, double intercept, Color color) {
int minX = Math.min(startX, endX);
int maxX = Math.max(startX, endX);
for (int x = minX; x <= maxX; x++) {
int y = (int) Math.round(slope * x + intercept);
image.setPixel(x, y, color);
}
}
}
La classe Line
est plus générale que HLine
et VLine
, car elle peut dessiner des lignes dans n’importe quelle
direction, pas seulement horizontales ou verticales. Voici les principales différences :
-
Champs : Au lieu d’une
hauteur
ou d’unelargeur
,Line
possède deux points :start
etend
, qui définissent les extrémités de la ligne. -
Méthode
draw
plus complexe : La méthodeDraw
deLine
est nettement plus sophistiquée. Elle gère plusieurs cas :-
Lignes verticales : Si
start.getX()
est égal àend.getX()
, la ligne est verticale. Dans ce cas, la méthode crée une instance deVLine
et utilise sa méthodedraw
pour dessiner la ligne. Ceci est une optimisation pour éviter une division par zéro dans le calcul de la pente. -
Calcul de la pente et de l’ordonnée à l’origine : Si la ligne n’est pas verticale, la méthode calcule la pente (
slope
) et l’ordonnée à l’origine (intercept
) de la ligne à l’aide des coordonnées des pointsstart
etend
. Le calcul de la pente est converti endouble
pour éviter les imprécisions liées à la division d’entiers. -
Optimisation du dessin : Pour optimiser le dessin, la méthode choisit entre deux algorithmes en fonction de la pente :
- Si la valeur absolue de la pente est inférieure à 1 (ligne plus proche de l’horizontale), la méthode
drawCloserToHorizontal
est utilisée. Cette méthode itère sur les coordonnées x et calcule la coordonnée y correspondante. - Si la valeur absolue de la pente est supérieure ou égale à 1 (ligne plus proche de la verticale), la méthode
drawCloserToVertical
est utilisée. Cette méthode itère sur les coordonnées y et calcule la coordonnée x correspondante.
- Si la valeur absolue de la pente est inférieure à 1 (ligne plus proche de l’horizontale), la méthode
-
Méthodes
drawCloserToHorizontal
etdrawCloserToVertical
: Ces méthodes parcourent l’intervalle des coordonnées x ou y, respectivement, et calculent l’autre coordonnée en utilisant la pente et l’ordonnée à l’origine. La fonctionMath.round
est utilisée pour arrondir les coordonnées calculées à l’entier le plus proche. Enfin, la méthodeSetPixel
de l’objetImage
est appelée pour dessiner chaque point de la ligne.
-
En résumé, Line
est une classe plus générale et flexible pour dessiner des lignes de toutes orientations. Sa méthode
draw
utilise des optimisations et gère les cas particuliers pour garantir un dessin précis et efficace. L’utilisation
de VLine
pour les lignes verticales est un bon exemple de réutilisation de code et de gestion des cas limites.
Note
Page rédigée en partie avec l’aide d’un assistant IA, principalement à l’aide de Perplexity AI, avec le LLM Claude 3.5 Sonnet. L’IA a été utilisée pour générer des explications, des exemples et/ou des suggestions de structure. Toutes les informations ont été vérifiées, éditées et complétées par l’auteur.