Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

Développer un rapporteur en grade


Sujet :

2D Java

  1. #1
    Membre du Club
    Développer un rapporteur en grade
    Bonjour,

    j'aimerai faciliter la vie de mes collègues ainsi qu'à moi en développant un petit outil qui nous permettrez de prendre un angle en grade grâce à un rapporteur. On utilise un logiciel où nous devons prendre des angles avec un rapporteur classique qu'on doit coller à l'écran et ça devient lourd surtout que la précision n'est pas absolue donc il m'est venu l'idée de développer cet outil, la seule chose embêtante c'est que je ne sais pas en quel langage ni comment, j'ai tout de même de bonnes bases en prog et avec votre aide et une direction à prendre je saurai me débrouiller. Après quelques recherches, j'ai trouvé que c'était possible en java, confirmez-vous ?

    Ma vision de l'outil c'est une petite fenêtre avec en son centre sa droite verticale et horizontale, on viendrait positionner le centre sur l'objet qu'on veut mesurer en déplaçant la fenêtre puis on ajusterait une droite qui serait libre en restant cliqué dessus et en la positionnant pour obtenir l'angle.
    J'upload une illustration de comment je vois cet outil. (la droite grise serait celle qu'on peut déplacer pour obtenir l'angle)

    Merci par avance pour votre aide.

  2. #2
    Membre du Club
    Personne pour me mettre sur le chemin ? :'(
    J'ai fait pas mal de recherches mais pas vraiment fructueuses :s

  3. #3
    Modérateur

    Salut,

    Citation Envoyé par Castiel777 Voir le message
    Après quelques recherches, j'ai trouvé que c'était possible en java, confirmez-vous ?
    Sur le principe oui. Mais en pratique, ça dépend de plein de choses et ça met en oeuvre aussi plein de choses. Si j'ai bien compris déjà c'est que les objets dont on veut mesurer l'angle sont affiché à l'écran ? Donc çà signifie une fenêtre transparente qui se s'affiche au-dessus de la fenêtre qui affiche cet objet, avec des risques de lisibilité. Après, selon l'environnement graphique (Swing, JavaFX, autre...), ça met en oeuvre différents aspects techniques. Donc pour te donner des pistes, il faut de donner une longue litanie de classes, méthodes, paramètres... avec un minimum d'explication sans quoi c'est plutôt compliqué de les organiser en programme... sans parler des parties mathématiques (géométriques). Alors plutôt que de passer des heures à te lister tous ces points techniques, je te propose un canevas de départ... normalement, il est suffisamment simple pour ne pas nécessiter d'explication, mais n'hésite pas si tu as des questions. Il reste la partie calcul et affichage de l'angle, ça je te la laisse...

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    import java.awt.Color;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.geom.Rectangle2D;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRootPane;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
     
    public class Rapporteur extends JFrame {
     
    	private static int POINT_WIDTH = 3;
    	private static int MARGIN = 35;
    	private static int SPACING = 10;
     
    	public static void main(String[] args) {
    		new Rapporteur();
    	}
     
    	public Rapporteur() {
    		 setUndecorated(true);
    		 setTitle("Rapporteur");
    		 getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
    		 getContentPane().add(new GradePane());
             setVisible(true);
             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             setBackground(createTransparentColor(Color.BLACK, 0f));
             setSize(300,300);
             setLocationRelativeTo(null);
             setVisible(true);
    	}
     
    	private static Color createTransparentColor(Color color, float transparency) {
    		return new Color(color.getRed(), color.getGreen(), color.getBlue(), (int)(transparency*255));
    	}
     
    	private static class GradePane extends JPanel {
     
    		private Point mousePoint;
     
    		public GradePane() {
    			setBackground(createTransparentColor(Color.ORANGE,0.3f));
    			MouseAdapter mouseAdapter = new MouseAdapter() {
     
    				@Override
    				public void mouseDragged(MouseEvent e) {
    					mousePoint = null;
    					repaintWindow();
    				}
     
    				@Override
    				public void mouseMoved(MouseEvent e) {
    					mousePoint = e.getPoint();
    					repaintWindow();
    				}
     
    				@Override
    				public void mouseExited(MouseEvent e) {
    					mousePoint = null;
    					repaintWindow();
    				}
     
    			};
    			addMouseListener(mouseAdapter);
    			addMouseMotionListener(mouseAdapter);
    		}
     
    		protected void repaintWindow() {
    			SwingUtilities.getWindowAncestor(this).repaint();
    		}
     
    		@Override
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Rectangle bounds = getBounds();
     
    			g.setColor(Color.BLACK);
    			Point center = new Point((int)bounds.getCenterX(), (int)bounds.getCenterY());
     
    			g.drawLine(center.x, MARGIN, center.x, getHeight()-MARGIN);
    			int height = getHeight()/2-MARGIN;
    			for(int i=0; i<height; i+=SPACING) {
    				g.drawLine(center.x-POINT_WIDTH, center.y+i, center.x+POINT_WIDTH, center.y+i);
    				g.drawLine(center.x-POINT_WIDTH, center.y-i, center.x+POINT_WIDTH, center.y-i);
    			}
     
    			g.drawLine(MARGIN, center.y, getWidth()-MARGIN, center.y);
    			int width = getWidth()/2-MARGIN;
    			for(int i=0; i<width; i+=SPACING) {
    				g.drawLine(center.x+i, center.y-POINT_WIDTH, center.x+i, center.y+POINT_WIDTH);
    				g.drawLine(center.x-i, center.y-POINT_WIDTH, center.x-i, center.y+POINT_WIDTH);
    			}
     
    			drawString((Graphics2D)g, "400", new Rectangle(0,0,getWidth(),MARGIN-1), SwingConstants.CENTER, SwingConstants.BOTTOM);
    			drawString((Graphics2D)g, "100", new Rectangle(getWidth()-MARGIN+1,0,MARGIN-1,getHeight()), SwingConstants.LEFT, SwingConstants.CENTER);
    			drawString((Graphics2D)g, "200", new Rectangle(0,getHeight()-MARGIN-1,getWidth(),MARGIN-1), SwingConstants.CENTER, SwingConstants.TOP);
    			drawString((Graphics2D)g, "300", new Rectangle(0,0,MARGIN-1,getHeight()), SwingConstants.RIGHT, SwingConstants.CENTER);
     
    			if ( mousePoint!=null ) { 
    				// éventuellement il faudrait projeter le point sur la bordure de la fenêtre 
    				drawLine(g, center, mousePoint, getWidth(), getHeight());
    				//g.drawLine(center.x, center.y, mousePoint.x, mousePoint.y);
    			}
     
    		} 
     
    		private void drawLine(Graphics g, Point c, Point p, int width, int height) {
     
    			// y = c.y + ((p.y - c.y)/(p.x - c.x))*(x - c.x)
     
    			//  y = ((x-c.x)/(p.x-c.x)) * (p.y-c.y) + c.y;
     
    			if ( p.x==c.x ) {
     
    				int y;
    				if ( p.y<c.y ) {
    					y = 0;
    				}
    				else {
    					y = height;
    				}
     
    				g.drawLine(c.x, c.y, c.x, y);
    			}
    			else if ( p.y==c.y ) {
    				int x;
    				if ( p.x<c.x ) {
    					x = 0;
    				}
    				else {
    					x = width;
    				}
     
    				g.drawLine(c.x, c.y, x, c.y);
    			}
    			else if ( p.x> c.x ){
    				int x = width;
    				int y = ((x-c.x)/(p.x-c.x)) * (p.y-c.y) + c.y;
    				g.drawLine(c.x, c.y, x, y);
    			}
    			else  {
    				int x = 0;
    				int y = ((x-c.x)/(p.x-c.x)) * (p.y-c.y) + c.y;
    				g.drawLine(c.x, c.y, x, y);
    			}
     
    		}
     
    		private static void drawString(Graphics2D g2d, String string, Rectangle bounds, int halign, int valign) {
    			FontMetrics fontMetrics = g2d.getFontMetrics();
    			Rectangle2D textBounds = fontMetrics.getStringBounds(string, g2d);
     
    			double textWidth = textBounds.getWidth();
     
    			double x,y;
     
    			switch (halign) {
    			case SwingConstants.LEFT:
    				x = bounds.getX();
    				break;
    			case SwingConstants.RIGHT:
    				x = bounds.getX() + bounds.getWidth() - textWidth;
    				break;
    			case SwingConstants.CENTER:
    			default:
    				x = bounds.getX()
    				+ (bounds.getWidth() - textWidth) / 2;
    				break;
    			}
    			switch (valign) {
    			case SwingConstants.TOP:
    				y = bounds.getY() + fontMetrics.getAscent() - fontMetrics.getDescent();
    				break;
    			case SwingConstants.BOTTOM:
    				y = bounds.getY()
    				+ bounds.getHeight()  - fontMetrics.getDescent() ;
    				break;
    			case SwingConstants.CENTER:
    			default:
    				y = bounds.getY()
    				+ bounds.getHeight()/ 2  - ( ( fontMetrics.getAscent() + fontMetrics.getDescent() ) / 2 ) + fontMetrics.getAscent()  ;
    				break;
    			}	 
     
     
    			g2d.drawString(string, (int)x, (int)y);
    		}
     
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.