[Java 2D][Stroke] lignes doubles

Le
ToOmS
Bonjour,

Existe-t-il, à votre connaissance, un moyen de doubler (voire tripler,
etc.) les lignes de tracé avec Java 2D ? Je sais qu'on peut régler
l'épaisseur et spécifier un motif de pointillé, mais peut-on
simplement tracer un polygone avec deux lignes d'un pixel (pour une
épaisseur de trois pixels, par exemple) ?

De mon côté, j'ai tenté ça :
<code>
GeneralPath pl = this.getGeneralPath();
_g.draw(pl); // tracé du contour extérieur
Pnt p = this.getCenter();

AffineTransform at = new AffineTransform();
at.translate(-p.xCoord, -p.yCoord);
final double s = 0.98d;
at.scale(s, s);
at.translate(p.xCoord, p.yCoord);

_g.draw(pl.createTransformedShape(at)); // tracé du contour
intérieur
</code>

Le problème étant de trouver le centre qui va bien Selon la forme
du polygone (dans mon cas, ou du GeneralPath), ce n'est pas
suffisant : le second polygone est décalé par rapport au premier.

A noter également que j'ai développé un algoritme de détermination
d'enceintes, c'est-à-dire la construction du tracé (type plan
d'architecture) d'un ensemble de segments épais joints. Il pourrait
convenir, dans l'absolu, mais me semble très lourd parce qu'il va au-
delà du polygone fermé qui m'intéresse (cloisons non fermées,
epaisseurs différentes, jointures en "patte d'oie").

Merci pour vos idées, ToOmS.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
ToOmS
Le #229638
On 13 juil, 12:12, ToOmS
Bonjour,

Existe-t-il, à votre connaissance, un moyen de doubler (voire tripler,
etc.) les lignes de tracé avec Java 2D ? Je sais qu'on peut régler
l'épaisseur et spécifier un motif de pointillé, mais peut-on
simplement tracer un polygone avec deux lignes d'un pixel (pour une
épaisseur de trois pixels, par exemple) ?

De mon côté, j'ai tenté ça :
<code>
GeneralPath pl = this.getGeneralPath();
_g.draw(pl); // tracé du contour extérieur
Pnt p = this.getCenter();

AffineTransform at = new AffineTransform();
at.translate(-p.xCoord, -p.yCoord);
final double s = 0.98d;
at.scale(s, s);
at.translate(p.xCoord, p.yCoord);

_g.draw(pl.createTransformedShape(at)); // tracé du contour
intérieur
</code>

Le problème étant de trouver le centre qui va bien... Selon la forme
du polygone (dans mon cas, ou du GeneralPath), ce n'est pas
suffisant : le second polygone est décalé par rapport au premier.

A noter également que j'ai développé un algoritme de détermination
d'enceintes, c'est-à-dire la construction du tracé (type plan
d'architecture) d'un ensemble de segments épais joints. Il pourrait
convenir, dans l'absolu, mais me semble très lourd parce qu'il va au-
delà du polygone fermé qui m'intéresse (cloisons non fermées,
epaisseurs différentes, jointures en "patte d'oie"...).

Merci pour vos idées, ToOmS.


J'ai trouvé une solution !

<code>
// couleur de tracé...
_g.setColor(this.getOutlineColor());
final BasicStroke oldStroke = (BasicStroke) _g.getStroke();
// triplement de l'épaisseur pour un "effet" double trait
BasicStroke newStroke = new BasicStroke(oldStroke.getLineWidth() *
this.getScale() * 3.0f,
oldStroke.getEndCap(),
oldStroke.getLineJoin(),
oldStroke.getMiterLimit(),
oldStroke.getDashArray(),
oldStroke.getDashPhase());
_g.setStroke(newStroke); // ... tracé en "double" épaisseur
_g.draw(_s);

_g.setStroke(oldStroke); // RAZ
_g.setColor(this.backgroundColor); // recouvrement en couleur de
fond...
_g.draw(_s); // ... tracé en épaisseur normale
</code>

L'idée, c'est de ne pas chercher à effectuer une transformation, on
écrit une première fois la forme (Shape) avec une épaisseur triple,
puis on "repasse" un liséré de la couleur du fond pour donner
l'impression de dédoublement.
Seul inconvénient : on n'a pas de transparence sur le liseré central.
Dans mon cas, c'est inutile.
Pour ceux qui ont suivi un précédent fil, l'échelle est le nombre
d'unités par pixel, lorsqu'on applique un "effet zoom" à _g
(Graphics2D) ; pour que l'affichage soit correct, on doit en tenir
compte.

=> Simple (on peut même surcharger Graphics#draw) et efficace (pas de
perte de performances dans mon cas, pour l'instant en tout cas).

TestMan
Le #229581
Bonjour,

Existe-t-il, à votre connaissance, un moyen de doubler (voire tripler,
etc.) les lignes de tracé avec Java 2D ? Je sais qu'on peut régler
l'épaisseur et spécifier un motif de pointillé, mais peut-on
simplement tracer un polygone avec deux lignes d'un pixel (pour une
épaisseur de trois pixels, par exemple) ?


Merci pour vos idées, ToOmS.



Bonjour,

Si votre but et simplement de dessiner avec des traits personalisés
(plusieurs traits, dessins, etc), vous pouvez implémenter votre propre
"Stroke" sur le modèle de ;

http://www.jhlabs.com/java/java2d/strokes/

A+
TM

Publicité
Poster une réponse
Anonyme