Java-Tracez une règle (ligne avec des marques de tiques à un angle de 90 degrés)


J'utilise Java AWT pour dessiner des lignes sur un panneau (Line2D et Graphics2D.drawLine()) et je me demande comment je peux dessiner une ligne avec des marques de tiques, similaire à:

|----|----|----|----|----|

Je connais les positions où j'aimerais dessiner les tiques à l'avance.

Les lignes peuvent être dans n'importe quelle position, de sorte que les tiques doivent être dessinées à un angle libérateur de la ligne elle-même.

Ma géométrie de base et ma capacité à l'appliquer en Java me font défaut. :)

Author: aioobe, 2010-08-15

3 answers

Je vous suggère

  1. implémenter une règle-dessin-méthode qui dessine une règle horizontale simple de gauche à droite
  2. Déterminez l'angle souhaité en utilisant Math.atan2.
  3. Appliquer un AffineTransform avec translation et rotation avant d'invoquer la règle-dessin-méthode.

Voici un programme de test complet. (La méthode Graphics.create est utilisée pour créer une copie de l'objet graphique d'origine, afin de ne pas gâcher l'original transformer.)

import java.awt.*;

public class RulerExample {

    public static void main(String args[]) {
        JFrame f = new JFrame();
        f.add(new JComponent() {

            private final double TICK_DIST = 20;

            void drawRuler(Graphics g1, int x1, int y1, int x2, int y2) {
                Graphics2D g = (Graphics2D) g1.create();

                double dx = x2 - x1, dy = y2 - y1;
                double len = Math.sqrt(dx*dx + dy*dy);
                AffineTransform at = AffineTransform.getTranslateInstance(x1, y1);
                at.concatenate(AffineTransform.getRotateInstance(Math.atan2(dy, dx)));
                g.transform(at);

                // Draw horizontal ruler starting in (0, 0)
                g.drawLine(0, 0, (int) len, 0);
                for (double i = 0; i < len; i += TICK_DIST)
                    g.drawLine((int) i, -3, (int) i, 3);
            }

            public void paintComponent(Graphics g) {
                drawRuler(g, 10, 30, 300, 150);
                drawRuler(g, 300, 150, 100, 100);
                drawRuler(g, 100, 100, 120, 350);
                drawRuler(g, 50, 350, 350, 50);
            }
        });

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 400);
        f.setVisible(true);
    }
}

entrez la description de l'image ici

Notez que vous pouvez tout aussi bien dessiner des nombres au-dessus des tiques. Les appels de cordon passeraient par la même transformation et seraient bien "inclinés" le long de la ligne.

 13
Author: aioobe, 2015-07-14 09:29:26

Choses à noter:

  • Une ligne perpendiculaire a une pente de -1/oldslope.
  • Pour prendre en charge les lignes dans n'importe quelle direction, vous devez le faire paramétriquement
  • Ainsi, vous avez dy et dx sur la ligne d'origine, ce qui signifie que newdx=dy; newdy=-1*dx.
  • , Si vous en avez, tels que <dx, dy> est un vecteur unitaire (sqrt(dx*dx+dy+dy)==1, ou dx==cos(theta); dy=sin(theta) pour certains theta), il suffit alors de savoir à quelle distance vous voulez les marques de graduation.
  • sx, sy sont votre début x et y
  • longueur est la longueur de la ligne
  • seglength est la longueur des tirets
  • dx, dy est les pentes de la ligne d'origine
  • newdx, newdy sont les pentes (calculées ci-dessus) des lignes transversales

Ainsi,

  1. Tracer une ligne de <sx,sy> (commencer x, y)à <sx+dx*length,sy+dy*length>
  2. Tracer un ensemble de lignes (pour (i = 0; i <sx+dx*i-newdx*seglength/2,sy+dy*i-newdy*seglength/2> à <sx+dx*i+newdx*seglength/2,sy+dy*i+newdy*seglength/2>
 1
Author: zebediah49, 2010-08-15 17:51:13

J'espère que vous connaissez la multiplication matricielle. Pour faire pivoter une ligne, vous devez la multiplier par matrice de rotation. (Je ne dessine pas de matrice appropriée mais je suppose que les deux lignes ne sont pas séparées)

|x'| = |cos(an) -sin(an)| |x|

|y`| = |sin(an)  cos(an)| |y|

Les anciens points sont x,y et le nouveau est x',y'. Illustrons par un exemple, disons que vous avez une ligne verticale de (0,0) à (0,1), maintenant vous voulez la faire pivoter de 90 degrés. (0,0) restera zéro, voyons donc ce qui arrive à (0,1)

|x'| = |cos(90) -sin(90)| |0|

|y`| = |sin(90)  cos(90)| |1|

==

|1 0| |0|

|0 1| |1|

==

| 1*0 + 0*1|

| 0*0 + 1*1|

== |0|

   |1|

Vous arrivez à la ligne horizontale (0,0),(0,1) comme vous vous y attendez.

J'espère que ça aide,
Roni

 1
Author: roni, 2010-08-15 19:36:39