Tracer un arc

mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Comment puis je dessiner un arc entre deux points (x1,y1) et (x2,y2)??

Merci d'avance .

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Hummm...

Entre deux points tu peux tracer une droite, ou un segment.
Mais des cercles qui passent par ces points tu en as une infinité !
La méthode drawArc de Java prends 6 paramètres :
void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)

Remarque :
x et y ne sont pas les coordonnées du centre
si width != height, ce n'est plus un arc de cercle
La confiance n'exclut pas le contrôle
1
mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup KX!
0
mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
pouvez vous me donner exemple de paramètres pour tracer l'arc rouge supérieur ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai envie de dire : Google ! Ce ne sont pas les exemples qui manquent...

Et même avec des paramètres au hasard tu arriveras toujours à tracer un arc...
0
mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Avec des paramètres au hasard je dessine n'importe quel arc , mais si je spécifie les deux points , je pense que je doit toujours calculer le centre du cercle afin de trouver le paramètre StartAngle ...
Merci pour votre réponse.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Je rappelle la signature de drawArc :
void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)

Que ce soit un cercle (width = height) ou non, le centre est x+width/2, y+height/2
Puisque que x,y est le coin en haut à gauche du carré où s'inscrit le cercle.

Exemple :

JFrame frame = new JFrame();
frame.setContentPane(new Container() {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.RED);
        g.drawRect(0, 0, 800, 800);
        g.drawArc(0, 0, 800, 800, 0, 360);
        g.setColor(Color.GREEN);
        for (int i = 0; i <= 360; i++)
            g.drawArc(400 - i, 400 - i, 2 * i, 2 * i, 0, i);
        g.setColor(Color.BLUE);
        g.drawRect(360, 460, 180, 180);
        for (int i = 0; i <= 90; i++)
            g.drawArc(450 - i, 550 - i, 2 * i, 2 * i, 4*i, 180);
    }
});

frame.setSize(817, 839);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

À remarquer :
  • L'arc de 360° en rouge forme un cercle (normal), il est inscrit dans le carré rouge puisqu'ils ont le même coin supérieur (0,0) et la même taille (800,800).
  • Les arcs en vert ont tous la même origine (startAngle=0) mais ont un arcAngle de plus en plus grand (égal au rayon du cercle), jusqu'à faire un cercle complet.
  • Les arcs en bleu ont tous le même arcAngle de 180° (ce sont des demis-cercles), mais le startAngle est de plus en plus grand.

Quant à ton problème de vouloir faire passer un arc par deux points, il faut revenir à ma première intervention, tu en as une infinité !
Il te faut un cinquième paramètre pour pouvoir déterminer un unique arc.
Par exemple tu peux considérer la distance de l'arc par rapport au milieu de tes deux points, que j'appelle h pour hauteur.
Remarque : sur les 6 paramètres demandés par Java on a réussi à revenir à 5, c'est parce que je considère que width=height pour avoir des arcs de cercle.

Mais convenons en, ce n'est plus un problème de programmation Java... mais uniquement un problème de mathématiques !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Pour m'amuser j'ai fait le code chez moi, alors je te le donne.

Il y a des commentaires pour expliquer les calculs, je ne les détaillerais pas davantage (on n'est pas sur un forum de maths) mais pour comprendre voici un schéma qui fait apparaître les différentes variables intermédiaires que j'utilise dans le code.


/**
 * @return x, solution of (a+bx)²+(c+dx)²=e²
 */
private static double resolve(double a, double b, double c, double d, double e) {
    // http://www.wolframalpha.com/input/?t=crmtb01&i=(a%2Bb*x)%C2%B2%2B(c%2Bd*x)%C2%B2%3De%C2%B2
    return (-Math.sqrt(2*a*b*c*d - a*a*d*d - b*b*c*c + b*b*e*e + d*d*e*e) - (a*b+c*d)) / (b*b+d*d);
}

public static void main(String[] args) {

    // Parameters
    //------------
    
    double x1 = 300, y1 = 100;
    double x2 = 700, y2 = 300;
    double h = 100; // >0 and <=p
    
    // Computation
    //------------
    
    double x3 = (x1+x2)/2, y3 = (y1+y2)/2; // (x3,y3) middle of (x1,y1) and (x2,y2)
    double p = Math.hypot(x3-x1,y3-y1); // distance between (x1,y1) and (x3,y3) solve (x3-x1)²+(y3-y1)²=p²
    double r = (p*p+h*h)/(2*h); // on right triangle, solve p²+(r-h)²=r²
    
    double a = (y1-y2) / (x1-x2), b = (x1*y2 - x2*y1) / (x1-x2); // y=ax+b for (x1,y1) and (x2,y2)
    double c = -1/a, d = y3-c*x3; // line y=cx+d is perpendicular with line y=ax+b
    
    // y0=c.x0+d so distance between (x0,y0) and (x3,y3) solve (x3-x0)²+(y3-(c.x0+d))² = (r-h)²
    double x0 = resolve(x3, -1, y3-d, -c, r-h), y0 = c*x0+d;
    
    double alpha1 = Math.atan2(y1-y0,x1-x0), alpha2 = Math.atan2(y2-y0,x2-x0);
    
    // Display
    //------------
    
    int x = (int) Math.round(x0 - r), y = (int) Math.round(y0 - r), width = (int) Math.round(2*r), height = width;
    // angles are negative because Swing origin is on top-left corner with descending ordinates
    int startAngle = (int) -Math.round(Math.toDegrees(alpha1)), arcAngle = (int) -Math.round(Math.toDegrees(alpha2 - alpha1));
    
    JFrame frame = new JFrame();
    frame.setContentPane(new Container() {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(Color.GRAY);
            g.drawRect(x, y, width, height);
            g.setColor(Color.MAGENTA);
            g.drawArc(x, y, width, height, startAngle, arcAngle);
            g.setColor(Color.BLUE);
            g.drawLine((int) x1, (int) y1, (int) x2, (int) y2);
            g.drawLine((int) x0, (int) y0, (int) x3, (int) y3);
        }
    });

    frame.setSize(817, 839);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

Remarque : je ne gère pas certains cas particulier qui peuvent conduire à obtenir des valeurs NaN (à cause de divisions par 0 ou de l'arc-tangente)
1
Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 344
 
Bonjour,


Avec un compas... mais c'est hors sujet ici. C'est pour quand ?
0
mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Non , C'est pour dessiner un graphe en java ,

J'ai essayé avec drawarc mais il faut connaitre le centre du cercle , je veux chercher une méthodes plus simple pour tracer l'arc entre deux points quelconques !!
0
Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 344 > mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Si je me souviens bien de mes lointaines maths, avoir 2 points d'un cercle tu dois trouver le centre, non ? Je me trompe peut-être...
0
mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Oui justement , Pour utiliser la méthode drawarc il faut connaitre le centre du cercle , afin de trouver l'angle de départ !
0
Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 344 > mimi_info Messages postés 55 Date d'inscription   Statut Membre Dernière intervention  
 
Oui, justement... ;) Il me semble, disais-je, que si tu connais deux points, tu peux calculer la position du centre.
0