coordonnées point java

tmtc
coordonnées point java

Bonjour,

je suis novice en java, donc ne vous moquez pas de moi s'il vous-plaît?

Est ce que quelqu'un pourrait me dire comment faire pour créerune ligne perpendiculaire. Je vous explique, je veux construire une ligne perpendiculaire par rappport à une autre en entrant la ligne ce référence, le point sur la ligne qui aura la perpendiculaire et la distance entre ce point et la nouvelle ligne qui sera créée. Mon problème se situe au niveau de la gestion de l'angle droit, je ne vois pas trop comment faire.

Merci d'avance pour votre aide.

tmtc

fredericmazue

Il me semble que ton problème est plus un problème de math qu'un problème de Java, non ?

tmtc

Je sais bien comment faire pour construire une droite perpendiculaire mais pour appliquer ça en java, c'est pas évident. En effet, ça se rapporte aux formules mathématiques

tmtc

Bonjour,

alors j'ai cette fonction qui permet de calculer un angle entre deux droites

public static double angle(Point p1, Point p2, Point p3)
{

double angle1 = Math.toDegrees(Math.atan2((p2.y-p1.y),(p2.x-p1.x)));
double angle2 = Math.toDegrees(Math.atan2((p3.y-p1.y),(p3.x-p1.x)));

double angle = Math.abs(angle1-angle2);

return angle;
}

et j'aimerais avoir une fonction en fait qui à partir d'un angle donné et de deux points arrive à déterminer les coordonnées du point p3(qui est en fait le deuxième point de la droite perpendiculaire).

Merci d'avance pour votre aide

fredericmazue

Quote:
d'un angle donné

Angle de quoi avec quoi ?

Quote:
déterminer les coordonnées du point p3

Je ne comprends pas. Tu passes en argument à ta fonction le point (p3) que tu dois déterminer ?
Et puis ce que tu dis maintenant ne me semble pas être la même chose que ta toute première question.
Question que je n'ai pas comprise non plus d'ailleurs, car:
Quote:
e point sur la ligne qui aura la perpendiculaire et la distance entre ce point et la nouvelle ligne qui sera créée

La distance en question est nulle non ?

Et comme je le disais dans ma première réponse, ton problème c'est les math ou Java ? A te lire j'ai plutôt l'impression que c'est les maths.

tmtc

La fonction n'est pas celle que j'aimerais avoir. Elle me permet juste d'avoir la valeur de l'angle entre les droites (p1,p2) et (p1,p3).

Mais j'aimerais en faire une qui à partir d'un angle (celui formé par les deux droites) et des coordonnées de (p1,p2) puisse me donner les coordonnées du point p3. Afin de pouvoir obtenir la deuxième droite (qui sera la perpendiculaire à (p1,p2).

Je ne sais pas si c'est assez clair

fredericmazue

Tu vas me trouver vachement lourdingue, mais je ne comprends toujours pas:

Quote:
d'un angle (celui formé par les deux droites) coordonnées du point p3. Afin de pouvoir obtenir la deuxième droite (qui sera la perpendiculaire à (p1,p2)

Angle formé par les deux droites, donc l'angle droit ??

Pardonne moi de faire le lourdaud, mais vraiment je ne comprends pas et je me dis que je ne suis peut être pas le seul, puisque personne ne t'a encore aidé. C'est pour ça que j'essaie de te faire préciser le problème.

Et surtout encore une fois, en quoi est-ce un problème de Java ? Il me semble que c'est un problème de math, dans lequel tu dois mettre en équation un produit scalaire, sachant que si les droites sont perpendiculaires, le produits scalaire est nul.
Enfin si je me rappelle bien ce qu'on a essayé de m'apprendre le peu que je suis allé à l'école :D

tmtc

Tout ce qui est mathématique, je l'ai compris mais je ne sait pas comment faire pour écrire ma fonction en java.

Et oui, il s'agit bien de l'angle droit.

Niroken
Une aide:)

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.

tmtc

merci beaucoup niroken,

je vais regarder ton code et en cas de souci, je te tiendrais informé.

tmtc

tmtc

juste une petite question, si je veux qu'àprès le clic du troisièe point, la perpendiculaire construite s'arrête sur la première droite, que dois-je faire?

J'ai essayé de tracer un quatrième point dont les coordonnées correspondent à:


  coordXPoint4=(int) ((absOr1-absOr2)/(coefDir2-coefDir1));
    coordYPoint4 = (int) ((coefDir1* coordXPoint4) + absOr1);

et ensuite, je veux tracer une droite entre le troisième point et le quatrième mais il semblerait que les coordonnées du quatrième point ne sont pas exactes car le point ne se trouve pas sur la première droite.

Est ce que quelqu'un saurait à quel niveau je me suis trompé?

Merci

tmtc

Niroken

Si tu veux que la droite perpendiculaire s'arrête au niveau
de la droite initiale, il faut que les point que tu vas dessiner
vérifie les deux conditions suivantes :

-Qu' ils vérifient l'équation de la droite perpendiculaire.
-Qu'ils appartiennent au demi plan inférieur ou supérieur
en fonction de l'endroit ou tu as placé ton point.
Ce qui mathématiquement veut dire :
y < ax + b s'il est en dessous
ou
y > ax + b s'il est au desssus.

Bonne chance

tmtc

je pensais qu'en faisant juste l'équivalence entre les deux équations de droite, je pourrais avoir les coordonnées du point.

y= a1x+b1 (équation de la droite de référence)
y=a2x+b2 'équation de la croite à tracer)

a2x+b2=a1x+b1
x=(b1-b2) /(a2-a1)

et je remplace la valeur du x obtenu dans l'une des deux équations pour avoir y.

Donc, cette méthode n'est pas bonne?

le troisième point c'est grâce à lui qu'on a l'équation de la perpendiculaire mais pour le quatrième point (celui qui correspond à l'intersection des deux droites), l'utilisateur ne doit pas sélectionner de point, il doit être créé automatiquement.

à quoi vont servir les deux conditions:
-pour la première vu que l'utilisateur ne dessine qu'un seul point, qui forcément vérifie l'équation de la droite vu que c'est à partir de ce point qu'on calcule l'équation.
-pour la dernière , j'ai pas trop compris