IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Comment paramétrer ma courbe de Bézier


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut Comment paramétrer ma courbe de Bézier
    Bonjour à tous et bonne année,

    Alors voila mon petit souci :
    Je veux faire un CubeCurve2D avec un point de départ et un point d'arrivée. Mais je voudrais que ma courbe suive la périphérie d'un cercle qui aurait pour centre un troisième point (souris par exemple). Le problème c'est que je ne sais pas comment trouver la position des 2 points "qui font la courbe".
    J'espère avoir été clair, merci de votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une CubicCurve2D prend 4 points en paramètres : les points de départ et d'arrivée et leur point de contrôle. Si tu as en entrée d'autres informations, il te faut faire une "conversion" de ces informations pour obtenir ces 4 points : ce n'est pas un problème Java, mais mathématique.

    Par ailleurs, pourquoi n'utilise-tu pas un Arc2D ? Cette classe a déjà un certain nombre de fonctions qui prennent certaines informations qui ressemblent à ce que tu cherches (setArcByCenter ou setArcByTangent).
    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.

  3. #3
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    Je comprend pas bien comment utiliser setArcByCenter();
    les tutos sont mal foutu...

    Par contre pour la question du début, oui c'est bien les maths qui me posent problème.
    Il faut bien 4 paramètres:
    - Les Points depart et arrivé, je les ai;
    - Les deux autres points je ne sait pas les calculer et c'est la que le bas blesse.

  4. #4
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    En fait c'est pas bon le setArcMachinTruc() parce-que je suis ,selon ce que je veux faire, obliger d'utiliser les deux Point2D départ et arrivé.
    Je crois pas que setArcMachinTrucBidule() marche avec ça.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pecose Voir le message
    Je comprend pas bien comment utiliser setArcByCenter();
    les tutos sont mal foutu...
    Bah, les paramètres sont
    1. x : l'abcisse du centre
    2. y : l'ordonnée du centre
    3. radius : le rayon
    4. angleStart : l'angle au départ
    5. andgleExtent : l'angle de l'arc
    6. closure : le type (Arc2D.OPEN pour un arc, Arc2D.PIE pour un secteur angulaire, Arc2D.CHORD pour la portion de disque entre l'arc et sa corde)


    Citation Envoyé par Pecose Voir le message
    Par contre pour la question du début, oui c'est bien les maths qui me posent problème.
    Bah, ici, c'est un forum Java, pas un forum de mathématiques. Mais ce ne sont pas des maths très complexes non plus : les bases de la trigonométrie et de la géométrie devraient suffire (les fameux sin-op-hyp et cos-ad-hyp par exemple (et tang-op-ad), la formule pour calculer la distance entre 2 points ((x2-x1)2 + (y2-y1)2 = d2), et la définition du cercle (la distance d'un point au centre est identique pour tous les points, et éventuellement l'équation de la droite (ax+b=y, sachant que pour la droite passant par les 2 points, a=(y2-y1)/(x2-x1))).
    Mais il va falloir être plus précis sur le cercle qui porte l'arc. Parce qu'avec 2 points donc, ça fait une infinité de solution (tous les cercles dont le centre est sur la droite et qui passe par les 2 points). A partir du moment où tu as la centre, tu peux calculer facilement les 2 angles nécessaires à la création de l'arc (cos=adj/hyp et sin=opp/hyp !)




    Citation Envoyé par Pecose Voir le message
    Il faut bien 4 paramètres:
    - Les Points depart et arrivé, je les ai;
    - Les deux autres points je ne sait pas les calculer et c'est la que le bas blesse.
    Bah ça dépend de ce que tu cherches à faire. Un cas classique est de faire un arc pour relier 2 segments tel que l'arc soit tangeant aux 2 segments à sa extrémités. C'est aussi un cas simple : les segments formés par une extrémité et son point de contrôle correspond à une extension du segment correspondant : il suffit donc de prolonger le segment et de prendre n'importe quel point. Par exemple, si on a le segment AB, le point de départ est B, et le point C contrôle de B est le point telque B est le centre du segment AC. C est un point sur une droite (dont on peut déterminer l'équation, puisqu'on a 2 points) et sur un cercle (donc on a le rayon et le centre) : 2 équations et 2 inconnues. La solution, tu verras est évidente, et on peut aussi la déterminer naîvement (la définition du milieu d'un segment !). D'ailleurs, si c'est pour le faire sur des points fixés d'avance, tu peux calculer leur position en dur comme dans l'exemple suivant (la formule générale permet de ne pas avoir à déterminer dans quel ordre passé les paramètres) :
    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
    public class DemoArc extends JPanel {
     
    	private final static Point P1 = new Point(300,150);
    	private final static Point P1B = new Point(350,250);
    	private final static Point P2 = new Point(150,100);
    	private final static Point P2B = new Point(50,150);
     
    	private final static CubicCurve2D CURVE = new CubicCurve2D.Double(P1.x, P1.y, getCtrl(P1.x,P1B.x), getCtrl(P1.y,P1B.y), getCtrl(P2.x,P2B.x), getCtrl(P2.y,P2B.y), P2.x, P2.y);
    	public DemoArc() {
    		setBackground(Color.BLACK);
    	}
     
    	private static double getCtrl(int v1, int v2) {
    		return v1 - (v2-v1);
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
     
    		g.setColor(Color.YELLOW);
    		g.drawLine(P1.x, P1.y, P1B.x, P1B.y);
    		g.setColor(Color.RED);
    		g.drawLine(P2.x, P2.y, P2B.x, P2B.y);
     
    		g.setColor(Color.WHITE);
    		((Graphics2D)g).draw(CURVE);
     
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame=new JFrame("t");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.getContentPane().add(new DemoArc());
     
    		frame.setSize(400, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    }
    Pour "jouer" sur "rayon" de la courbe (elle n'a pas vraiment de rayon puisque c'est un Bézier et non un arc de cercle, mais on comprend l'idée), il faut "déplacer" chaque point de contrôle, en faisant qu'il reste sur sa droite. Regarde par exemple ce que donne le précédent code avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private static double getCtrl(int v1, int v2) {
    		return v1 - (v2-v1)*.5;
    	}
    A la place de .5, essaye 1.5, .333,..., 2, -1,...,Math.sqrt(2)/2...
    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.

  6. #6
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    C'était pas tres clair ce que j'ai dit, donc juste pour info, si j'ai une droite qui passe pas mes deux points, alors le centre du cercle se trouve sur une droite perpendiculaire à la premières, passent par le millieu du segment «1e point, 2e point»

    Je sais pas si c'est mieux...

    Du coup j'ai besoin d'une approche informatique ( avec ou sans beziet ) parce que les maths j'y pige rien.
    Je suis pas aller a l'ecole, dsl :-)

    Je vais tester ce que tu m'as dit, mais pour être honnête j'ai pas tout compris.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pecose Voir le message
    C'était pas tres clair ce que j'ai dit, donc juste pour info, si j'ai une droite qui passe pas mes deux points, alors le centre du cercle se trouve sur une droite perpendiculaire à la premières, passent par le millieu du segment «1e point, 2e point». Le centre de mon cercle qui passe par 1e et 2e point...
    Oui, c'est une déduction évidente de ce que j'ai dit (ça se démontre d'ailleurs).
    Citation Envoyé par Pecose Voir le message
    Le centre de mon cercle qui passe par 1e et 2e point...
    ...est sur cette droite, oui. N'empêche qu'il y a une infinité de solution (une par rayon).


    Citation Envoyé par Pecose Voir le message
    Je sais pas si c'est mieux...
    ça n'apporte pas beaucoup plus d'information, à part peut-être que c'est bien un Arc2D qu'il te faut plutôt un CubicCurve2D.

    Citation Envoyé par Pecose Voir le message
    Du coup j'ai besoin de la formule mathématique pour calculer la courbe ( avec ou sans beziet ) parce que j'y pige rien.
    Je suis pas aller a l'ecole, dsl :-)
    Bah, peut-être bien, mais ici, comme je l'ai déjà dit c'est un forum Java, pas de géométrie ou de trigonométrie. Normalement, on est pas là pour résoudre des équations à ta place. Pour déterminer un arc de cercle passant par 2 points, de rayon donné, voici la méthode :
    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
    /**
             * Créé l'arc passant par les 2 points spécifiés, de rayon spécifié.
             * 
             * @param p1
             * @param p2
             * @param radius
             * @param orientation sens de l'arc (1=antihoraire/trigonométrique, -1=horaire/anti-trigonométrique)
             * @return
             */
    	public static Arc2D createArc(Point p1, Point p2, double radius, int orientation) {
    		Point2D center = createCenter(p1, p2, radius, orientation);
    		Arc2D arc = new Arc2D.Double();
    		double angSt = angle(center, p1); 
    		double angExt = angle(center, p2)-angSt;
    		System.out.println(radius+" "+angExt);
    		if( orientation>0 && angExt<0 ) {
    			angExt+=360;
    		}
    		if( orientation<0 && angExt>0 ) {
    			angExt-=360;
    		}
    		arc.setArcByCenter(center.getX(), center.getY(), radius, angSt, angExt, Arc2D.OPEN);
    		return arc;
    	}
     
    	public static Point2D createCenter(Point p1, Point p2, double radius, int orientation) {
     
    		Objects.requireNonNull(p1);
    		Objects.requireNonNull(p2);
    		if ( radius<=0 ) throw new IllegalArgumentException("Radius must be stricly positive");
     
    		if ( p1.equals(p2) ) throw new IllegalArgumentException("Points must be distinct");
    		if ( !(orientation==1 || orientation==-1) ) throw new IllegalArgumentException("Orientation must be 1 or -1");
     
    		double a = p1.x-p2.x;
    		double b = p1.y-p2.y;
    		double d = p1.distance(p2);
    		if ( d>(radius*2)) throw new IllegalArgumentException("Distance between the points is greater than diameter: "+d+">"+(radius*2));
    		d/=2;
    		double xm = (p1.x + p2.x)/2d;
    		double ym = (p1.y + p2.y)/2d;
    		double r = Math.sqrt(Math.abs(radius*radius-d*d))/Math.sqrt(a*a+b*b);
    		double xc = xm + orientation*-b*r; 
    		double yc = ym + orientation*a*r;
    		return new Point2D.Double(xc, yc);
    	}
     
    	/**
             * Calcul l'angle du rayon (center)-(point) en degrés, par ra
             * 
             * @param xc
             * @param yc
             * @param x
             * @param y
             * @return
             */
    	private static double angle(Point2D center, Point2D point) {
    		double angle = Math.atan2(point.getY()-center.getY(), point.getX()-center.getX());
    		return -Math.toDegrees(angle);
    	}
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MSChart] creation de courbe sous visual C++
    Par gabriel knight dans le forum MFC
    Réponses: 5
    Dernier message: 18/09/2006, 14h32
  2. courbe à partir d'un tableau
    Par chafcha dans le forum MFC
    Réponses: 3
    Dernier message: 26/02/2004, 08h53
  3. recherche doc sur les courbe de bézier
    Par amaury pouly dans le forum OpenGL
    Réponses: 4
    Dernier message: 29/04/2003, 22h41
  4. Courbe lissée
    Par crakdown dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/11/2002, 17h58
  5. [VB6] [MSChart] Courbe incorrecte
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 08/10/2002, 21h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo