7
votes

Java - Dessinez une règle (ligne avec des tiques à l'angle de 90 degrés)

J'utilise Java AWT pour dessiner des lignes sur un panneau ( line2d et graphiques2d.drawline () ) et je me demande comment je peux dessiner une ligne avec Tick ​​Marks, similaire à:

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

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

Les lignes pourraient être dans n'importe quelle position. Les tiques doivent donc être tirées à un angle relevant de la ligne elle-même.

Ma géométrie de base et la capacité de l'appliquer à Java me défaillent. :)


3 commentaires

Voulez-vous dessiner les lignes "souverain" dans les directions arbitraires? Sont les tiques à intervalles fixes ou souhaitez-vous qu'ils apparaissent, à 0%, 33%, 66%, 100%?


S'il vous plaît voir ci-dessous pour la description des graphiques en général. Les traces seront uniformément espacées d'espacement arbitraire. (IE: J'ai besoin d'une solution où je peux segmenter une ligne et dessiner un nombre arbitraire de ces tiques le long de sa longueur à chaque segment)


Faites-moi savoir ce que vous pensez de ma réponse.


3 Réponses :


12
votes

Je vous suggère

  1. Mettre en place une méthode de dessin de la règle qui dessine une simple règle horizontale de gauche à droite
  2. Fixez l'angle souhaité à l'aide de math.atan2 .
  3. Appliquez un Affinetransform < / code> avec traduction et rotation avant d'appeler la méthode de dessin de la règle.

    Voici un programme de test complet. (La méthode graphique.create est utilisée pour créer une copie de l'objet graphique d'origine, de sorte que nous ne dégageons pas la transformation originale.) xxx < p> Entrez la description de l'image ici

    note, que vous pouvez aussi facilement dessiner des numéros ci-dessus les tiques. Les appels de serrage seraient traversant la même transformation et seraient bien "inclinés" le long de la ligne.


3 commentaires

Intéressant, je crois que "affinetransform" est le mot clé que je cherchais. Google a produit ce didacticiel avec des composants très similaires: Glyphic.com/transform/Applet/1intro.html Maintenant, je dois juste comprendre comment l'appliquer à mon problème.


Vous l'appliquez en traduisant d'abord (déplacement) sur le point de départ souhaité, puis en tournant par l'angle souhaité (ATAN2 (DY, DX)). Combinez les deux transformations avec affinetransform.concaténate.


Ça a fière allure. J'ai besoin de me rendre plus familier avec la transformation.



1
votes

choses qui ont besoin de noter:

  • une ligne perpendiculaire a une pente de -1 / oldslope.
  • Afin de supporter des lignes dans n'importe quelle direction, vous devez le faire paramétry
  • Ainsi, vous avez DY et DX sur la ligne d'origine, ce qui signifie que newdx = dy; NEWDY = -1 * DX .
  • Si vous l'avez telle que est un vecteur d'unité ( sqrt (dx * dx + dy + dy) == 1 ou DX == cos (thêta); dy = péché (thêta) pour certains thêta), vous devez simplement savoir à quelle distance vous souhaitez que les marques de ticks.
  • SX, SY sont votre démarrage x et y
  • la 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 pistes (calculées ci-dessus) des lignes de croix

    Ainsi,

    1. Dessinez une ligne de (Démarrer X, Y) à
    2. Tracez un ensemble de lignes (pour (i = 0; i <= longueur; i + = intervalle) de à

1 commentaires

J'aime beaucoup cette réponse car il tente d'expliquer la géométrie. Malheureusement, j'ai du mal à m'envelopper la tête autour de lui. J'ai branché les formules que vous avez décrites et je reçois des résultats très étranges pour Newdy & Newdx. (Valeurs négatives qui tombent loin à l'extérieur de la gamme de coordonnées sur mon panel) à nouveau, ma géométrie est au mieux élémentaire, mais je me demande si la formule est pour un système de coordonnées cartésiennes. Les coordonnées de Java Placez 0,0 dans le coin supérieur gauche d'un panneau.



1
votes

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

Les anciens points sont X, Y et le nouveau sont X ', Y'. Illustrons par un exemple, disons que vous avez une ligne verticale de (0,0) à (0,1), vous souhaitez maintenant le faire pivoter de 90 degrés. (0,0) restera zéro alors voyez simplement ce qui arrive à (0,1) xxx

== xxx < p> == xxx

vous arrivez à la ligne horizontale (0,0), (0,1) comme vous l'attendez.

espérons qu'il aide,
Roni


0 commentaires