Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Java 2D][Stroke] lignes doubles

2 réponses
Avatar
ToOmS
Bonjour,

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

De mon c=F4t=E9, j'ai tent=E9 =E7a :
<code>
GeneralPath pl =3D this.getGeneralPath();
_g.draw(pl); // trac=E9 du contour ext=E9rieur
Pnt p =3D this.getCenter();

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

_g.draw(pl.createTransformedShape(at)); // trac=E9 du contour
int=E9rieur
</code>

Le probl=E8me =E9tant 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=E9cal=E9 par rapport au premier.

A noter =E9galement que j'ai d=E9velopp=E9 un algoritme de d=E9termination
d'enceintes, c'est-=E0-dire la construction du trac=E9 (type plan
d'architecture) d'un ensemble de segments =E9pais joints. Il pourrait
convenir, dans l'absolu, mais me semble tr=E8s lourd parce qu'il va au-
del=E0 du polygone ferm=E9 qui m'int=E9resse (cloisons non ferm=E9es,
epaisseurs diff=E9rentes, jointures en "patte d'oie"...).

Merci pour vos id=E9es, ToOmS.

2 réponses

Avatar
ToOmS
On 13 juil, 12:12, ToOmS wrote:
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).

Avatar
TestMan
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