Bonjour,
Je t'ai crée une appli java qui a la fonction suivante:
tu traces deux points -> tu obtiens une droite.
tu traces un troisième point par lequel tu veux que
le droita perpendiculaire a la première droite passe.
L'appli te trace la droite -> magique :D
Bon concrètement tracer des droites sur un panel n'est
pas aisé puisque tu pars du principe suivant:
Une droite a pour équation y = ax + b.
Avec deux points tu peux déterminer une équation droite
en calculant d une part le coef dif a = y2-y1/x2-x1 ,
tu retrouves l ordonnée a l'origine
puisque elle passe par un des deux points que tu as tracés.
Alors la ca se corse... tu te dis que chaque point de ton panel qui vérifie
la fameuse équation fera partie de ta droite...oui mais comme les calculs
sont tjr approximatifs tu es obligés de prendre une approximation à ton tour donc au lieu d avoir y -ax- b =0 tu auras |y - ax -b| < borne
Bon ensuite, pour la perpendiculaire pas besoin de faire compliqué
tu sais que le produit des coef dif de deux droites perpendiculaires
vaut -1 donc comme tu connais le premier coef dif..c est réglé
tu connais un point par lequel ta droite va passer un petit coup d'algo
d approximation et le tour est joué.
Ah ui le plus important... le code:)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class FenetreMath extends JFrame implements ActionListener
{
PanelMath panelMath = new PanelMath();
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
JLabel jLabel1 = new JLabel("Echelle : 1 unité <-> 20 px");
public static void main (String[] args)
{
FenetreMath fenetreMath = new FenetreMath();
}
public FenetreMath()
{
Dimension taille_ecran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int hauteur_ecran = (int)taille_ecran.getHeight();
int largeur_ecran = (int)taille_ecran.getWidth();
setTitle("Un peu de math ...");
setLocation((largeur_ecran / 2) - (175), (hauteur_ecran / 2) - (200));
setSize(350, 400);
setLayout(null);
panelMath.setBounds(20, 20, 300, 300);
jLabel1.setBounds(20, 330, 200, 20);
add(panelMath);
add(jLabel1);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
JOptionPane.showMessageDialog(null, "Cliquez pour placer le premier point");
}
public void actionPerformed(ActionEvent e)
{
}
}
class PanelMath extends JPanel implements MouseListener
{
int coordXPoint1 = 0;
int coordYPoint1 = 0;
int coordXPoint2 = 0;
int coordYPoint2 = 0;
int coordXPoint3 = 0;
int coordYPoint3 = 0;
float coefDir1 = 0f;
float absOr1 = 0f;
float coefDir2 = 0f;
float absOr2 = 0f;
String eqDroite1 = "";
String eqDroite2 = "";
int etape = 0;
public PanelMath()
{
addMouseListener(this);
}
public void paint(Graphics g)
{
if (etape == 0)
{
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, 300, 300);
g.setColor(new Color(0, 0, 0));
g.drawRect(0, 0, 299, 299);
g.drawLine(20, 150, 280, 150);
g.drawLine(150, 20, 150, 280);
g.drawLine(275, 145, 280, 150);
g.drawLine(275, 155, 280, 150);
g.drawLine(145, 25, 150, 20);
g.drawLine(155, 25, 150, 20);
g.drawString("O", 140, 162);
g.drawLine(165, 145, 170, 150);
g.drawLine(165, 155, 170, 150);
g.drawLine(145, 135, 150, 130);
g.drawLine(155, 135, 150, 130);
}
if (etape == 1)
{
g.setColor(new Color(0, 0, 0));
g.drawRect(coordXPoint1 + 150, (coordYPoint1 - 150) * -1, 1, 1);
}
if (etape == 2)
{
g.setColor(new Color(0, 0, 0));
g.drawRect(coordXPoint2 + 150, (coordYPoint2 - 150) * -1, 1, 1);
}
if (etape == 3)
{
g.setColor(new Color(0, 0, 0));
for (int i = 0; i < 300; i++)
{
for (int j = 0; j < 300; j++)
{
int newJ = (j - 150) * -1;
int newI = (i - 150);
if ((newJ - (coefDir1 * newI) - (absOr1 * 20)) < 0.5f && (newJ - (coefDir1 * newI) - (absOr1 * 20)) > -0.5f)
g.drawRect(i, j, 1, 1);
}
}
}
if (etape == 4)
{
g.setColor(new Color(0, 0, 0));
g.drawRect(coordXPoint3 + 150, (coordYPoint3 - 150) * -1, 1, 1);
}
if (etape == 5)
{
g.setColor(new Color(0, 0, 0));
for (int i = 0; i < 300; i++)
{
for (int j = 0; j < 300; j++)
{
int newJ = (j - 150) * -1;
int newI = (i - 150);
if ((newJ - (coefDir2 * newI) - (absOr2 * 20)) < 0.5f && (newJ - (coefDir2 * newI) - (absOr2 * 20)) > -0.5f)
g.drawRect(i, j, 1, 1);
}
}
}
}
public String CalculEqDroite1()
{
coefDir1 = (float) ((float) (coordYPoint2 - coordYPoint1)) / ((float) (coordXPoint2 - coordXPoint1));
absOr1 = (float) ((coordYPoint1 - (coordXPoint1 * coefDir1)) / 20f);
return ("y = " + coefDir1 + "x + " + absOr1);
}
public String CalculEqDroite2()
{
coefDir2 = (float) (-1 / coefDir1);
absOr2 = (float) ((coordYPoint3 - (coordXPoint3 * coefDir2)) / 20f);
return ("y = " + coefDir2 + "x + " + absOr2);
}
public void mouseClicked(MouseEvent e)
{
String message = "";
if (etape == 0)
{
coordXPoint1 = e.getX() - 150;
coordYPoint1 = (e.getY() - 150) * -1;
message = "Cliquez pour placer le second point";
}
if (etape == 1)
{
coordXPoint2 = e.getX() - 150;
coordYPoint2 = (e.getY() - 150) * -1;
message = "Cliquez pour tracer la droite";
}
if (etape == 2)
{
eqDroite1 = CalculEqDroite1();
message = "L'équation de la première droite est " + eqDroite1 + "\nCliquez pour placer le point par lequel doit passer la perpendiculaire";
}
if (etape == 3)
{
coordXPoint3 = e.getX() - 150;
coordYPoint3 = (e.getY() - 150) * -1;
message = "Cliquez pour tracer la droite perpendiculaire";
}
if (etape == 4)
{
eqDroite2 = CalculEqDroite2();
message = "L'équation de sa perpendiculaire droite est " + eqDroite2;
}
etape++;
this.repaint();
JOptionPane.showMessageDialog(null, message);
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
}
Comme tu débutes en java :
En ligne de commande tu tappes :
javac FenetreMath.java
puis
java FenetreMath
En cas de soucis je t'aiderai
Voila bonne chance à toi.
Bonjour,
Je t'ai crée une appli java qui a la fonction suivante:
tu traces deux points -> tu obtiens une droite.
tu traces un troisième point par lequel tu veux que
le droita perpendiculaire a la première droite passe.
L'appli te trace la droite -> magique :D
Bon concrètement tracer des droites sur un panel n'est
pas aisé puisque tu pars du principe suivant:
Une droite a pour équation y = ax + b.
Avec deux points tu peux déterminer une équation droite
en calculant d une part le coef dif a = y2-y1/x2-x1 ,
tu retrouves l ordonnée a l'origine
puisque elle passe par un des deux points que tu as tracés.
Alors la ca se corse... tu te dis que chaque point de ton panel qui vérifie
la fameuse équation fera partie de ta droite...oui mais comme les calculs
sont tjr approximatifs tu es obligés de prendre une approximation à ton tour donc au lieu d avoir y -ax- b =0 tu auras |y - ax -b| < borne
Bon ensuite, pour la perpendiculaire pas besoin de faire compliqué
tu sais que le produit des coef dif de deux droites perpendiculaires
vaut -1 donc comme tu connais le premier coef dif..c est réglé
tu connais un point par lequel ta droite va passer un petit coup d'algo
d approximation et le tour est joué.
Ah ui le plus important... le code:)
Comme tu débutes en java :
En ligne de commande tu tappes :
javac FenetreMath.java
puis
java FenetreMath
En cas de soucis je t'aiderai
Voila bonne chance à toi.